unified_test.go 7.5 KB

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