github.com/cobalt77/jfrog-client-go@v0.14.5/artifactory/services/utils/aqlquerybuilder_test.go (about)

     1  package utils
     2  
     3  import (
     4  	"strconv"
     5  	"strings"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  )
    10  
    11  var buildAqlSearchQueryDataProvider = []struct {
    12  	pattern     string
    13  	recursive   bool
    14  	expectedAql string
    15  }{
    16  	{"repo-local", true,
    17  		`{"$or":[{"$and":[{"repo":"repo-local","path":{"$match":"*"},"name":{"$match":"*"}}]}]}`},
    18  	{"repo-w*ldcard", true,
    19  		`{"$or":[{"$and":[{"repo":{"$match":"repo-w*"},"path":{"$match":"*"},"name":{"$match":"*ldcard"}}]},{"$and":[{"repo":{"$match":"repo-w*ldcard"},"path":{"$match":"*"},"name":{"$match":"*"}}]}]}`},
    20  	{"repo-local2/a*b*c/dd/", true,
    21  		`{"path":{"$ne":"."},"$or":[{"$and":[{"repo":"repo-local2","path":{"$match":"a*b*c/dd"},"name":{"$match":"*"}}]},{"$and":[{"repo":"repo-local2","path":{"$match":"a*b*c/dd/*"},"name":{"$match":"*"}}]}]}`},
    22  	{"repo-local*/a*b*c/dd/", true,
    23  		`{"path":{"$ne":"."},"$or":[{"$and":[{"repo":{"$match":"repo-local*"},"path":{"$match":"a*b*c/dd"},"name":{"$match":"*"}}]},{"$and":[{"repo":{"$match":"repo-local*"},"path":{"$match":"a*b*c/dd/*"},"name":{"$match":"*"}}]}]}`},
    24  	{"repo-local", false,
    25  		`{"$or":[{"$and":[{"repo":"repo-local","path":".","name":{"$match":"*"}}]}]}`},
    26  	{"*repo-local", false,
    27  		`{"$or":[{"$and":[{"repo":{"$match":"*"},"path":".","name":{"$match":"*repo-local"}}]},{"$and":[{"repo":{"$match":"*repo-local"},"path":".","name":{"$match":"*"}}]}]}`},
    28  	{"repo-local2/a*b*c/dd/", false,
    29  		`{"path":{"$ne":"."},"$or":[{"$and":[{"repo":"repo-local2","path":{"$match":"a*b*c/dd"},"name":{"$match":"*"}}]}]}`},
    30  	{"*/a*b*c/dd/", false,
    31  		`{"path":{"$ne":"."},"$or":[{"$and":[{"repo":{"$match":"*"},"path":{"$match":"a*b*c/dd"},"name":{"$match":"*"}}]}]}`},
    32  }
    33  
    34  func TestBuildAqlSearchQuery(t *testing.T) {
    35  	for _, sample := range buildAqlSearchQueryDataProvider {
    36  		t.Run(sample.pattern+"_recursive_"+strconv.FormatBool(sample.recursive), func(t *testing.T) {
    37  			params := ArtifactoryCommonParams{Pattern: sample.pattern, Recursive: sample.recursive, Regexp: false, IncludeDirs: false}
    38  			aqlResult, err := CreateAqlBodyForSpecWithPattern(&params)
    39  			assert.NoError(t, err)
    40  			if aqlResult != sample.expectedAql {
    41  				t.Error("Unexpected download AQL query built. \nExpected: " + sample.expectedAql + " \nGot:      " + aqlResult)
    42  			}
    43  		})
    44  	}
    45  }
    46  
    47  func TestArtifactoryCommonParams(t *testing.T) {
    48  	artifactoryParams := ArtifactoryCommonParams{}
    49  	assertIsSortLimitSpecBool(!includePropertiesInAqlForSpec(&artifactoryParams), false, t)
    50  
    51  	artifactoryParams.SortBy = []string{"Vava", "Bubu"}
    52  	assertIsSortLimitSpecBool(!includePropertiesInAqlForSpec(&artifactoryParams), true, t)
    53  
    54  	artifactoryParams.SortBy = nil
    55  	artifactoryParams.Limit = 0
    56  	assertIsSortLimitSpecBool(!includePropertiesInAqlForSpec(&artifactoryParams), false, t)
    57  
    58  	artifactoryParams.Limit = -3
    59  	assertIsSortLimitSpecBool(!includePropertiesInAqlForSpec(&artifactoryParams), false, t)
    60  
    61  	artifactoryParams.Limit = 3
    62  	assertIsSortLimitSpecBool(!includePropertiesInAqlForSpec(&artifactoryParams), true, t)
    63  
    64  	artifactoryParams.SortBy = []string{"Vava", "Bubu"}
    65  	assertIsSortLimitSpecBool(!includePropertiesInAqlForSpec(&artifactoryParams), true, t)
    66  }
    67  
    68  func assertIsSortLimitSpecBool(actual, expected bool, t *testing.T) {
    69  	if actual != expected {
    70  		t.Error("The function includePropertiesInAqlForSpec() expected to return " + strconv.FormatBool(expected) + " but returned " + strconv.FormatBool(actual) + ".")
    71  	}
    72  }
    73  
    74  func TestGetQueryReturnFields(t *testing.T) {
    75  	artifactoryParams := ArtifactoryCommonParams{}
    76  	minimalFields := []string{"name", "repo", "path", "actual_md5", "actual_sha1", "size", "type", "created", "modified"}
    77  
    78  	assertEqualFieldsList(getQueryReturnFields(&artifactoryParams, ALL), append(minimalFields, "property"), t)
    79  	assertEqualFieldsList(getQueryReturnFields(&artifactoryParams, SYMLINK), append(minimalFields, "property"), t)
    80  	assertEqualFieldsList(getQueryReturnFields(&artifactoryParams, NONE), append(minimalFields), t)
    81  
    82  	artifactoryParams.SortBy = []string{"Vava"}
    83  	assertEqualFieldsList(getQueryReturnFields(&artifactoryParams, NONE), append(minimalFields, "Vava"), t)
    84  	assertEqualFieldsList(getQueryReturnFields(&artifactoryParams, ALL), append(minimalFields, "Vava"), t)
    85  	assertEqualFieldsList(getQueryReturnFields(&artifactoryParams, SYMLINK), append(minimalFields, "Vava"), t)
    86  
    87  	artifactoryParams.SortBy = []string{"Vava", "Bubu"}
    88  	assertEqualFieldsList(getQueryReturnFields(&artifactoryParams, ALL), append(minimalFields, "Vava", "Bubu"), t)
    89  }
    90  
    91  func assertEqualFieldsList(actual, expected []string, t *testing.T) {
    92  	if len(actual) != len(expected) {
    93  		t.Error("The function getQueryReturnFields() expected to return the array:\n" + strings.Join(expected[:], ",") + ".\nbut returned:\n" + strings.Join(actual[:], ",") + ".")
    94  	}
    95  	for _, v := range actual {
    96  		isFound := false
    97  		for _, t := range expected {
    98  			if v == t {
    99  				isFound = true
   100  				break
   101  			}
   102  		}
   103  		if !isFound {
   104  			t.Error("The function getQueryReturnFields() expected to return the array:\n'" + strings.Join(expected[:], ",") + "'.\nbut returned:\n'" + strings.Join(actual[:], ",") + "'.\n" +
   105  				"The field " + v + "is missing!")
   106  		}
   107  	}
   108  }
   109  
   110  func TestBuildSortBody(t *testing.T) {
   111  	assertSortBody(buildSortQueryPart([]string{"bubu"}, ""), `"$asc":["bubu"]`, t)
   112  	assertSortBody(buildSortQueryPart([]string{"bubu", "kuku"}, ""), `"$asc":["bubu","kuku"]`, t)
   113  }
   114  
   115  func assertSortBody(actual, expected string, t *testing.T) {
   116  	if actual != expected {
   117  		t.Error("The function buildSortQueryPart expected to return the string:\n'" + expected + "'.\nbut returned:\n'" + actual + "'.")
   118  	}
   119  }
   120  
   121  func TestPrepareSourceSearchPattern(t *testing.T) {
   122  	newPattern := prepareSourceSearchPattern("/testdata/b/b1/b.in", "/testdata", true)
   123  	assert.Equal(t, "/testdata/b/b1/b.in", newPattern)
   124  
   125  	newPattern = prepareSourceSearchPattern("/testdata/b/b1(b).in", "/testdata", true)
   126  	assert.Equal(t, "/testdata/b/b1(b).in", newPattern)
   127  
   128  	newPattern = prepareSourceSearchPattern("/testdata/b/b1(b.in", "/testdata", true)
   129  	assert.Equal(t, "/testdata/b/b1(b.in", newPattern)
   130  
   131  	newPattern = prepareSourceSearchPattern("/testdata/b/b1/)b.in", "/testdata", true)
   132  	assert.Equal(t, "/testdata/b/b1/)b.in", newPattern)
   133  
   134  	newPattern = prepareSourceSearchPattern("/testdata/b/b1/(*).in", "/testdata/{1}.zip", true)
   135  	assert.Equal(t, "/testdata/b/b1/*.in", newPattern)
   136  
   137  	newPattern = prepareSourceSearchPattern("/testdata/b/b1/(*)", "/testdata/{1}", true)
   138  	assert.Equal(t, "/testdata/b/b1/*", newPattern)
   139  
   140  	newPattern = prepareSourceSearchPattern("/testdata/b/(b1)/(*).in", "/testdata/{2}.zip", true)
   141  	assert.Equal(t, "/testdata/b/(b1)/*.in", newPattern)
   142  
   143  	newPattern = prepareSourceSearchPattern("/testdata/(b/(b1)/(*).in", "/testdata/{2}.zip", true)
   144  	assert.Equal(t, "/testdata/(b/(b1)/*.in", newPattern)
   145  
   146  	newPattern = prepareSourceSearchPattern("/testdata/)b/(b1)/(*).in", "/testdata/{2}.zip", true)
   147  	assert.Equal(t, "/testdata/)b/(b1)/*.in", newPattern)
   148  
   149  	newPattern = prepareSourceSearchPattern("/testdata/)b(/(b1)/(*).in", "/testdata/{2}.zip", true)
   150  	assert.Equal(t, "/testdata/)b(/(b1)/*.in", newPattern)
   151  
   152  	newPattern = prepareSourceSearchPattern("/testdata/)b(/(b1)/(*).in", "/testdata/{1}/{2}.zip", true)
   153  	assert.Equal(t, "/testdata/)b(/b1/*.in", newPattern)
   154  
   155  	newPattern = prepareSourceSearchPattern("/testdata/)b(/(b1)/(*).in", "/testdata/{1}/{1}/{2}.zip", true)
   156  	assert.Equal(t, "/testdata/)b(/b1/*.in", newPattern)
   157  
   158  	newPattern = prepareSourceSearchPattern("/testdata/)b(/(b1)/(*).(in)", "/testdata/{1}/{1}/{3}/{2}.zip", true)
   159  	assert.Equal(t, "/testdata/)b(/b1/*.in", newPattern)
   160  
   161  	newPattern = prepareSourceSearchPattern("/testdata/b/(/(.in", "/testdata", true)
   162  	assert.Equal(t, "/testdata/b/(/(.in", newPattern)
   163  }