zotregistry.dev/zot@v1.4.4-0.20240314164342-eec277e14d20/pkg/extensions/search/pagination/pagination_test.go (about)

     1  //go:build search
     2  
     3  package pagination_test
     4  
     5  import (
     6  	"testing"
     7  	"time"
     8  
     9  	. "github.com/smartystreets/goconvey/convey"
    10  
    11  	"zotregistry.dev/zot/pkg/extensions/search/gql_generated"
    12  	"zotregistry.dev/zot/pkg/extensions/search/pagination"
    13  )
    14  
    15  func TestImgSumPagination(t *testing.T) {
    16  	Convey("NewImgSumPageFinder errors", t, func() {
    17  		_, err := pagination.NewImgSumPageFinder(-1, 0, pagination.AlphabeticAsc)
    18  		So(err, ShouldNotBeNil)
    19  
    20  		_, err = pagination.NewImgSumPageFinder(0, -1, pagination.AlphabeticAsc)
    21  		So(err, ShouldNotBeNil)
    22  
    23  		_, err = pagination.NewImgSumPageFinder(0, 0, "unknown")
    24  		So(err, ShouldNotBeNil)
    25  	})
    26  
    27  	Convey("Sort Functions", t, func() {
    28  		Convey("ImgSortByAlphabeticAsc", func() {
    29  			// Case: repo1 is < repo2
    30  			pageBuff := []*gql_generated.ImageSummary{
    31  				{RepoName: ref("repo1:1")},
    32  				{RepoName: ref("repo2:2")},
    33  			}
    34  
    35  			sortFunc := pagination.ImgSortByAlphabeticAsc(pageBuff)
    36  			So(sortFunc(0, 1), ShouldBeTrue)
    37  		})
    38  
    39  		Convey("ImgSortByAlphabeticDsc", func() {
    40  			// Case: repo1 is < repo2
    41  			pageBuff := []*gql_generated.ImageSummary{
    42  				{RepoName: ref("repo1:1")},
    43  				{RepoName: ref("repo2:2")},
    44  			}
    45  
    46  			sortFunc := pagination.ImgSortByAlphabeticDsc(pageBuff)
    47  			So(sortFunc(0, 1), ShouldBeFalse)
    48  		})
    49  
    50  		Convey("ImgSortByRelevance", func() {
    51  			// Case: repo1 is < repo2
    52  			pageBuff := []*gql_generated.ImageSummary{
    53  				{RepoName: ref("repo1:1")},
    54  				{RepoName: ref("repo2:2")},
    55  			}
    56  
    57  			sortFunc := pagination.ImgSortByRelevance(pageBuff)
    58  			So(sortFunc(0, 1), ShouldBeTrue)
    59  		})
    60  	})
    61  }
    62  
    63  func TestRepoSumPagination(t *testing.T) {
    64  	Convey("NewRepoSumPageFinder errors", t, func() {
    65  		_, err := pagination.NewRepoSumPageFinder(-1, 0, pagination.AlphabeticAsc)
    66  		So(err, ShouldNotBeNil)
    67  
    68  		_, err = pagination.NewRepoSumPageFinder(0, -1, pagination.AlphabeticAsc)
    69  		So(err, ShouldNotBeNil)
    70  
    71  		_, err = pagination.NewRepoSumPageFinder(0, 0, "unknown")
    72  		So(err, ShouldNotBeNil)
    73  	})
    74  }
    75  
    76  func ref[T any](input T) *T {
    77  	obj := input
    78  
    79  	return &obj
    80  }
    81  
    82  func TestPagination(t *testing.T) {
    83  	Convey("Image Pagination", t, func() {
    84  		Convey("Sort functions", func() {
    85  			imgSum1 := gql_generated.ImageSummary{
    86  				RepoName:      ref("1"),
    87  				Tag:           ref("1"),
    88  				LastUpdated:   ref(time.Date(2010, 1, 1, 1, 1, 1, 1, time.UTC)),
    89  				DownloadCount: ref(33),
    90  			}
    91  
    92  			imgSum2 := gql_generated.ImageSummary{
    93  				RepoName:      ref("1"),
    94  				Tag:           ref("latest"),
    95  				LastUpdated:   ref(time.Date(2020, 1, 1, 1, 1, 1, 1, time.UTC)),
    96  				DownloadCount: ref(11),
    97  			}
    98  
    99  			imgSum3 := gql_generated.ImageSummary{
   100  				RepoName:      ref("3"),
   101  				Tag:           ref("1"),
   102  				LastUpdated:   ref(time.Date(2011, 1, 1, 1, 1, 1, 1, time.UTC)),
   103  				DownloadCount: ref(22),
   104  			}
   105  
   106  			imgSum4 := gql_generated.ImageSummary{
   107  				RepoName:      ref("4"),
   108  				Tag:           ref("latest"),
   109  				LastUpdated:   ref(time.Date(2012, 1, 1, 1, 1, 1, 1, time.UTC)),
   110  				DownloadCount: ref(44),
   111  			}
   112  
   113  			// ImgSortByAlphabeticAsc
   114  			imagePageFinder, err := pagination.NewImgSumPageFinder(4, 0, pagination.AlphabeticAsc)
   115  			So(err, ShouldBeNil)
   116  			imagePageFinder.Add(&imgSum1)
   117  			imagePageFinder.Add(&imgSum2)
   118  			imagePageFinder.Add(&imgSum3)
   119  			imagePageFinder.Add(&imgSum4)
   120  			page, _ := imagePageFinder.Page()
   121  			So(page, ShouldEqual, []*gql_generated.ImageSummary{
   122  				&imgSum1, &imgSum2, &imgSum3, &imgSum4,
   123  			})
   124  
   125  			// ImgSortByAlphabeticDsc
   126  			imagePageFinder, err = pagination.NewImgSumPageFinder(4, 0, pagination.AlphabeticDsc)
   127  			So(err, ShouldBeNil)
   128  			imagePageFinder.Add(&imgSum1)
   129  			imagePageFinder.Add(&imgSum2)
   130  			imagePageFinder.Add(&imgSum3)
   131  			imagePageFinder.Add(&imgSum4)
   132  			page, _ = imagePageFinder.Page()
   133  			So(page, ShouldEqual, []*gql_generated.ImageSummary{
   134  				&imgSum4, &imgSum3, &imgSum2, &imgSum1,
   135  			})
   136  
   137  			// ImgSortByRelevance
   138  			imagePageFinder, err = pagination.NewImgSumPageFinder(4, 0, pagination.Relevance)
   139  			So(err, ShouldBeNil)
   140  			imagePageFinder.Add(&imgSum1)
   141  			imagePageFinder.Add(&imgSum2)
   142  			imagePageFinder.Add(&imgSum3)
   143  			imagePageFinder.Add(&imgSum4)
   144  			page, _ = imagePageFinder.Page()
   145  			So(page, ShouldEqual, []*gql_generated.ImageSummary{
   146  				&imgSum1, &imgSum2, &imgSum3, &imgSum4,
   147  			})
   148  
   149  			// ImgSortByUpdateTime
   150  			imagePageFinder, err = pagination.NewImgSumPageFinder(4, 0, pagination.UpdateTime)
   151  			So(err, ShouldBeNil)
   152  			imagePageFinder.Add(&imgSum1)
   153  			imagePageFinder.Add(&imgSum2)
   154  			imagePageFinder.Add(&imgSum3)
   155  			imagePageFinder.Add(&imgSum4)
   156  			page, _ = imagePageFinder.Page()
   157  			So(page, ShouldEqual, []*gql_generated.ImageSummary{
   158  				&imgSum2, &imgSum1, &imgSum4, &imgSum3,
   159  			})
   160  
   161  			// ImgSortByDownloads
   162  			imagePageFinder, err = pagination.NewImgSumPageFinder(4, 0, pagination.Downloads)
   163  			So(err, ShouldBeNil)
   164  			imagePageFinder.Add(&imgSum1)
   165  			imagePageFinder.Add(&imgSum2)
   166  			imagePageFinder.Add(&imgSum3)
   167  			imagePageFinder.Add(&imgSum4)
   168  			page, _ = imagePageFinder.Page()
   169  			So(page, ShouldEqual, []*gql_generated.ImageSummary{
   170  				&imgSum4, &imgSum1, &imgSum3, &imgSum2,
   171  			})
   172  		})
   173  
   174  		Convey("Errors", func() {
   175  			imagePageFinder, err := pagination.NewImgSumPageFinder(2, 0, "")
   176  			So(err, ShouldBeNil)
   177  			So(imagePageFinder, ShouldNotBeNil)
   178  
   179  			_, err = pagination.NewImgSumPageFinder(-1, 0, "")
   180  			So(err, ShouldNotBeNil)
   181  
   182  			_, err = pagination.NewImgSumPageFinder(1, -1, "")
   183  			So(err, ShouldNotBeNil)
   184  
   185  			_, err = pagination.NewImgSumPageFinder(1, -1, "bad sort func")
   186  			So(err, ShouldNotBeNil)
   187  		})
   188  	})
   189  
   190  	Convey("Repos Pagination", t, func() {
   191  		Convey("Sort functions", func() {
   192  			repoSum1 := gql_generated.RepoSummary{
   193  				Name:          ref("1"),
   194  				LastUpdated:   ref(time.Date(2010, 1, 1, 1, 1, 1, 1, time.UTC)),
   195  				DownloadCount: ref(33),
   196  				Rank:          ref(1),
   197  			}
   198  
   199  			repoSum2 := gql_generated.RepoSummary{
   200  				Name:          ref("2"),
   201  				LastUpdated:   ref(time.Date(2020, 1, 1, 1, 1, 1, 1, time.UTC)),
   202  				DownloadCount: ref(11),
   203  				Rank:          ref(2),
   204  			}
   205  
   206  			repoSum3 := gql_generated.RepoSummary{
   207  				Name:          ref("3"),
   208  				LastUpdated:   ref(time.Date(2011, 1, 1, 1, 1, 1, 1, time.UTC)),
   209  				DownloadCount: ref(22),
   210  				Rank:          ref(3),
   211  			}
   212  
   213  			repoSum4 := gql_generated.RepoSummary{
   214  				Name:          ref("4"),
   215  				LastUpdated:   ref(time.Date(2012, 1, 1, 1, 1, 1, 1, time.UTC)),
   216  				DownloadCount: ref(44),
   217  				Rank:          ref(4),
   218  			}
   219  
   220  			// ImgSortByAlphabeticAsc
   221  			imagePageFinder, err := pagination.NewRepoSumPageFinder(4, 0, pagination.AlphabeticAsc)
   222  			So(err, ShouldBeNil)
   223  			imagePageFinder.Add(&repoSum1)
   224  			imagePageFinder.Add(&repoSum2)
   225  			imagePageFinder.Add(&repoSum3)
   226  			imagePageFinder.Add(&repoSum4)
   227  			page, _ := imagePageFinder.Page()
   228  			So(page, ShouldEqual, []*gql_generated.RepoSummary{
   229  				&repoSum1, &repoSum2, &repoSum3, &repoSum4,
   230  			})
   231  
   232  			// ImgSortByAlphabeticDsc
   233  			imagePageFinder, err = pagination.NewRepoSumPageFinder(4, 0, pagination.AlphabeticDsc)
   234  			So(err, ShouldBeNil)
   235  			imagePageFinder.Add(&repoSum1)
   236  			imagePageFinder.Add(&repoSum2)
   237  			imagePageFinder.Add(&repoSum3)
   238  			imagePageFinder.Add(&repoSum4)
   239  			page, _ = imagePageFinder.Page()
   240  			So(page, ShouldEqual, []*gql_generated.RepoSummary{
   241  				&repoSum4, &repoSum3, &repoSum2, &repoSum1,
   242  			})
   243  
   244  			// ImgSortByRelevance
   245  			imagePageFinder, err = pagination.NewRepoSumPageFinder(4, 0, pagination.Relevance)
   246  			So(err, ShouldBeNil)
   247  			imagePageFinder.Add(&repoSum1)
   248  			imagePageFinder.Add(&repoSum2)
   249  			imagePageFinder.Add(&repoSum3)
   250  			imagePageFinder.Add(&repoSum4)
   251  			page, _ = imagePageFinder.Page()
   252  			So(page, ShouldEqual, []*gql_generated.RepoSummary{
   253  				&repoSum1, &repoSum2, &repoSum3, &repoSum4,
   254  			})
   255  
   256  			// ImgSortByUpdateTime
   257  			imagePageFinder, err = pagination.NewRepoSumPageFinder(4, 0, pagination.UpdateTime)
   258  			So(err, ShouldBeNil)
   259  			imagePageFinder.Add(&repoSum1)
   260  			imagePageFinder.Add(&repoSum2)
   261  			imagePageFinder.Add(&repoSum3)
   262  			imagePageFinder.Add(&repoSum4)
   263  			page, _ = imagePageFinder.Page()
   264  			So(page, ShouldEqual, []*gql_generated.RepoSummary{
   265  				&repoSum2, &repoSum4, &repoSum3, &repoSum1,
   266  			})
   267  
   268  			// ImgSortByDownloads
   269  			imagePageFinder, err = pagination.NewRepoSumPageFinder(4, 0, pagination.Downloads)
   270  			So(err, ShouldBeNil)
   271  			imagePageFinder.Add(&repoSum1)
   272  			imagePageFinder.Add(&repoSum2)
   273  			imagePageFinder.Add(&repoSum3)
   274  			imagePageFinder.Add(&repoSum4)
   275  			page, _ = imagePageFinder.Page()
   276  			So(page, ShouldEqual, []*gql_generated.RepoSummary{
   277  				&repoSum4, &repoSum1, &repoSum3, &repoSum2,
   278  			})
   279  		})
   280  
   281  		Convey("Errors", func() {
   282  			repoPageFinder, err := pagination.NewRepoSumPageFinder(2, 0, "")
   283  			So(err, ShouldBeNil)
   284  			So(repoPageFinder, ShouldNotBeNil)
   285  
   286  			_, err = pagination.NewRepoSumPageFinder(-1, 0, "")
   287  			So(err, ShouldNotBeNil)
   288  
   289  			_, err = pagination.NewRepoSumPageFinder(1, -1, "")
   290  			So(err, ShouldNotBeNil)
   291  
   292  			_, err = pagination.NewRepoSumPageFinder(1, -1, "bad sort func")
   293  			So(err, ShouldNotBeNil)
   294  		})
   295  	})
   296  }