diff --git a/internal/clientcache/internal/cache/repository_targets.go b/internal/clientcache/internal/cache/repository_targets.go index f85be97bbf..0d5e9534ce 100644 --- a/internal/clientcache/internal/cache/repository_targets.go +++ b/internal/clientcache/internal/cache/repository_targets.go @@ -379,7 +379,18 @@ func (r *Repository) searchTargets(ctx context.Context, condition string, search if sd != Ascending && sd != Descending { sd = Ascending } - orderClause := fmt.Sprintf("%s %s", opts.withSortBy, sd) + + // Sorting by name requires doing case insensitive, then tie-breaking with case sensitive to put names which were + // originally capitalized first. To avoid weird behavior when adding new columns, break sort by name's case + // out separately. + orderClause := "" + switch opts.withSortBy { + case "name": + orderClause = fmt.Sprintf("lower(%s) %s, %s %s", opts.withSortBy, sd, opts.withSortBy, sd) + default: + orderClause = fmt.Sprintf("%s %s", opts.withSortBy, sd) + } + dbOpts = append(dbOpts, db.WithOrder(orderClause)) } diff --git a/internal/clientcache/internal/cache/repository_targets_test.go b/internal/clientcache/internal/cache/repository_targets_test.go index 6bb968289d..d8a81f9c36 100644 --- a/internal/clientcache/internal/cache/repository_targets_test.go +++ b/internal/clientcache/internal/cache/repository_targets_test.go @@ -6,6 +6,7 @@ package cache import ( "context" "encoding/json" + "fmt" "strconv" "sync" "testing" @@ -340,9 +341,11 @@ func TestRepository_ListTargets(t *testing.T) { }) ts := []*targets.Target{ - target("1"), - target("2"), - target("3"), + target("TARGET 1"), + target("Target 1"), + target("TaRgEt 2"), + target("Target 2"), + target("Target 3"), } require.NoError(t, r.refreshTargets(ctx, u1, map[AuthToken]string{{Id: "id"}: "something"}, WithTargetRetrievalFunc(testTargetStaticResourceRetrievalFunc(testStaticResourceRetrievalFunc(t, [][]*targets.Target{ts}, [][]string{nil}))))) @@ -362,9 +365,25 @@ func TestRepository_ListTargets(t *testing.T) { t.Run("withSortBy sorts targets", func(t *testing.T) { l, err := r.ListTargets(ctx, kt1.AuthTokenId, WithSort(SortByName, Descending, []SortBy{SortByName})) assert.NoError(t, err) - assert.Equal(t, ts[2].Name, l.Targets[0].Name) + assert.Equal(t, ts[4].Name, l.Targets[0].Name) + assert.Equal(t, ts[3].Name, l.Targets[1].Name) + assert.Equal(t, ts[2].Name, l.Targets[2].Name) + assert.Equal(t, ts[1].Name, l.Targets[3].Name) + assert.Equal(t, ts[0].Name, l.Targets[4].Name) + }) + + t.Run("withSortBy Ascending sorts targets ascending order", func(t *testing.T) { + l, err := r.ListTargets(ctx, kt1.AuthTokenId, WithSort(SortByName, Ascending, []SortBy{SortByName})) + assert.NoError(t, err) + for _, t := range l.Targets { + fmt.Println(t.Name) + } + + assert.Equal(t, ts[4].Name, l.Targets[4].Name) + assert.Equal(t, ts[3].Name, l.Targets[3].Name) + assert.Equal(t, ts[2].Name, l.Targets[2].Name) assert.Equal(t, ts[1].Name, l.Targets[1].Name) - assert.Equal(t, ts[0].Name, l.Targets[2].Name) + assert.Equal(t, ts[0].Name, l.Targets[0].Name) }) t.Run("withSortBy bad SortBy errors", func(t *testing.T) {