get.porter.sh/porter@v1.3.0/pkg/pkgmgmt/search_test.go (about) 1 package pkgmgmt 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "net/http/httptest" 8 "os" 9 "testing" 10 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestSearch(t *testing.T) { 15 fullList := PackageList{ 16 { 17 Name: "az", 18 Author: "Porter Authors", 19 Description: "A mixin for using the az cli", 20 URL: "https://cdn.porter.sh/mixins/atom.xml", 21 }, 22 { 23 Name: "cowsay", 24 Author: "Porter Authors", 25 Description: "A mixin for using the cowsay cli", 26 URL: "https://github.com/carolynvs/porter-cowsay/releases/download", 27 }, 28 { 29 Name: "cowsayeth", 30 Author: "Udder Geniuses", 31 Description: "A mixin for using the cowsayeth cli", 32 URL: "https://cdn.uddergenius.es/mixins/atom.xml", 33 }, 34 } 35 36 testcases := []struct { 37 name string 38 pkg string 39 wantItems PackageList 40 wantError string 41 }{{ 42 name: "no args", 43 pkg: "", 44 wantItems: fullList, 45 }, { 46 name: "package name single match", 47 pkg: "az", 48 wantItems: PackageList{fullList[0]}, 49 }, { 50 name: "package name case insensitive", 51 pkg: "AZ", 52 wantItems: PackageList{fullList[0]}, 53 }, { 54 name: "package name multiple match", 55 pkg: "cowsay", 56 wantItems: PackageList{fullList[1], fullList[2]}, 57 }, { 58 name: "package name no match", 59 pkg: "ottersay", 60 wantItems: PackageList{}, 61 wantError: "no mixins found for ottersay", 62 }} 63 64 for _, tc := range testcases { 65 t.Run(tc.name, func(t *testing.T) { 66 data, err := os.ReadFile("testdata/directory/index.json") 67 require.NoError(t, err) 68 69 var pkgList PackageList 70 err = json.Unmarshal(data, &pkgList) 71 require.NoError(t, err) 72 73 searcher := NewSearcher(pkgList) 74 75 result, err := searcher.Search(tc.pkg, "mixin") 76 if tc.wantError != "" { 77 require.EqualError(t, err, tc.wantError) 78 } else { 79 require.NoError(t, err) 80 } 81 require.Equal(t, tc.wantItems, result) 82 }) 83 } 84 } 85 86 func TestGetPackageListings_404(t *testing.T) { 87 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 88 w.WriteHeader(404) 89 })) 90 defer ts.Close() 91 92 _, err := GetPackageListings(ts.URL) 93 require.EqualError(t, err, 94 fmt.Sprintf("unable to fetch package list via %s: Not Found", ts.URL)) 95 } 96 97 func TestGetPackageListings_UnmarshalErr(t *testing.T) { 98 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 99 fmt.Fprintf(w, "foo") 100 })) 101 defer ts.Close() 102 103 _, err := GetPackageListings(ts.URL) 104 require.EqualError(t, err, 105 "unable to unmarshal package list: invalid character 'o' in literal false (expecting 'a')") 106 } 107 108 func TestGetPackageListings_Success(t *testing.T) { 109 packageList := PackageList{ 110 { 111 Name: "quokkasay", 112 Author: "Setonix Inc.", 113 Description: "A mixin for using the quokkasay CLI", 114 URL: "https://cdn.quokkas.au/mixins/atom.xml", 115 }, 116 } 117 118 bytes, err := json.Marshal(packageList) 119 require.NoError(t, err) 120 121 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 122 fmt.Fprint(w, string(bytes)) 123 })) 124 defer ts.Close() 125 126 list, err := GetPackageListings(ts.URL) 127 require.NoError(t, err) 128 require.Equal(t, packageList, list) 129 }