abs_test.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. //go:build !integration
  2. // +build !integration
  3. package download
  4. import (
  5. "context"
  6. "fmt"
  7. "os"
  8. "os/exec"
  9. "path/filepath"
  10. "testing"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/Jguer/yay/v12/pkg/settings/exe"
  13. )
  14. const gitExtrasPKGBUILD = `pkgname=git-extras
  15. pkgver=6.1.0
  16. pkgrel=1
  17. pkgdesc="GIT utilities -- repo summary, commit counting, repl, changelog population and more"
  18. arch=('any')
  19. url="https://github.com/tj/${pkgname}"
  20. license=('MIT')
  21. depends=('git')
  22. source=("${pkgname}-${pkgver}.tar.gz::${url}/archive/${pkgver}.tar.gz")
  23. sha256sums=('7be0b15ee803d76d2c2e8036f5d9db6677f2232bb8d2c4976691ff7ae026a22f')
  24. b2sums=('3450edecb3116e19ffcf918b118aee04f025c06d812e29e8701f35a3c466b13d2578d41c8e1ee93327743d0019bf98bb3f397189e19435f89e3a259ff1b82747')
  25. package() {
  26. cd "${srcdir}/${pkgname}-${pkgver}"
  27. # avoid annoying interactive prompts if an alias is in your gitconfig
  28. export GIT_CONFIG=/dev/null
  29. make DESTDIR="${pkgdir}" PREFIX=/usr SYSCONFDIR=/etc install
  30. install -Dm644 LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
  31. }`
  32. func Test_getPackageURL(t *testing.T) {
  33. t.Parallel()
  34. type args struct {
  35. db string
  36. pkgName string
  37. }
  38. tests := []struct {
  39. name string
  40. args args
  41. want string
  42. wantErr bool
  43. }{
  44. {
  45. name: "extra package",
  46. args: args{
  47. db: "extra",
  48. pkgName: "kitty",
  49. },
  50. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/kitty/-/raw/main/PKGBUILD",
  51. wantErr: false,
  52. },
  53. {
  54. name: "core package",
  55. args: args{
  56. db: "core",
  57. pkgName: "linux",
  58. },
  59. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/raw/main/PKGBUILD",
  60. wantErr: false,
  61. },
  62. {
  63. name: "personal repo package",
  64. args: args{
  65. db: "sweswe",
  66. pkgName: "zabix",
  67. },
  68. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/zabix/-/raw/main/PKGBUILD",
  69. wantErr: false,
  70. },
  71. {
  72. name: "special name +",
  73. args: args{
  74. db: "core",
  75. pkgName: "my+package",
  76. },
  77. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/my-package/-/raw/main/PKGBUILD",
  78. wantErr: false,
  79. },
  80. {
  81. name: "special name %",
  82. args: args{
  83. db: "core",
  84. pkgName: "my%package",
  85. },
  86. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/my-package/-/raw/main/PKGBUILD",
  87. wantErr: false,
  88. },
  89. {
  90. name: "special name _-",
  91. args: args{
  92. db: "core",
  93. pkgName: "my_-package",
  94. },
  95. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/my-package/-/raw/main/PKGBUILD",
  96. wantErr: false,
  97. },
  98. {
  99. name: "special name ++",
  100. args: args{
  101. db: "core",
  102. pkgName: "my++package",
  103. },
  104. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/mypluspluspackage/-/raw/main/PKGBUILD",
  105. wantErr: false,
  106. },
  107. {
  108. name: "special name tree",
  109. args: args{
  110. db: "sweswe",
  111. pkgName: "tree",
  112. },
  113. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/unix-tree/-/raw/main/PKGBUILD",
  114. wantErr: false,
  115. },
  116. }
  117. for _, tt := range tests {
  118. tt := tt
  119. t.Run(tt.name, func(t *testing.T) {
  120. t.Parallel()
  121. got := getPackagePKGBUILDURL(tt.args.pkgName)
  122. assert.Equal(t, tt.want, got)
  123. })
  124. }
  125. }
  126. func TestGetABSPkgbuild(t *testing.T) {
  127. t.Parallel()
  128. type args struct {
  129. dbName string
  130. body string
  131. status int
  132. pkgName string
  133. wantURL string
  134. }
  135. tests := []struct {
  136. name string
  137. args args
  138. want string
  139. wantErr bool
  140. }{
  141. {
  142. name: "found package",
  143. args: args{
  144. dbName: "core",
  145. body: gitExtrasPKGBUILD,
  146. status: 200,
  147. pkgName: "git-extras",
  148. wantURL: "https://gitlab.archlinux.org/archlinux/packaging/packages/git-extras/-/raw/main/PKGBUILD",
  149. },
  150. want: gitExtrasPKGBUILD,
  151. wantErr: false,
  152. },
  153. {
  154. name: "not found package",
  155. args: args{
  156. dbName: "core",
  157. body: "",
  158. status: 404,
  159. pkgName: "git-git",
  160. wantURL: "https://gitlab.archlinux.org/archlinux/packaging/packages/git-git/-/raw/main/PKGBUILD",
  161. },
  162. want: "",
  163. wantErr: true,
  164. },
  165. }
  166. for _, tt := range tests {
  167. tt := tt
  168. t.Run(tt.name, func(t *testing.T) {
  169. t.Parallel()
  170. httpClient := &testClient{
  171. t: t,
  172. wantURL: tt.args.wantURL,
  173. body: tt.args.body,
  174. status: tt.args.status,
  175. }
  176. got, err := ABSPKGBUILD(httpClient, tt.args.dbName, tt.args.pkgName)
  177. if tt.wantErr {
  178. assert.Error(t, err)
  179. } else {
  180. assert.NoError(t, err)
  181. }
  182. assert.Equal(t, tt.want, string(got))
  183. })
  184. }
  185. }
  186. func Test_getPackageRepoURL(t *testing.T) {
  187. t.Parallel()
  188. type args struct {
  189. pkgName string
  190. }
  191. tests := []struct {
  192. name string
  193. args args
  194. want string
  195. wantErr bool
  196. }{
  197. {
  198. name: "extra package",
  199. args: args{pkgName: "zoxide"},
  200. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/zoxide.git",
  201. wantErr: false,
  202. },
  203. {
  204. name: "core package",
  205. args: args{pkgName: "linux"},
  206. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/linux.git",
  207. wantErr: false,
  208. },
  209. {
  210. name: "personal repo package",
  211. args: args{pkgName: "sweswe"},
  212. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/sweswe.git",
  213. wantErr: false,
  214. },
  215. {
  216. name: "special name +",
  217. args: args{pkgName: "my+package"},
  218. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/my-package.git",
  219. wantErr: false,
  220. },
  221. {
  222. name: "special name %",
  223. args: args{pkgName: "my%package"},
  224. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/my-package.git",
  225. wantErr: false,
  226. },
  227. {
  228. name: "special name _-",
  229. args: args{pkgName: "my_-package"},
  230. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/my-package.git",
  231. wantErr: false,
  232. },
  233. {
  234. name: "special name ++",
  235. args: args{pkgName: "my++package"},
  236. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/mypluspluspackage.git",
  237. wantErr: false,
  238. },
  239. {
  240. name: "special name tree",
  241. args: args{pkgName: "tree"},
  242. want: "https://gitlab.archlinux.org/archlinux/packaging/packages/unix-tree.git",
  243. wantErr: false,
  244. },
  245. }
  246. for _, tt := range tests {
  247. tt := tt
  248. t.Run(tt.name, func(t *testing.T) {
  249. t.Parallel()
  250. got := getPackageRepoURL(tt.args.pkgName)
  251. assert.Equal(t, tt.want, got)
  252. })
  253. }
  254. }
  255. // GIVEN no previous existing folder
  256. // WHEN ABSPKGBUILDRepo is called
  257. // THEN a clone command should be formed
  258. func TestABSPKGBUILDRepo(t *testing.T) {
  259. t.Parallel()
  260. cmdRunner := &testRunner{}
  261. want := "/usr/local/bin/git --no-replace-objects -C /tmp/doesnt-exist clone --no-progress --single-branch https://gitlab.archlinux.org/archlinux/packaging/packages/linux.git linux"
  262. if os.Getuid() == 0 {
  263. ld := "systemd-run"
  264. if path, _ := exec.LookPath(ld); path != "" {
  265. ld = path
  266. }
  267. want = fmt.Sprintf("%s --service-type=oneshot --pipe --wait --pty --quiet -p DynamicUser=yes -p CacheDirectory=yay -E HOME=/tmp --no-replace-objects -C /tmp/doesnt-exist clone --no-progress --single-branch https://gitlab.archlinux.org/archlinux/packaging/packages/linux.git linux", ld)
  268. }
  269. cmdBuilder := &testGitBuilder{
  270. index: 0,
  271. test: t,
  272. want: want,
  273. parentBuilder: &exe.CmdBuilder{
  274. Runner: cmdRunner,
  275. GitBin: "/usr/local/bin/git",
  276. GitFlags: []string{"--no-replace-objects"},
  277. },
  278. }
  279. newClone, err := ABSPKGBUILDRepo(context.Background(), cmdBuilder, "core", "linux", "/tmp/doesnt-exist", false)
  280. assert.NoError(t, err)
  281. assert.Equal(t, true, newClone)
  282. }
  283. // GIVEN a previous existing folder with permissions
  284. // WHEN ABSPKGBUILDRepo is called
  285. // THEN a pull command should be formed
  286. func TestABSPKGBUILDRepoExistsPerms(t *testing.T) {
  287. t.Parallel()
  288. dir := t.TempDir()
  289. os.MkdirAll(filepath.Join(dir, "linux", ".git"), 0o777)
  290. want := fmt.Sprintf("/usr/local/bin/git --no-replace-objects -C %s/linux pull --rebase --autostash", dir)
  291. if os.Getuid() == 0 {
  292. ld := "systemd-run"
  293. if path, _ := exec.LookPath(ld); path != "" {
  294. ld = path
  295. }
  296. want = fmt.Sprintf("%s --service-type=oneshot --pipe --wait --pty --quiet -p DynamicUser=yes -p CacheDirectory=yay -E HOME=/tmp --no-replace-objects -C %s/linux pull --rebase --autostash", ld, dir)
  297. }
  298. cmdRunner := &testRunner{}
  299. cmdBuilder := &testGitBuilder{
  300. index: 0,
  301. test: t,
  302. want: want,
  303. parentBuilder: &exe.CmdBuilder{
  304. Runner: cmdRunner,
  305. GitBin: "/usr/local/bin/git",
  306. GitFlags: []string{"--no-replace-objects"},
  307. },
  308. }
  309. newClone, err := ABSPKGBUILDRepo(context.Background(), cmdBuilder, "core", "linux", dir, false)
  310. assert.NoError(t, err)
  311. assert.Equal(t, false, newClone)
  312. }