zotregistry.dev/zot@v1.4.4-0.20240314164342-eec277e14d20/pkg/cli/client/search_cmd_internal_test.go (about) 1 //go:build search 2 // +build search 3 4 package client 5 6 import ( 7 "bytes" 8 "fmt" 9 "os" 10 "regexp" 11 "strings" 12 "testing" 13 14 . "github.com/smartystreets/goconvey/convey" 15 16 "zotregistry.dev/zot/pkg/api" 17 "zotregistry.dev/zot/pkg/api/config" 18 extconf "zotregistry.dev/zot/pkg/extensions/config" 19 test "zotregistry.dev/zot/pkg/test/common" 20 . "zotregistry.dev/zot/pkg/test/image-utils" 21 ) 22 23 func TestSearchCommandGQL(t *testing.T) { 24 port := test.GetFreePort() 25 baseURL := test.GetBaseURL(port) 26 conf := config.New() 27 conf.HTTP.Port = port 28 29 defaultVal := true 30 conf.Extensions = &extconf.ExtensionConfig{ 31 Search: &extconf.SearchConfig{ 32 BaseConfig: extconf.BaseConfig{Enable: &defaultVal}, 33 }, 34 } 35 36 ctlr := api.NewController(conf) 37 ctlr.Config.Storage.RootDirectory = t.TempDir() 38 cm := test.NewControllerManager(ctlr) 39 40 cm.StartAndWait(conf.HTTP.Port) 41 defer cm.StopServer() 42 43 Convey("commands without gql", t, func() { 44 configPath := makeConfigFile(fmt.Sprintf(`{"configs":[{"_name":"searchtest","url":"%s","showspinner":false}]}`, 45 baseURL)) 46 defer os.Remove(configPath) 47 48 Convey("query", func() { 49 args := []string{"query", "repo/al", "--config", "searchtest"} 50 cmd := NewSearchCommand(mockService{}) 51 52 buff := bytes.NewBufferString("") 53 cmd.SetOut(buff) 54 cmd.SetErr(buff) 55 cmd.SetArgs(args) 56 err := cmd.Execute() 57 So(err, ShouldBeNil) 58 space := regexp.MustCompile(`\s+`) 59 str := space.ReplaceAllString(buff.String(), " ") 60 actual := strings.TrimSpace(str) 61 So(actual, ShouldContainSubstring, "repo 8c25cb36 false 100B") 62 So(actual, ShouldContainSubstring, "repo 100B 2010-01-01 01:01:01 +0000 UTC 0 0") 63 }) 64 65 Convey("query command errors", func() { 66 // no url 67 args := []string{"repo/al", "--config", "searchtest"} 68 cmd := NewSearchQueryCommand(mockService{}) 69 buff := bytes.NewBufferString("") 70 cmd.SetOut(buff) 71 cmd.SetErr(buff) 72 cmd.SetArgs(args) 73 err := cmd.Execute() 74 So(err, ShouldNotBeNil) 75 }) 76 77 Convey("subject", func() { 78 err := UploadImage(CreateRandomImage(), baseURL, "repo", "tag") 79 So(err, ShouldBeNil) 80 81 args := []string{"subject", "repo:tag", "--config", "searchtest"} 82 cmd := NewSearchCommand(mockService{}) 83 84 buff := bytes.NewBufferString("") 85 cmd.SetOut(buff) 86 cmd.SetErr(buff) 87 cmd.SetArgs(args) 88 err = cmd.Execute() 89 So(err, ShouldBeNil) 90 space := regexp.MustCompile(`\s+`) 91 str := space.ReplaceAllString(buff.String(), " ") 92 actual := strings.TrimSpace(str) 93 So(actual, ShouldContainSubstring, "ArtifactType 100 B Digest") 94 }) 95 96 Convey("subject command errors", func() { 97 // no url 98 args := []string{"repo:tag", "--config", "searchtest"} 99 cmd := NewSearchSubjectCommand(mockService{}) 100 buff := bytes.NewBufferString("") 101 cmd.SetOut(buff) 102 cmd.SetErr(buff) 103 cmd.SetArgs(args) 104 err := cmd.Execute() 105 So(err, ShouldNotBeNil) 106 }) 107 }) 108 } 109 110 func TestSearchCommandREST(t *testing.T) { 111 port := test.GetFreePort() 112 baseURL := test.GetBaseURL(port) 113 conf := config.New() 114 conf.HTTP.Port = port 115 116 ctlr := api.NewController(conf) 117 ctlr.Config.Storage.RootDirectory = t.TempDir() 118 cm := test.NewControllerManager(ctlr) 119 120 cm.StartAndWait(conf.HTTP.Port) 121 defer cm.StopServer() 122 123 Convey("commands without gql", t, func() { 124 configPath := makeConfigFile(fmt.Sprintf(`{"configs":[{"_name":"searchtest","url":"%s","showspinner":false}]}`, 125 baseURL)) 126 defer os.Remove(configPath) 127 128 Convey("query", func() { 129 args := []string{"query", "repo/al", "--config", "searchtest"} 130 cmd := NewSearchCommand(mockService{}) 131 132 buff := bytes.NewBufferString("") 133 cmd.SetOut(buff) 134 cmd.SetErr(buff) 135 cmd.SetArgs(args) 136 err := cmd.Execute() 137 So(err, ShouldNotBeNil) 138 }) 139 140 Convey("subject", func() { 141 err := UploadImage(CreateRandomImage(), baseURL, "repo", "tag") 142 So(err, ShouldBeNil) 143 144 args := []string{"subject", "repo:tag", "--config", "searchtest"} 145 cmd := NewSearchCommand(mockService{}) 146 147 buff := bytes.NewBufferString("") 148 cmd.SetOut(buff) 149 cmd.SetErr(buff) 150 cmd.SetArgs(args) 151 err = cmd.Execute() 152 So(err, ShouldBeNil) 153 space := regexp.MustCompile(`\s+`) 154 str := space.ReplaceAllString(buff.String(), " ") 155 actual := strings.TrimSpace(str) 156 So(actual, ShouldContainSubstring, 157 "art.type 100 B sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a") 158 }) 159 }) 160 }