test(download): test pkgbuild fetching

This commit is contained in:
jguer 2021-01-30 12:52:50 +01:00
parent ee3c51f6f2
commit afc72daba7
No known key found for this signature in database
GPG Key ID: 6D6CC9BEA8556B35
9 changed files with 244 additions and 19 deletions

2
cmd.go
View File

@ -241,7 +241,7 @@ func handleYay(cmdArgs *settings.Arguments, dbExecutor db.Executor) error {
func handleGetpkgbuild(cmdArgs *settings.Arguments, dbExecutor db.Executor) error {
if cmdArgs.ExistsArg("p", "pkgbuild") {
return printPkgbuilds(dbExecutor, cmdArgs.Targets)
return printPkgbuilds(dbExecutor, config.Runtime.HTTPClient, cmdArgs.Targets)
}
return getPkgbuilds(cmdArgs.Targets, dbExecutor, cmdArgs.ExistsArg("f", "force"))
}

View File

@ -5,14 +5,18 @@ import (
"io/ioutil"
"net/http"
"net/url"
"github.com/leonelquinteros/gotext"
)
var ErrInvalidRepository = errors.New("invalid repository")
var ErrABSPackageNotFound = errors.New("package not found in repos")
var ErrInvalidRepository = errors.New(gotext.Get("invalid repository"))
var ErrABSPackageNotFound = errors.New(gotext.Get("package not found in repos"))
const MaxConcurrentFetch = 20
const ABSPackageURL = "https://git.archlinux.org/svntogit/packages.git/plain/trunk/PKGBUILD?"
const ABSCommunityURL = "https://git.archlinux.org/svntogit/community.git/plain/trunk/PKGBUILD?"
const urlPackagePath = "/plain/trunk/PKGBUILD?"
var ABSPackageURL = "https://git.archlinux.org/svntogit/packages.git"
var ABSCommunityURL = "https://git.archlinux.org/svntogit/community.git"
func getPackageURL(db, pkgName string) (string, error) {
values := url.Values{}
@ -20,24 +24,28 @@ func getPackageURL(db, pkgName string) (string, error) {
nameEncoded := values.Encode()
switch db {
case "core", "extra", "testing":
return ABSPackageURL + nameEncoded, nil
return ABSPackageURL + urlPackagePath + nameEncoded, nil
case "community", "multilib", "community-testing", "multilib-testing":
return ABSCommunityURL + nameEncoded, nil
return ABSCommunityURL + urlPackagePath + nameEncoded, nil
}
return "", ErrInvalidRepository
}
func GetABSPkgbuild(dbName, pkgName string) ([]byte, error) {
func GetABSPkgbuild(httpClient *http.Client, dbName, pkgName string) ([]byte, error) {
packageURL, err := getPackageURL(dbName, pkgName)
if err != nil {
return nil, err
}
resp, err := http.Get(packageURL)
resp, err := httpClient.Get(packageURL)
if err != nil {
return nil, err
}
if resp.StatusCode != 200 {
return nil, ErrABSPackageNotFound
}
defer resp.Body.Close()
pkgBuild, err := ioutil.ReadAll(resp.Body)

141
pkg/download/abs_test.go Normal file
View File

@ -0,0 +1,141 @@
package download
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
)
const gitExtrasPKGBUILD = `pkgname=git-extras
pkgver=6.1.0
pkgrel=1
pkgdesc="GIT utilities -- repo summary, commit counting, repl, changelog population and more"
arch=('any')
url="https://github.com/tj/${pkgname}"
license=('MIT')
depends=('git')
source=("${pkgname}-${pkgver}.tar.gz::${url}/archive/${pkgver}.tar.gz")
sha256sums=('7be0b15ee803d76d2c2e8036f5d9db6677f2232bb8d2c4976691ff7ae026a22f')
b2sums=('3450edecb3116e19ffcf918b118aee04f025c06d812e29e8701f35a3c466b13d2578d41c8e1ee93327743d0019bf98bb3f397189e19435f89e3a259ff1b82747')
package() {
cd "${srcdir}/${pkgname}-${pkgver}"
# avoid annoying interactive prompts if an alias is in your gitconfig
export GIT_CONFIG=/dev/null
make DESTDIR="${pkgdir}" PREFIX=/usr SYSCONFDIR=/etc install
install -Dm644 LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
}`
func Test_getPackageURL(t *testing.T) {
type args struct {
db string
pkgName string
}
tests := []struct {
name string
args args
want string
wantErr bool
}{
{
name: "community package",
args: args{
db: "community",
pkgName: "kitty",
},
want: "https://git.archlinux.org/svntogit/community.git/plain/trunk/PKGBUILD?h=packages%2Fkitty",
wantErr: false,
},
{
name: "core package",
args: args{
db: "core",
pkgName: "linux",
},
want: "https://git.archlinux.org/svntogit/packages.git/plain/trunk/PKGBUILD?h=packages%2Flinux",
wantErr: false,
},
{
name: "personal repo package",
args: args{
db: "sweswe",
pkgName: "linux",
},
want: "",
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := getPackageURL(tt.args.db, tt.args.pkgName)
if tt.wantErr {
assert.ErrorIs(t, err, ErrInvalidRepository)
}
assert.Equal(t, tt.want, got)
})
}
}
func TestGetABSPkgbuild(t *testing.T) {
pkgBuildHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
w.Write([]byte(gitExtrasPKGBUILD))
})
notFoundHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(404)
})
PKGBuild := httptest.NewServer(pkgBuildHandler)
type args struct {
handler http.Handler
dbName string
pkgName string
}
tests := []struct {
name string
args args
want string
wantErr bool
}{
{
name: "found package",
args: args{
handler: pkgBuildHandler,
dbName: "core",
pkgName: "git-extras",
},
want: gitExtrasPKGBUILD,
wantErr: false,
},
{
name: "not found package",
args: args{
handler: notFoundHandler,
dbName: "core",
pkgName: "git-extras",
},
want: "",
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ABSPackageURL = PKGBuild.URL
PKGBuild.Config.Handler = tt.args.handler
got, err := GetABSPkgbuild(PKGBuild.Client(), tt.args.dbName, tt.args.pkgName)
if tt.wantErr {
assert.Error(t, err)
} else {
assert.NoError(t, err)
}
assert.Equal(t, tt.want, string(got))
})
}
}

View File

@ -5,18 +5,20 @@ import (
"io/ioutil"
"net/http"
"net/url"
"github.com/leonelquinteros/gotext"
)
const AURPackageURL = "https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?"
var AURPackageURL = "https://aur.archlinux.org/cgit/aur.git"
var ErrAURPackageNotFound = errors.New("package not found in AUR")
var ErrAURPackageNotFound = errors.New(gotext.Get("package not found in AUR"))
func GetAURPkgbuild(pkgName string) ([]byte, error) {
func GetAURPkgbuild(httpClient *http.Client, pkgName string) ([]byte, error) {
values := url.Values{}
values.Set("h", pkgName)
pkgURL := AURPackageURL + values.Encode()
pkgURL := AURPackageURL + "/plain/PKGBUILD?" + values.Encode()
resp, err := http.Get(pkgURL)
resp, err := httpClient.Get(pkgURL)
if err != nil {
return nil, err
}

67
pkg/download/aur_test.go Normal file
View File

@ -0,0 +1,67 @@
package download
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
)
func TestGetAURPkgbuild(t *testing.T) {
pkgBuildHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
w.Write([]byte(gitExtrasPKGBUILD))
})
notFoundHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(404)
})
PKGBuild := httptest.NewServer(pkgBuildHandler)
type args struct {
handler http.Handler
pkgName string
}
tests := []struct {
name string
args args
want string
wantErr bool
}{
{
name: "found package",
args: args{
handler: pkgBuildHandler,
pkgName: "git-extras",
},
want: gitExtrasPKGBUILD,
wantErr: false,
},
{
name: "not found package",
args: args{
handler: notFoundHandler,
pkgName: "git-extras",
},
want: "",
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
AURPackageURL = PKGBuild.URL
PKGBuild.Config.Handler = tt.args.handler
got, err := GetAURPkgbuild(PKGBuild.Client(), tt.args.pkgName)
if tt.wantErr {
assert.Error(t, err)
} else {
assert.NoError(t, err)
}
assert.Equal(t, tt.want, string(got))
})
}
}

View File

@ -1,6 +1,7 @@
package download
import (
"net/http"
"sync"
"github.com/Jguer/go-alpm/v2"
@ -19,7 +20,7 @@ func getURLName(pkg alpm.IPackage) string {
return name
}
func GetPkgbuilds(dbExecutor db.Executor, targets []string, mode settings.TargetMode) (map[string][]byte, error) {
func GetPkgbuilds(dbExecutor db.Executor, httpClient *http.Client, targets []string, mode settings.TargetMode) (map[string][]byte, error) {
pkgbuilds := make(map[string][]byte, len(targets))
var mux sync.Mutex
var errs multierror.MultiError
@ -51,9 +52,9 @@ func GetPkgbuilds(dbExecutor db.Executor, targets []string, mode settings.Target
var pkgbuild []byte
if aur {
pkgbuild, err = GetAURPkgbuild(pkgName)
pkgbuild, err = GetAURPkgbuild(httpClient, pkgName)
} else {
pkgbuild, err = GetABSPkgbuild(dbName, pkgName)
pkgbuild, err = GetABSPkgbuild(httpClient, dbName, pkgName)
}
if err == nil {

View File

@ -4,6 +4,7 @@ import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
"path/filepath"
"strings"
@ -213,6 +214,7 @@ func NewConfig() (*Configuration, error) {
},
PacmanConf: nil,
VCSStore: nil,
HTTPClient: &http.Client{},
}
newConfig.Runtime.VCSStore = vcs.NewInfoStore(filepath.Join(cacheHome, vcsFileName),

View File

@ -1,6 +1,8 @@
package settings
import (
"net/http"
"github.com/Morganamilo/go-pacmanconf"
"github.com/Jguer/yay/v10/pkg/settings/exe"
@ -24,4 +26,5 @@ type Runtime struct {
VCSStore *vcs.InfoStore
CmdBuilder *exe.CmdBuilder
CmdRunner exe.Runner
HTTPClient *http.Client
}

View File

@ -2,6 +2,7 @@ package main
import (
"fmt"
"net/http"
"os"
"strconv"
"strings"
@ -269,8 +270,8 @@ outer:
return nil
}
func printPkgbuilds(dbExecutor db.Executor, targets []string) error {
pkgbuilds, err := download.GetPkgbuilds(dbExecutor, targets, config.Runtime.Mode)
func printPkgbuilds(dbExecutor db.Executor, httpClient *http.Client, targets []string) error {
pkgbuilds, err := download.GetPkgbuilds(dbExecutor, httpClient, targets, config.Runtime.Mode)
if err != nil {
text.Errorln(err)
}