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(¶ms) 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 }