From a1cb9e32479566ac6661934d8fc6147367bae828 Mon Sep 17 00:00:00 2001 From: Rodrigo Maia Date: Thu, 18 May 2023 20:05:40 +0000 Subject: [PATCH 1/6] feat(workspaces): implement sorting order on workspace list --- coderd/workspaces.go | 13 ++++++++++++ coderd/workspaces_test.go | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/coderd/workspaces.go b/coderd/workspaces.go index 10d0dc9281882..4899381271836 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -1150,6 +1150,19 @@ func convertWorkspaces(workspaces []database.Workspace, data workspaceData) ([]c sort.Slice(apiWorkspaces, func(i, j int) bool { iw := apiWorkspaces[i] jw := apiWorkspaces[j] + + if iw.LatestBuild.Status == codersdk.WorkspaceStatusRunning && jw.LatestBuild.Status != codersdk.WorkspaceStatusRunning { + return true + } + + if jw.LatestBuild.Status == codersdk.WorkspaceStatusRunning && iw.LatestBuild.Status != codersdk.WorkspaceStatusRunning { + return false + } + + if iw.OwnerID != jw.OwnerID { + return iw.OwnerName < jw.OwnerName + } + if jw.LastUsedAt.IsZero() && iw.LastUsedAt.IsZero() { return iw.Name < jw.Name } diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index 54e65939e719d..7e7fad3e4b829 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -198,6 +198,49 @@ func TestAdminViewAllWorkspaces(t *testing.T) { require.Equal(t, 0, len(memberViewWorkspaces.Workspaces), "member in other org should see 0 workspaces") } +func TestWorkspacesSortOrder(t *testing.T) { + // the correct sorting order is: + // 1. first show workspaces that are currently running, + // 2. then sort by user_name, + // 3. then sort by last_used_at (descending), + t.Parallel() + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + firstUser := coderdtest.CreateFirstUser(t, client) + version := coderdtest.CreateTemplateVersion(t, client, firstUser.OrganizationID, nil) + coderdtest.AwaitTemplateVersionJob(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, firstUser.OrganizationID, version.ID) + workspace1 := coderdtest.CreateWorkspace(t, client, firstUser.OrganizationID, template.ID, func(ctr *codersdk.CreateWorkspaceRequest) { + ctr.Name = "test-workspace-sort-1" + }) + coderdtest.AwaitWorkspaceBuildJob(t, client, workspace1.LatestBuild.ID) + + workspace2 := coderdtest.CreateWorkspace(t, client, firstUser.OrganizationID, template.ID, func(ctr *codersdk.CreateWorkspaceRequest) { + ctr.Name = "test-workspace-sort-2" + }) + coderdtest.AwaitWorkspaceBuildJob(t, client, workspace2.LatestBuild.ID) + + build2 := coderdtest.CreateWorkspaceBuild(t, client, workspace2, database.WorkspaceTransitionStop) + coderdtest.AwaitWorkspaceBuildJob(t, client, build2.ID) + + workspace3 := coderdtest.CreateWorkspace(t, client, firstUser.OrganizationID, template.ID, func(ctr *codersdk.CreateWorkspaceRequest) { + ctr.Name = "test-workspace-sort-3" + }) + coderdtest.AwaitWorkspaceBuildJob(t, client, workspace3.LatestBuild.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + workspacesResponse, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{}) + require.NoError(t, err, "(first) fetch workspaces") + require.Equal(t, 3, len(workspacesResponse.Workspaces), "should be 3 workspaces present") + + require.Equal(t, codersdk.WorkspaceStatusRunning, workspacesResponse.Workspaces[0].LatestBuild.Status, "first should be running ones") + require.Equal(t, codersdk.WorkspaceStatusRunning, workspacesResponse.Workspaces[1].LatestBuild.Status, "Running workspaces should be first") + require.Equal(t, codersdk.WorkspaceStatusStopped, workspacesResponse.Workspaces[2].LatestBuild.Status, "The stopped one should be last") + + require.Equal(t, workspace3.ID, workspacesResponse.Workspaces[0].ID, "If both are running, and have the same owner, sort by last used (in this case, the last one created)") +} + func TestPostWorkspacesByOrganization(t *testing.T) { t.Parallel() t.Run("InvalidTemplate", func(t *testing.T) { From da9de66faa1de8fc89e7db778879fac8c8059a27 Mon Sep 17 00:00:00 2001 From: Rodrigo Maia Date: Fri, 19 May 2023 14:22:19 +0000 Subject: [PATCH 2/6] split slice into its own function and test it --- coderd/workspaces.go | 15 ++-- coderd/workspaces_internal_test.go | 106 +++++++++++++++++++++++++++++ coderd/workspaces_test.go | 4 ++ 3 files changed, 120 insertions(+), 5 deletions(-) diff --git a/coderd/workspaces.go b/coderd/workspaces.go index 4899381271836..e01d4292cb800 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -1147,9 +1147,16 @@ func convertWorkspaces(workspaces []database.Workspace, data workspaceData) ([]c &owner, )) } - sort.Slice(apiWorkspaces, func(i, j int) bool { - iw := apiWorkspaces[i] - jw := apiWorkspaces[j] + + sortWorkspaces(apiWorkspaces) + + return apiWorkspaces, nil +} + +func sortWorkspaces(workspaces []codersdk.Workspace) { + sort.Slice(workspaces, func(i, j int) bool { + iw := workspaces[i] + jw := workspaces[j] if iw.LatestBuild.Status == codersdk.WorkspaceStatusRunning && jw.LatestBuild.Status != codersdk.WorkspaceStatusRunning { return true @@ -1168,8 +1175,6 @@ func convertWorkspaces(workspaces []database.Workspace, data workspaceData) ([]c } return iw.LastUsedAt.After(jw.LastUsedAt) }) - - return apiWorkspaces, nil } func convertWorkspace( diff --git a/coderd/workspaces_internal_test.go b/coderd/workspaces_internal_test.go index 44c1699309c4c..59e79ad16fc78 100644 --- a/coderd/workspaces_internal_test.go +++ b/coderd/workspaces_internal_test.go @@ -1,9 +1,12 @@ package coderd import ( + "fmt" "testing" "time" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/coder/coder/coderd/database" @@ -80,3 +83,106 @@ func Test_calculateDeletingAt(t *testing.T) { }) } } + +func TestSortWorkspaces(t *testing.T) { + t.Parallel() + + t.Run("Running First", func(t *testing.T) { + t.Parallel() + workspaces := []codersdk.Workspace{ + WorkspaceFactory(t, "test-workspace-sort-1", uuid.New(), "user1", codersdk.WorkspaceStatusPending), + WorkspaceFactory(t, "test-workspace-sort-2", uuid.New(), "user2", codersdk.WorkspaceStatusRunning), + WorkspaceFactory(t, "test-workspace-sort-3", uuid.New(), "user2", codersdk.WorkspaceStatusRunning), + WorkspaceFactory(t, "test-workspace-sort-4", uuid.New(), "user1", codersdk.WorkspaceStatusPending), + } + + sortWorkspaces(workspaces) + + assert.Equal(t, workspaces[0].LatestBuild.Status, codersdk.WorkspaceStatusRunning) + assert.Equal(t, workspaces[1].LatestBuild.Status, codersdk.WorkspaceStatusRunning) + assert.Equal(t, workspaces[2].LatestBuild.Status, codersdk.WorkspaceStatusPending) + assert.Equal(t, workspaces[3].LatestBuild.Status, codersdk.WorkspaceStatusPending) + }) + + t.Run("Then sort by owner Name", func(t *testing.T) { + t.Parallel() + workspaces := []codersdk.Workspace{ + WorkspaceFactory(t, "test-workspace-sort-1", uuid.New(), "userZ", codersdk.WorkspaceStatusRunning), + WorkspaceFactory(t, "test-workspace-sort-2", uuid.New(), "userA", codersdk.WorkspaceStatusRunning), + WorkspaceFactory(t, "test-workspace-sort-3", uuid.New(), "userB", codersdk.WorkspaceStatusRunning), + } + + sortWorkspaces(workspaces) + + t.Log("uuid ", uuid.New().String()) + t.Log("uuid ", uuid.New().String()) + + assert.Equal(t, "userA", workspaces[0].OwnerName) + assert.Equal(t, "userB", workspaces[1].OwnerName) + assert.Equal(t, "userZ", workspaces[2].OwnerName) + }) + + t.Run("Then sort by last used at (recent first)", func(t *testing.T) { + t.Parallel() + var workspaces []codersdk.Workspace + + useruuid := uuid.New() + + for i := 0; i < 4; i++ { + workspaces = append(workspaces, WorkspaceFactory(t, fmt.Sprintf("test-workspace-sort-%d", i+1), useruuid, "user2", codersdk.WorkspaceStatusRunning)) + } + + sortWorkspaces(workspaces) + + // in this case, the last used at is the creation time + assert.Equal(t, workspaces[0].Name, "test-workspace-sort-4") + assert.Equal(t, workspaces[1].Name, "test-workspace-sort-3") + assert.Equal(t, workspaces[2].Name, "test-workspace-sort-2") + assert.Equal(t, workspaces[3].Name, "test-workspace-sort-1") + }) +} + +func WorkspaceFactory(t *testing.T, name string, ownerID uuid.UUID, ownerName string, status codersdk.WorkspaceStatus) codersdk.Workspace { + t.Helper() + return codersdk.Workspace{ + ID: uuid.New(), + CreatedAt: time.Time{}, + UpdatedAt: time.Time{}, + OwnerID: ownerID, + OwnerName: ownerName, + OrganizationID: [16]byte{}, + TemplateID: [16]byte{}, + TemplateName: name, + TemplateDisplayName: name, + TemplateIcon: "", + TemplateAllowUserCancelWorkspaceJobs: false, + LatestBuild: codersdk.WorkspaceBuild{ + ID: uuid.New(), + CreatedAt: time.Time{}, + UpdatedAt: time.Time{}, + WorkspaceID: [16]byte{}, + WorkspaceName: name, + WorkspaceOwnerID: [16]byte{}, + WorkspaceOwnerName: ownerName, + TemplateVersionID: [16]byte{}, + TemplateVersionName: name, + BuildNumber: 0, + Transition: "", + InitiatorID: [16]byte{}, + InitiatorUsername: name, + Job: codersdk.ProvisionerJob{}, + Reason: "", + Resources: []codersdk.WorkspaceResource{}, + Deadline: codersdk.NullTime{}, + MaxDeadline: codersdk.NullTime{}, + Status: status, + DailyCost: 0, + }, + Outdated: false, + Name: name, + AutostartSchedule: new(string), + TTLMillis: new(int64), + LastUsedAt: time.Now(), + DeletingAt: &time.Time{}, + } +} diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index 7e7fad3e4b829..6f199063e3122 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -239,6 +239,10 @@ func TestWorkspacesSortOrder(t *testing.T) { require.Equal(t, codersdk.WorkspaceStatusStopped, workspacesResponse.Workspaces[2].LatestBuild.Status, "The stopped one should be last") require.Equal(t, workspace3.ID, workspacesResponse.Workspaces[0].ID, "If both are running, and have the same owner, sort by last used (in this case, the last one created)") +<<<<<<< Updated upstream +======= + +>>>>>>> Stashed changes } func TestPostWorkspacesByOrganization(t *testing.T) { From 2e82d2689b2ebda8047f6802253aae6564d1825b Mon Sep 17 00:00:00 2001 From: Rodrigo Maia Date: Fri, 19 May 2023 14:26:26 +0000 Subject: [PATCH 3/6] use require instead of assert --- coderd/workspaces_internal_test.go | 23 +++++++++++------------ coderd/workspaces_test.go | 9 +++------ 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/coderd/workspaces_internal_test.go b/coderd/workspaces_internal_test.go index 59e79ad16fc78..f1bae57225499 100644 --- a/coderd/workspaces_internal_test.go +++ b/coderd/workspaces_internal_test.go @@ -6,7 +6,6 @@ import ( "time" "github.com/google/uuid" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/coder/coder/coderd/database" @@ -98,10 +97,10 @@ func TestSortWorkspaces(t *testing.T) { sortWorkspaces(workspaces) - assert.Equal(t, workspaces[0].LatestBuild.Status, codersdk.WorkspaceStatusRunning) - assert.Equal(t, workspaces[1].LatestBuild.Status, codersdk.WorkspaceStatusRunning) - assert.Equal(t, workspaces[2].LatestBuild.Status, codersdk.WorkspaceStatusPending) - assert.Equal(t, workspaces[3].LatestBuild.Status, codersdk.WorkspaceStatusPending) + require.Equal(t, workspaces[0].LatestBuild.Status, codersdk.WorkspaceStatusRunning) + require.Equal(t, workspaces[1].LatestBuild.Status, codersdk.WorkspaceStatusRunning) + require.Equal(t, workspaces[2].LatestBuild.Status, codersdk.WorkspaceStatusPending) + require.Equal(t, workspaces[3].LatestBuild.Status, codersdk.WorkspaceStatusPending) }) t.Run("Then sort by owner Name", func(t *testing.T) { @@ -117,9 +116,9 @@ func TestSortWorkspaces(t *testing.T) { t.Log("uuid ", uuid.New().String()) t.Log("uuid ", uuid.New().String()) - assert.Equal(t, "userA", workspaces[0].OwnerName) - assert.Equal(t, "userB", workspaces[1].OwnerName) - assert.Equal(t, "userZ", workspaces[2].OwnerName) + require.Equal(t, "userA", workspaces[0].OwnerName) + require.Equal(t, "userB", workspaces[1].OwnerName) + require.Equal(t, "userZ", workspaces[2].OwnerName) }) t.Run("Then sort by last used at (recent first)", func(t *testing.T) { @@ -135,10 +134,10 @@ func TestSortWorkspaces(t *testing.T) { sortWorkspaces(workspaces) // in this case, the last used at is the creation time - assert.Equal(t, workspaces[0].Name, "test-workspace-sort-4") - assert.Equal(t, workspaces[1].Name, "test-workspace-sort-3") - assert.Equal(t, workspaces[2].Name, "test-workspace-sort-2") - assert.Equal(t, workspaces[3].Name, "test-workspace-sort-1") + require.Equal(t, workspaces[0].Name, "test-workspace-sort-4") + require.Equal(t, workspaces[1].Name, "test-workspace-sort-3") + require.Equal(t, workspaces[2].Name, "test-workspace-sort-2") + require.Equal(t, workspaces[3].Name, "test-workspace-sort-1") }) } diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index 6f199063e3122..b2a88061e11d1 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -234,15 +234,12 @@ func TestWorkspacesSortOrder(t *testing.T) { require.NoError(t, err, "(first) fetch workspaces") require.Equal(t, 3, len(workspacesResponse.Workspaces), "should be 3 workspaces present") - require.Equal(t, codersdk.WorkspaceStatusRunning, workspacesResponse.Workspaces[0].LatestBuild.Status, "first should be running ones") - require.Equal(t, codersdk.WorkspaceStatusRunning, workspacesResponse.Workspaces[1].LatestBuild.Status, "Running workspaces should be first") - require.Equal(t, codersdk.WorkspaceStatusStopped, workspacesResponse.Workspaces[2].LatestBuild.Status, "The stopped one should be last") + require.Equal(t, codersdk.WorkspaceStatusRunning, workspacesResponse.Workspaces[0].LatestBuild.Status, "should be the first item in the list because it is running") + require.Equal(t, codersdk.WorkspaceStatusRunning, workspacesResponse.Workspaces[1].LatestBuild.Status) + require.Equal(t, codersdk.WorkspaceStatusStopped, workspacesResponse.Workspaces[2].LatestBuild.Status, "The stopped workspace should be last") require.Equal(t, workspace3.ID, workspacesResponse.Workspaces[0].ID, "If both are running, and have the same owner, sort by last used (in this case, the last one created)") -<<<<<<< Updated upstream -======= ->>>>>>> Stashed changes } func TestPostWorkspacesByOrganization(t *testing.T) { From d84902aa4c16d972f7d2226c6a94641e9a14b4c7 Mon Sep 17 00:00:00 2001 From: Rodrigo Maia Date: Fri, 19 May 2023 17:13:37 -0300 Subject: [PATCH 4/6] Update coderd/workspaces_internal_test.go Co-authored-by: Cian Johnston --- coderd/workspaces_internal_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/coderd/workspaces_internal_test.go b/coderd/workspaces_internal_test.go index f1bae57225499..4be85b6016fa5 100644 --- a/coderd/workspaces_internal_test.go +++ b/coderd/workspaces_internal_test.go @@ -113,9 +113,6 @@ func TestSortWorkspaces(t *testing.T) { sortWorkspaces(workspaces) - t.Log("uuid ", uuid.New().String()) - t.Log("uuid ", uuid.New().String()) - require.Equal(t, "userA", workspaces[0].OwnerName) require.Equal(t, "userB", workspaces[1].OwnerName) require.Equal(t, "userZ", workspaces[2].OwnerName) From 3033bdd1d2067fef64a5bfc707b974926455b334 Mon Sep 17 00:00:00 2001 From: Rodrigo Maia Date: Fri, 19 May 2023 20:23:34 +0000 Subject: [PATCH 5/6] refactor tests into table tests --- coderd/workspaces_internal_test.go | 168 ++++++++++++++--------------- coderd/workspaces_test.go | 44 -------- 2 files changed, 80 insertions(+), 132 deletions(-) diff --git a/coderd/workspaces_internal_test.go b/coderd/workspaces_internal_test.go index 4be85b6016fa5..3e06428105c3f 100644 --- a/coderd/workspaces_internal_test.go +++ b/coderd/workspaces_internal_test.go @@ -1,7 +1,6 @@ package coderd import ( - "fmt" "testing" "time" @@ -84,101 +83,94 @@ func Test_calculateDeletingAt(t *testing.T) { } func TestSortWorkspaces(t *testing.T) { + // the correct sorting order is: + // 1. first show workspaces that are currently running, + // 2. then sort by user_name, + // 3. then sort by last_used_at (descending), t.Parallel() - t.Run("Running First", func(t *testing.T) { - t.Parallel() - workspaces := []codersdk.Workspace{ - WorkspaceFactory(t, "test-workspace-sort-1", uuid.New(), "user1", codersdk.WorkspaceStatusPending), - WorkspaceFactory(t, "test-workspace-sort-2", uuid.New(), "user2", codersdk.WorkspaceStatusRunning), - WorkspaceFactory(t, "test-workspace-sort-3", uuid.New(), "user2", codersdk.WorkspaceStatusRunning), - WorkspaceFactory(t, "test-workspace-sort-4", uuid.New(), "user1", codersdk.WorkspaceStatusPending), - } - - sortWorkspaces(workspaces) - - require.Equal(t, workspaces[0].LatestBuild.Status, codersdk.WorkspaceStatusRunning) - require.Equal(t, workspaces[1].LatestBuild.Status, codersdk.WorkspaceStatusRunning) - require.Equal(t, workspaces[2].LatestBuild.Status, codersdk.WorkspaceStatusPending) - require.Equal(t, workspaces[3].LatestBuild.Status, codersdk.WorkspaceStatusPending) - }) - - t.Run("Then sort by owner Name", func(t *testing.T) { - t.Parallel() - workspaces := []codersdk.Workspace{ - WorkspaceFactory(t, "test-workspace-sort-1", uuid.New(), "userZ", codersdk.WorkspaceStatusRunning), - WorkspaceFactory(t, "test-workspace-sort-2", uuid.New(), "userA", codersdk.WorkspaceStatusRunning), - WorkspaceFactory(t, "test-workspace-sort-3", uuid.New(), "userB", codersdk.WorkspaceStatusRunning), + workspaceFactory := func(t *testing.T, name string, ownerID uuid.UUID, ownerName string, status codersdk.WorkspaceStatus, lastUsedAt time.Time) codersdk.Workspace { + t.Helper() + return codersdk.Workspace{ + ID: uuid.New(), + OwnerID: ownerID, + OwnerName: ownerName, + LatestBuild: codersdk.WorkspaceBuild{ + Status: status, + }, + Name: name, + LastUsedAt: lastUsedAt, } + } - sortWorkspaces(workspaces) - - require.Equal(t, "userA", workspaces[0].OwnerName) - require.Equal(t, "userB", workspaces[1].OwnerName) - require.Equal(t, "userZ", workspaces[2].OwnerName) - }) - - t.Run("Then sort by last used at (recent first)", func(t *testing.T) { - t.Parallel() - var workspaces []codersdk.Workspace + userAuuid := uuid.New() - useruuid := uuid.New() + workspaceRunningUserA := workspaceFactory(t, "running-userA", userAuuid, "userA", codersdk.WorkspaceStatusRunning, time.Now()) + workspaceRunningUserB := workspaceFactory(t, "running-userB", uuid.New(), "userB", codersdk.WorkspaceStatusRunning, time.Now()) + workspacePendingUserC := workspaceFactory(t, "pending-userC", uuid.New(), "userC", codersdk.WorkspaceStatusPending, time.Now()) + workspaceRunningUserA2 := workspaceFactory(t, "running-userA2", userAuuid, "userA", codersdk.WorkspaceStatusRunning, time.Now()) + workspaceRunningUserZ := workspaceFactory(t, "running-userZ", uuid.New(), "userZ", codersdk.WorkspaceStatusRunning, time.Now().Add(time.Minute)) + workspaceRunningUserA3 := workspaceFactory(t, "running-userA3", userAuuid, "userA", codersdk.WorkspaceStatusRunning, time.Now().Add(time.Hour)) - for i := 0; i < 4; i++ { - workspaces = append(workspaces, WorkspaceFactory(t, fmt.Sprintf("test-workspace-sort-%d", i+1), useruuid, "user2", codersdk.WorkspaceStatusRunning)) - } + testCases := []struct { + name string + input []codersdk.Workspace + expectedOrder []string + }{ + { + name: "Running workspaces should be first", + input: []codersdk.Workspace{ + workspaceRunningUserB, + workspacePendingUserC, + workspaceRunningUserA, + }, + expectedOrder: []string{ + "running-userA", + "running-userB", + "pending-userC", + }, + }, + { + name: "then sort by owner name", + input: []codersdk.Workspace{ + workspaceRunningUserZ, + workspaceRunningUserA, + workspaceRunningUserB, + }, + expectedOrder: []string{ + "running-userA", + "running-userB", + "running-userZ", + }, + }, + { + name: "then sort by last used at (recent first)", + input: []codersdk.Workspace{ + workspaceRunningUserA, + workspaceRunningUserA2, + workspaceRunningUserA3, + }, + expectedOrder: []string{ + "running-userA3", + "running-userA2", + "running-userA", + }, + }, + } - sortWorkspaces(workspaces) + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + workspaces := tc.input + sortWorkspaces(workspaces) - // in this case, the last used at is the creation time - require.Equal(t, workspaces[0].Name, "test-workspace-sort-4") - require.Equal(t, workspaces[1].Name, "test-workspace-sort-3") - require.Equal(t, workspaces[2].Name, "test-workspace-sort-2") - require.Equal(t, workspaces[3].Name, "test-workspace-sort-1") - }) -} + var resultNames []string + for _, workspace := range workspaces { + resultNames = append(resultNames, workspace.Name) + } -func WorkspaceFactory(t *testing.T, name string, ownerID uuid.UUID, ownerName string, status codersdk.WorkspaceStatus) codersdk.Workspace { - t.Helper() - return codersdk.Workspace{ - ID: uuid.New(), - CreatedAt: time.Time{}, - UpdatedAt: time.Time{}, - OwnerID: ownerID, - OwnerName: ownerName, - OrganizationID: [16]byte{}, - TemplateID: [16]byte{}, - TemplateName: name, - TemplateDisplayName: name, - TemplateIcon: "", - TemplateAllowUserCancelWorkspaceJobs: false, - LatestBuild: codersdk.WorkspaceBuild{ - ID: uuid.New(), - CreatedAt: time.Time{}, - UpdatedAt: time.Time{}, - WorkspaceID: [16]byte{}, - WorkspaceName: name, - WorkspaceOwnerID: [16]byte{}, - WorkspaceOwnerName: ownerName, - TemplateVersionID: [16]byte{}, - TemplateVersionName: name, - BuildNumber: 0, - Transition: "", - InitiatorID: [16]byte{}, - InitiatorUsername: name, - Job: codersdk.ProvisionerJob{}, - Reason: "", - Resources: []codersdk.WorkspaceResource{}, - Deadline: codersdk.NullTime{}, - MaxDeadline: codersdk.NullTime{}, - Status: status, - DailyCost: 0, - }, - Outdated: false, - Name: name, - AutostartSchedule: new(string), - TTLMillis: new(int64), - LastUsedAt: time.Now(), - DeletingAt: &time.Time{}, + require.Equal(t, tc.expectedOrder, resultNames, tc.name) + }) } } diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index b2a88061e11d1..54e65939e719d 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -198,50 +198,6 @@ func TestAdminViewAllWorkspaces(t *testing.T) { require.Equal(t, 0, len(memberViewWorkspaces.Workspaces), "member in other org should see 0 workspaces") } -func TestWorkspacesSortOrder(t *testing.T) { - // the correct sorting order is: - // 1. first show workspaces that are currently running, - // 2. then sort by user_name, - // 3. then sort by last_used_at (descending), - t.Parallel() - client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) - firstUser := coderdtest.CreateFirstUser(t, client) - version := coderdtest.CreateTemplateVersion(t, client, firstUser.OrganizationID, nil) - coderdtest.AwaitTemplateVersionJob(t, client, version.ID) - template := coderdtest.CreateTemplate(t, client, firstUser.OrganizationID, version.ID) - workspace1 := coderdtest.CreateWorkspace(t, client, firstUser.OrganizationID, template.ID, func(ctr *codersdk.CreateWorkspaceRequest) { - ctr.Name = "test-workspace-sort-1" - }) - coderdtest.AwaitWorkspaceBuildJob(t, client, workspace1.LatestBuild.ID) - - workspace2 := coderdtest.CreateWorkspace(t, client, firstUser.OrganizationID, template.ID, func(ctr *codersdk.CreateWorkspaceRequest) { - ctr.Name = "test-workspace-sort-2" - }) - coderdtest.AwaitWorkspaceBuildJob(t, client, workspace2.LatestBuild.ID) - - build2 := coderdtest.CreateWorkspaceBuild(t, client, workspace2, database.WorkspaceTransitionStop) - coderdtest.AwaitWorkspaceBuildJob(t, client, build2.ID) - - workspace3 := coderdtest.CreateWorkspace(t, client, firstUser.OrganizationID, template.ID, func(ctr *codersdk.CreateWorkspaceRequest) { - ctr.Name = "test-workspace-sort-3" - }) - coderdtest.AwaitWorkspaceBuildJob(t, client, workspace3.LatestBuild.ID) - - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() - - workspacesResponse, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{}) - require.NoError(t, err, "(first) fetch workspaces") - require.Equal(t, 3, len(workspacesResponse.Workspaces), "should be 3 workspaces present") - - require.Equal(t, codersdk.WorkspaceStatusRunning, workspacesResponse.Workspaces[0].LatestBuild.Status, "should be the first item in the list because it is running") - require.Equal(t, codersdk.WorkspaceStatusRunning, workspacesResponse.Workspaces[1].LatestBuild.Status) - require.Equal(t, codersdk.WorkspaceStatusStopped, workspacesResponse.Workspaces[2].LatestBuild.Status, "The stopped workspace should be last") - - require.Equal(t, workspace3.ID, workspacesResponse.Workspaces[0].ID, "If both are running, and have the same owner, sort by last used (in this case, the last one created)") - -} - func TestPostWorkspacesByOrganization(t *testing.T) { t.Parallel() t.Run("InvalidTemplate", func(t *testing.T) { From a19228d7dac9c2223e4dc1674f1c11728dac7723 Mon Sep 17 00:00:00 2001 From: Rodrigo Maia Date: Mon, 22 May 2023 20:43:28 +0000 Subject: [PATCH 6/6] fix test --- coderd/workspaces_internal_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coderd/workspaces_internal_test.go b/coderd/workspaces_internal_test.go index 3e06428105c3f..62a5091539330 100644 --- a/coderd/workspaces_internal_test.go +++ b/coderd/workspaces_internal_test.go @@ -108,8 +108,8 @@ func TestSortWorkspaces(t *testing.T) { workspaceRunningUserA := workspaceFactory(t, "running-userA", userAuuid, "userA", codersdk.WorkspaceStatusRunning, time.Now()) workspaceRunningUserB := workspaceFactory(t, "running-userB", uuid.New(), "userB", codersdk.WorkspaceStatusRunning, time.Now()) workspacePendingUserC := workspaceFactory(t, "pending-userC", uuid.New(), "userC", codersdk.WorkspaceStatusPending, time.Now()) - workspaceRunningUserA2 := workspaceFactory(t, "running-userA2", userAuuid, "userA", codersdk.WorkspaceStatusRunning, time.Now()) - workspaceRunningUserZ := workspaceFactory(t, "running-userZ", uuid.New(), "userZ", codersdk.WorkspaceStatusRunning, time.Now().Add(time.Minute)) + workspaceRunningUserA2 := workspaceFactory(t, "running-userA2", userAuuid, "userA", codersdk.WorkspaceStatusRunning, time.Now().Add(time.Minute)) + workspaceRunningUserZ := workspaceFactory(t, "running-userZ", uuid.New(), "userZ", codersdk.WorkspaceStatusRunning, time.Now()) workspaceRunningUserA3 := workspaceFactory(t, "running-userA3", userAuuid, "userA", codersdk.WorkspaceStatusRunning, time.Now().Add(time.Hour)) testCases := []struct {