github.com/mondo192/jfrog-client-go@v1.0.0/utils/io/content/contentreader_test.go (about) 1 package content 2 3 import ( 4 "fmt" 5 "os" 6 "path" 7 "path/filepath" 8 "testing" 9 10 "github.com/mondo192/jfrog-client-go/utils/io/fileutils" 11 "github.com/mondo192/jfrog-client-go/utils/log" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 const ( 16 searchResult = "SearchResult.json" 17 emptySearchResult = "EmptySearchResult.json" 18 unsortedFile = "UnsortedFile.json" 19 sortedFile = "SortedFile.json" 20 ) 21 22 type inputRecord struct { 23 IntKey int `json:"intKey"` 24 StrKey string `json:"strKey"` 25 BoolKey bool `json:"boolKey"` 26 ArrayKey []ArrayValue `json:"arrayKey"` 27 } 28 29 type ArrayValue struct { 30 Key string `json:"key"` 31 Value string `json:"value"` 32 } 33 34 func init() { 35 log.SetLogger(log.NewLogger(log.DEBUG, nil)) 36 } 37 38 func TestContentReaderPath(t *testing.T) { 39 searchResultPath := filepath.Join(getTestDataPath(), searchResult) 40 reader := NewContentReader(searchResultPath, DefaultKey) 41 assert.Equal(t, 1, len(reader.GetFilesPaths())) 42 assert.Equal(t, searchResultPath, reader.GetFilesPaths()[0]) 43 } 44 45 func TestContentReaderNextRecord(t *testing.T) { 46 searchResultPath := filepath.Join(getTestDataPath(), searchResult) 47 reader := NewContentReader(searchResultPath, DefaultKey) 48 // Read the same file two times 49 for i := 0; i < 2; i++ { 50 var rSlice []inputRecord 51 for item := new(inputRecord); reader.NextRecord(item) == nil; item = new(inputRecord) { 52 rSlice = append(rSlice, *item) 53 } 54 getErrorAndAssert(t, reader) 55 // First element 56 assert.Equal(t, 1, rSlice[0].IntKey) 57 assert.Equal(t, "A", rSlice[0].StrKey) 58 assert.Equal(t, true, rSlice[0].BoolKey) 59 assert.ElementsMatch(t, rSlice[0].ArrayKey, []ArrayValue{{Key: "build.number", Value: "6"}}) 60 // Second element 61 assert.Equal(t, 2, rSlice[1].IntKey) 62 assert.Equal(t, "B", rSlice[1].StrKey) 63 assert.Equal(t, false, rSlice[1].BoolKey) 64 assert.Empty(t, rSlice[1].ArrayKey) 65 // Length validation 66 length, err := reader.Length() 67 assert.NoError(t, err) 68 assert.Equal(t, 2, length) 69 reader.Reset() 70 } 71 } 72 73 func TestContentReaderEmptyResult(t *testing.T) { 74 searchResultPath := filepath.Join(getTestDataPath(), emptySearchResult) 75 reader := NewContentReader(searchResultPath, DefaultKey) 76 for item := new(inputRecord); reader.NextRecord(item) == nil; item = new(inputRecord) { 77 t.Error("Can't loop over empty file") 78 } 79 getErrorAndAssert(t, reader) 80 } 81 82 func getTestDataPath() string { 83 dir, _ := os.Getwd() 84 return filepath.Join(dir, "..", "..", "..", "tests", "testdata", "contentreaderwriter") 85 } 86 87 func TestCloseReader(t *testing.T) { 88 // Create a file. 89 fd, err := fileutils.CreateTempFile() 90 assert.NoError(t, err) 91 assert.NoError(t, fd.Close()) 92 filePathToBeDeleted := fd.Name() 93 94 // Load file to reader 95 reader := NewContentReader(filePathToBeDeleted, DefaultKey) 96 97 // Check file exists 98 _, err = os.Stat(filePathToBeDeleted) 99 assert.NoError(t, err) 100 101 // Check if the file got deleted 102 closeAndAssert(t, reader) 103 _, err = os.Stat(filePathToBeDeleted) 104 assert.True(t, os.IsNotExist(err)) 105 } 106 107 func TestLengthCount(t *testing.T) { 108 searchResultPath := filepath.Join(getTestDataPath(), searchResult) 109 reader := NewContentReader(searchResultPath, DefaultKey) 110 length, err := reader.Length() 111 assert.NoError(t, err) 112 assert.Equal(t, length, 2) 113 // Check cache works with no Reset() being called. 114 length, err = reader.Length() 115 assert.NoError(t, err) 116 assert.Equal(t, length, 2) 117 } 118 119 func TestMergeIncreasingSortedFiles(t *testing.T) { 120 testDataPath := getTestDataPath() 121 var sortedFiles []*ContentReader 122 for i := 1; i <= 3; i++ { 123 sortedFiles = append(sortedFiles, NewContentReader(filepath.Join(testDataPath, fmt.Sprintf("buffer_file_ascending_order_%v.json", i)), DefaultKey)) 124 } 125 resultReader, err := MergeSortedReaders(ReaderTestItem{}, sortedFiles, true) 126 assert.NoError(t, err) 127 assert.Equal(t, 1, len(resultReader.GetFilesPaths())) 128 isMatch, err := fileutils.JsonEqual(resultReader.GetFilesPaths()[0], filepath.Join(testDataPath, "merged_buffer_ascending_order.json")) 129 assert.NoError(t, err) 130 assert.True(t, isMatch) 131 closeAndAssert(t, resultReader) 132 } 133 134 func TestMergeDecreasingSortedFiles(t *testing.T) { 135 testDataPath := getTestDataPath() 136 var sortedFiles []*ContentReader 137 for i := 1; i <= 3; i++ { 138 sortedFiles = append(sortedFiles, NewContentReader(filepath.Join(testDataPath, fmt.Sprintf("buffer_file_descending_order_%v.json", i)), DefaultKey)) 139 } 140 resultReader, err := MergeSortedReaders(ReaderTestItem{}, sortedFiles, false) 141 assert.NoError(t, err) 142 assert.Equal(t, 1, len(resultReader.GetFilesPaths())) 143 isMatch, err := fileutils.JsonEqual(resultReader.GetFilesPaths()[0], filepath.Join(testDataPath, "merged_buffer_descending_order.json")) 144 assert.NoError(t, err) 145 assert.True(t, isMatch) 146 closeAndAssert(t, resultReader) 147 } 148 149 func TestSortContentReaderByCalculatedKey(t *testing.T) { 150 testDataPath := getTestDataPath() 151 unsortedFilePath := filepath.Join(testDataPath, unsortedFile) 152 reader := NewContentReader(unsortedFilePath, DefaultKey) 153 154 getSortKeyFunc := func(result interface{}) (string, error) { 155 resultItem := new(ReaderTestItem) 156 err := ConvertToStruct(result, &resultItem) 157 if err != nil { 158 return "", err 159 } 160 return resultItem.Name, nil 161 } 162 163 sortedReader, err := SortContentReaderByCalculatedKey(reader, getSortKeyFunc, true) 164 assert.NoError(t, err) 165 isMatch, err := fileutils.JsonEqual(sortedReader.GetFilesPaths()[0], filepath.Join(testDataPath, sortedFile)) 166 assert.NoError(t, err) 167 assert.True(t, isMatch) 168 closeAndAssert(t, sortedReader) 169 } 170 171 type ReaderTestItem struct { 172 Repo string `json:"repo,omitempty"` 173 Path string `json:"path,omitempty"` 174 Name string `json:"name,omitempty"` 175 Type string `json:"type,omitempty"` 176 } 177 178 func (rti ReaderTestItem) GetSortKey() string { 179 return path.Join(rti.Repo, rti.Path, rti.Name) 180 } 181 182 func closeAndAssert(t *testing.T, reader *ContentReader) { 183 assert.NoError(t, reader.Close(), "Couldn't close reader") 184 } 185 186 func getErrorAndAssert(t *testing.T, reader *ContentReader) { 187 assert.NoError(t, reader.GetError(), "Couldn't get reader error") 188 }