unified_test.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. //go:build !integration
  2. // +build !integration
  3. package download
  4. import (
  5. "context"
  6. "io"
  7. "net/http"
  8. "os"
  9. "path/filepath"
  10. "strings"
  11. "testing"
  12. "github.com/stretchr/testify/assert"
  13. "gopkg.in/h2non/gock.v1"
  14. "github.com/Jguer/aur"
  15. mockaur "github.com/Jguer/yay/v12/pkg/dep/mock"
  16. "github.com/Jguer/yay/v12/pkg/settings/exe"
  17. "github.com/Jguer/yay/v12/pkg/settings/parser"
  18. "github.com/Jguer/yay/v12/pkg/text"
  19. )
  20. func newTestLogger() *text.Logger {
  21. return text.NewLogger(io.Discard, io.Discard, strings.NewReader(""), true, "test")
  22. }
  23. // GIVEN 2 aur packages and 1 in repo
  24. // GIVEN package in repo is already present
  25. // WHEN defining package db as a target
  26. // THEN all should be found and cloned, except the repo one
  27. func TestPKGBUILDReposDefinedDBPull(t *testing.T) {
  28. t.Parallel()
  29. dir := t.TempDir()
  30. mockClient := &mockaur.MockAUR{
  31. GetFn: func(ctx context.Context, query *aur.Query) ([]aur.Pkg, error) {
  32. return []aur.Pkg{{}}, nil // fakes a package found for all
  33. },
  34. }
  35. testLogger := text.NewLogger(os.Stdout, os.Stderr, strings.NewReader(""), true, "test")
  36. os.MkdirAll(filepath.Join(dir, "yay", ".git"), 0o777)
  37. targets := []string{"core/yay", "yay-bin", "yay-git"}
  38. cmdRunner := &testRunner{}
  39. cmdBuilder := &testGitBuilder{
  40. index: 0,
  41. test: t,
  42. parentBuilder: &exe.CmdBuilder{
  43. Runner: cmdRunner,
  44. GitBin: "/usr/local/bin/git",
  45. GitFlags: []string{},
  46. Log: testLogger,
  47. },
  48. }
  49. searcher := &testDBSearcher{
  50. absPackagesDB: map[string]string{"yay": "core"},
  51. }
  52. cloned, err := PKGBUILDRepos(context.Background(), searcher, mockClient,
  53. cmdBuilder, newTestLogger(),
  54. targets, parser.ModeAny, "https://aur.archlinux.org", dir, false)
  55. assert.NoError(t, err)
  56. assert.EqualValues(t, map[string]bool{"core/yay": false, "yay-bin": true, "yay-git": true}, cloned)
  57. }
  58. // GIVEN 2 aur packages and 1 in repo
  59. // WHEN defining package db as a target
  60. // THEN all should be found and cloned
  61. func TestPKGBUILDReposDefinedDBClone(t *testing.T) {
  62. t.Parallel()
  63. dir := t.TempDir()
  64. mockClient := &mockaur.MockAUR{
  65. GetFn: func(ctx context.Context, query *aur.Query) ([]aur.Pkg, error) {
  66. return []aur.Pkg{{}}, nil // fakes a package found for all
  67. },
  68. }
  69. targets := []string{"core/yay", "yay-bin", "yay-git"}
  70. cmdRunner := &testRunner{}
  71. cmdBuilder := &testGitBuilder{
  72. index: 0,
  73. test: t,
  74. parentBuilder: &exe.CmdBuilder{
  75. Runner: cmdRunner,
  76. GitBin: "/usr/local/bin/git",
  77. GitFlags: []string{},
  78. },
  79. }
  80. searcher := &testDBSearcher{
  81. absPackagesDB: map[string]string{"yay": "core"},
  82. }
  83. cloned, err := PKGBUILDRepos(context.Background(), searcher, mockClient,
  84. cmdBuilder, newTestLogger(),
  85. targets, parser.ModeAny, "https://aur.archlinux.org", dir, false)
  86. assert.NoError(t, err)
  87. assert.EqualValues(t, map[string]bool{"core/yay": true, "yay-bin": true, "yay-git": true}, cloned)
  88. }
  89. // GIVEN 2 aur packages and 1 in repo
  90. // WHEN defining as non specified targets
  91. // THEN all should be found and cloned
  92. func TestPKGBUILDReposClone(t *testing.T) {
  93. t.Parallel()
  94. dir := t.TempDir()
  95. mockClient := &mockaur.MockAUR{
  96. GetFn: func(ctx context.Context, query *aur.Query) ([]aur.Pkg, error) {
  97. return []aur.Pkg{{}}, nil // fakes a package found for all
  98. },
  99. }
  100. targets := []string{"yay", "yay-bin", "yay-git"}
  101. cmdRunner := &testRunner{}
  102. cmdBuilder := &testGitBuilder{
  103. index: 0,
  104. test: t,
  105. parentBuilder: &exe.CmdBuilder{
  106. Runner: cmdRunner,
  107. GitBin: "/usr/local/bin/git",
  108. GitFlags: []string{},
  109. },
  110. }
  111. searcher := &testDBSearcher{
  112. absPackagesDB: map[string]string{"yay": "core"},
  113. }
  114. cloned, err := PKGBUILDRepos(context.Background(), searcher, mockClient,
  115. cmdBuilder, newTestLogger(),
  116. targets, parser.ModeAny, "https://aur.archlinux.org", dir, false)
  117. assert.NoError(t, err)
  118. assert.EqualValues(t, map[string]bool{"yay": true, "yay-bin": true, "yay-git": true}, cloned)
  119. }
  120. // GIVEN 2 aur packages and 1 in repo but wrong db
  121. // WHEN defining as non specified targets
  122. // THEN all aur be found and cloned
  123. func TestPKGBUILDReposNotFound(t *testing.T) {
  124. t.Parallel()
  125. dir := t.TempDir()
  126. mockClient := &mockaur.MockAUR{
  127. GetFn: func(ctx context.Context, query *aur.Query) ([]aur.Pkg, error) {
  128. return []aur.Pkg{{}}, nil // fakes a package found for all
  129. },
  130. }
  131. targets := []string{"extra/yay", "yay-bin", "yay-git"}
  132. cmdRunner := &testRunner{}
  133. cmdBuilder := &testGitBuilder{
  134. index: 0,
  135. test: t,
  136. parentBuilder: &exe.CmdBuilder{
  137. Runner: cmdRunner,
  138. GitBin: "/usr/local/bin/git",
  139. GitFlags: []string{},
  140. },
  141. }
  142. searcher := &testDBSearcher{
  143. absPackagesDB: map[string]string{"yay": "core"},
  144. }
  145. cloned, err := PKGBUILDRepos(context.Background(), searcher, mockClient,
  146. cmdBuilder, newTestLogger(),
  147. targets, parser.ModeAny, "https://aur.archlinux.org", dir, false)
  148. assert.NoError(t, err)
  149. assert.EqualValues(t, map[string]bool{"yay-bin": true, "yay-git": true}, cloned)
  150. }
  151. // GIVEN 2 aur packages and 1 in repo
  152. // WHEN defining as non specified targets in repo mode
  153. // THEN only repo should be cloned
  154. func TestPKGBUILDReposRepoMode(t *testing.T) {
  155. t.Parallel()
  156. dir := t.TempDir()
  157. mockClient := &mockaur.MockAUR{
  158. GetFn: func(ctx context.Context, query *aur.Query) ([]aur.Pkg, error) {
  159. return []aur.Pkg{}, nil // fakes a package found for all
  160. },
  161. }
  162. targets := []string{"yay", "yay-bin", "yay-git"}
  163. cmdRunner := &testRunner{}
  164. cmdBuilder := &testGitBuilder{
  165. index: 0,
  166. test: t,
  167. parentBuilder: &exe.CmdBuilder{
  168. Runner: cmdRunner,
  169. GitBin: "/usr/local/bin/git",
  170. GitFlags: []string{},
  171. },
  172. }
  173. searcher := &testDBSearcher{
  174. absPackagesDB: map[string]string{"yay": "core"},
  175. }
  176. cloned, err := PKGBUILDRepos(context.Background(), searcher, mockClient,
  177. cmdBuilder, newTestLogger(),
  178. targets, parser.ModeRepo, "https://aur.archlinux.org", dir, false)
  179. assert.NoError(t, err)
  180. assert.EqualValues(t, map[string]bool{"yay": true}, cloned)
  181. }
  182. // GIVEN 2 aur packages and 1 in repo
  183. // WHEN defining as specified targets
  184. // THEN all aur be found and cloned
  185. func TestPKGBUILDFull(t *testing.T) {
  186. t.Parallel()
  187. mockClient := &mockaur.MockAUR{
  188. GetFn: func(ctx context.Context, query *aur.Query) ([]aur.Pkg, error) {
  189. return []aur.Pkg{{}}, nil
  190. },
  191. }
  192. gock.New("https://aur.archlinux.org").
  193. Get("/cgit/aur.git/plain/PKGBUILD").MatchParam("h", "yay-git").
  194. Reply(200).
  195. BodyString("example_yay-git")
  196. gock.New("https://aur.archlinux.org").
  197. Get("/cgit/aur.git/plain/PKGBUILD").MatchParam("h", "yay-bin").
  198. Reply(200).
  199. BodyString("example_yay-bin")
  200. gock.New("https://gitlab.archlinux.org/").
  201. Get("archlinux/packaging/packages/yay/-/raw/main/PKGBUILD").
  202. Reply(200).
  203. BodyString("example_yay")
  204. defer gock.Off()
  205. targets := []string{"core/yay", "aur/yay-bin", "yay-git"}
  206. searcher := &testDBSearcher{
  207. absPackagesDB: map[string]string{"yay": "core"},
  208. }
  209. fetched, err := PKGBUILDs(searcher, mockClient, &http.Client{}, newTestLogger(),
  210. targets, "https://aur.archlinux.org", parser.ModeAny)
  211. assert.NoError(t, err)
  212. assert.EqualValues(t, map[string][]byte{
  213. "core/yay": []byte("example_yay"),
  214. "aur/yay-bin": []byte("example_yay-bin"),
  215. "yay-git": []byte("example_yay-git"),
  216. }, fetched)
  217. }
  218. // GIVEN 2 aur packages and 1 in repo
  219. // WHEN aur packages are not found
  220. // only repo should be cloned
  221. func TestPKGBUILDReposMissingAUR(t *testing.T) {
  222. t.Parallel()
  223. dir := t.TempDir()
  224. mockClient := &mockaur.MockAUR{
  225. GetFn: func(ctx context.Context, query *aur.Query) ([]aur.Pkg, error) {
  226. return []aur.Pkg{}, nil // fakes a package found for all
  227. },
  228. }
  229. targets := []string{"core/yay", "aur/yay-bin", "aur/yay-git"}
  230. cmdRunner := &testRunner{}
  231. cmdBuilder := &testGitBuilder{
  232. index: 0,
  233. test: t,
  234. parentBuilder: &exe.CmdBuilder{
  235. Runner: cmdRunner,
  236. GitBin: "/usr/local/bin/git",
  237. GitFlags: []string{},
  238. },
  239. }
  240. searcher := &testDBSearcher{
  241. absPackagesDB: map[string]string{"yay": "core"},
  242. }
  243. cloned, err := PKGBUILDRepos(context.Background(), searcher, mockClient,
  244. cmdBuilder, newTestLogger(),
  245. targets, parser.ModeAny, "https://aur.archlinux.org", dir, false)
  246. assert.NoError(t, err)
  247. assert.EqualValues(t, map[string]bool{"core/yay": true}, cloned)
  248. }