package adapter_test import ( "cmp" "context" "slices" "testing" "gitea.dwysokinski.me/twhelp/corev3/internal/domain" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) type versionRepository interface { List(ctx context.Context, params domain.ListVersionsParams) (domain.Versions, error) ListCount( ctx context.Context, params domain.ListVersionsParams, ) (domain.Versions, int, error) } func testVersionRepo(t *testing.T, newRepo func(t *testing.T) versionRepository) { t.Helper() t.Run("List & ListCount", func(t *testing.T) { t.Parallel() repo := newRepo(t) tests := []struct { name string params func(t *testing.T) domain.ListVersionsParams assertVersions func(t *testing.T, versions domain.Versions) assertError func(t *testing.T, err error) assertTotal func(t *testing.T, total int) }{ { name: "OK: default params", params: func(t *testing.T) domain.ListVersionsParams { t.Helper() return domain.NewListVersionsParams() }, assertVersions: func(t *testing.T, versions domain.Versions) { t.Helper() assert.NotEmpty(t, len(versions)) assert.True(t, slices.IsSortedFunc(versions, func(a, b domain.Version) int { return cmp.Compare(a.Code(), b.Code()) })) }, assertError: func(t *testing.T, err error) { t.Helper() require.NoError(t, err) }, assertTotal: func(t *testing.T, total int) { t.Helper() assert.NotEmpty(t, total, 0) }, }, { name: "OK: Sort=[Code DESC]", params: func(t *testing.T) domain.ListVersionsParams { t.Helper() params := domain.NewListVersionsParams() require.NoError(t, params.SetSort([]domain.VersionSort{domain.VersionSortCodeDESC})) return params }, assertVersions: func(t *testing.T, versions domain.Versions) { t.Helper() assert.NotEmpty(t, len(versions)) assert.True(t, slices.IsSortedFunc(versions, func(a, b domain.Version) int { return cmp.Compare(a.Code(), b.Code()) * -1 })) }, assertError: func(t *testing.T, err error) { t.Helper() require.NoError(t, err) }, assertTotal: func(t *testing.T, total int) { t.Helper() assert.NotEmpty(t, total) }, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { t.Parallel() ctx := context.Background() params := tt.params(t) res, err := repo.List(ctx, params) tt.assertError(t, err) tt.assertVersions(t, res) res, count, err := repo.ListCount(ctx, params) tt.assertError(t, err) tt.assertVersions(t, res) tt.assertTotal(t, count) }) } }) }