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  }