From 34187e2e003d073d36381051c4afd20e7ceae709 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Thu, 31 Oct 2024 09:47:00 -0400 Subject: [PATCH 1/4] chore: add unit test to verify filter by owner name --- coderd/workspaces_test.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index c24afc67de8ba..7de6eedebd6c1 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -1313,6 +1313,26 @@ func TestWorkspaceFilterManual(t *testing.T) { require.NoError(t, err) require.Len(t, res.Workspaces, 0) }) + t.Run("Owner", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + user := coderdtest.CreateFirstUser(t, client) + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + workspace := coderdtest.CreateWorkspace(t, client, template.ID) + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + // match owner name + res, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ + Owner: workspace.OwnerName, + }) + require.NoError(t, err) + require.Len(t, res.Workspaces, 1) + require.Equal(t, workspace.ID, res.Workspaces[0].ID) + }) t.Run("IDs", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) From 271680bdc3e00679f0a4616e479e886cadde10e3 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Thu, 31 Oct 2024 09:57:11 -0400 Subject: [PATCH 2/4] chore: fix workspace query to user username column from users table --- coderd/database/queries.sql.go | 2 +- coderd/database/queries/workspaces.sql | 2 +- coderd/workspaces_test.go | 22 ++++++++++++++++++---- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index d00c4ec3bcdef..38b174272522f 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -14947,7 +14947,7 @@ WHERE -- Filter by owner_name AND CASE WHEN $8 :: text != '' THEN - workspaces.owner_id = (SELECT id FROM users WHERE lower(owner_username) = lower($8) AND deleted = false) + workspaces.owner_id = (SELECT id FROM users WHERE lower(users.username) = lower($8) AND deleted = false) ELSE true END -- Filter by template_name diff --git a/coderd/database/queries/workspaces.sql b/coderd/database/queries/workspaces.sql index 08e795d7a2402..369333a5eab9d 100644 --- a/coderd/database/queries/workspaces.sql +++ b/coderd/database/queries/workspaces.sql @@ -233,7 +233,7 @@ WHERE -- Filter by owner_name AND CASE WHEN @owner_username :: text != '' THEN - workspaces.owner_id = (SELECT id FROM users WHERE lower(owner_username) = lower(@owner_username) AND deleted = false) + workspaces.owner_id = (SELECT id FROM users WHERE lower(users.username) = lower(@owner_username) AND deleted = false) ELSE true END -- Filter by template_name diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index 7de6eedebd6c1..01842a528abd6 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -1317,21 +1317,35 @@ func TestWorkspaceFilterManual(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) user := coderdtest.CreateFirstUser(t, client) + otherUser, _ := coderdtest.CreateAnotherUser(t, client, user.OrganizationID, rbac.RoleOwner()) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, template.ID) + + // Add a non-matching workspace + coderdtest.CreateWorkspace(t, otherUser, template.ID) + + workspaces := []codersdk.Workspace{ + coderdtest.CreateWorkspace(t, client, template.ID), + coderdtest.CreateWorkspace(t, client, template.ID), + } + var _ = workspaces ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() + sdkUser, err := client.User(ctx, codersdk.Me) + require.NoError(t, err) + // match owner name res, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ - Owner: workspace.OwnerName, + FilterQuery: fmt.Sprintf("owner:%s", sdkUser.Username), }) require.NoError(t, err) - require.Len(t, res.Workspaces, 1) - require.Equal(t, workspace.ID, res.Workspaces[0].ID) + require.Len(t, res.Workspaces, 2) + for _, found := range res.Workspaces { + require.Equal(t, found.OwnerName, sdkUser.Username) + } }) t.Run("IDs", func(t *testing.T) { t.Parallel() From 1f640f2e64c9ef92fa1a588cc93d8f9429567d83 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Thu, 31 Oct 2024 10:15:42 -0400 Subject: [PATCH 3/4] fmt --- coderd/workspaces_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index 01842a528abd6..c03ec061eeae6 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -1329,7 +1329,6 @@ func TestWorkspaceFilterManual(t *testing.T) { coderdtest.CreateWorkspace(t, client, template.ID), coderdtest.CreateWorkspace(t, client, template.ID), } - var _ = workspaces ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() From bce943adf0cd00e093358369dd1cd355a8f83dbd Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Thu, 31 Oct 2024 11:06:48 -0400 Subject: [PATCH 4/4] linting --- coderd/workspaces_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index c03ec061eeae6..0a4e10670132c 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -1341,7 +1341,7 @@ func TestWorkspaceFilterManual(t *testing.T) { FilterQuery: fmt.Sprintf("owner:%s", sdkUser.Username), }) require.NoError(t, err) - require.Len(t, res.Workspaces, 2) + require.Len(t, res.Workspaces, len(workspaces)) for _, found := range res.Workspaces { require.Equal(t, found.OwnerName, sdkUser.Username) }