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  }