unified_test.go 7.7 KB

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