Skip to content

Commit f277a27

Browse files
committed
tests
1 parent c0631b0 commit f277a27

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

coderd/templates.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,7 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) {
841841
return nil
842842
}, nil)
843843
if err != nil {
844-
if database.IsUniqueViolation(err) {
844+
if database.IsUniqueViolation(err, database.UniqueTemplatesOrganizationIDNameIndex) {
845845
httpapi.Write(ctx, rw, http.StatusConflict, codersdk.Response{
846846
Message: fmt.Sprintf("Template with name %q already exists.", req.Name),
847847
Validations: []codersdk.ValidationError{{

coderd/templates_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/coder/coder/v2/coderd/coderdtest"
1919
"github.com/coder/coder/v2/coderd/database"
2020
"github.com/coder/coder/v2/coderd/database/dbauthz"
21+
"github.com/coder/coder/v2/coderd/database/dbtestutil"
2122
"github.com/coder/coder/v2/coderd/database/dbtime"
2223
"github.com/coder/coder/v2/coderd/notifications"
2324
"github.com/coder/coder/v2/coderd/rbac"
@@ -612,6 +613,32 @@ func TestPatchTemplateMeta(t *testing.T) {
612613
assert.Equal(t, database.AuditActionWrite, auditor.AuditLogs()[4].Action)
613614
})
614615

616+
t.Run("AlreadyExists", func(t *testing.T) {
617+
t.Parallel()
618+
619+
if !dbtestutil.WillUsePostgres() {
620+
t.Skip("This test requires Postgres constraints")
621+
}
622+
623+
ownerClient := coderdtest.New(t, nil)
624+
owner := coderdtest.CreateFirstUser(t, ownerClient)
625+
client, _ := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID, rbac.ScopedRoleOrgTemplateAdmin(owner.OrganizationID))
626+
627+
version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil)
628+
version2 := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil)
629+
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID)
630+
template2 := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version2.ID)
631+
632+
ctx := testutil.Context(t, testutil.WaitLong)
633+
634+
_, err := client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{
635+
Name: template2.Name,
636+
})
637+
var apiErr *codersdk.Error
638+
require.ErrorAs(t, err, &apiErr)
639+
require.Equal(t, http.StatusConflict, apiErr.StatusCode())
640+
})
641+
615642
t.Run("AGPL_Deprecated", func(t *testing.T) {
616643
t.Parallel()
617644

site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.test.tsx

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import { API, withDefaultFeatures } from "api/api";
44
import type { Template, UpdateTemplateMeta } from "api/typesGenerated";
55
import { Language as FooterFormLanguage } from "components/FormFooter/FormFooter";
66
import { http, HttpResponse } from "msw";
7-
import { MockEntitlements, MockTemplate } from "testHelpers/entities";
7+
import {
8+
MockEntitlements,
9+
MockTemplate,
10+
mockApiError,
11+
} from "testHelpers/entities";
812
import {
913
renderWithTemplateSettingsLayout,
1014
waitForLoaderToBeRemoved,
@@ -112,6 +116,28 @@ describe("TemplateSettingsPage", () => {
112116
await waitFor(() => expect(API.updateTemplateMeta).toBeCalledTimes(1));
113117
});
114118

119+
it("displays an error if the name is taken", async () => {
120+
await renderTemplateSettingsPage();
121+
jest.spyOn(API, "updateTemplateMeta").mockRejectedValueOnce(
122+
mockApiError({
123+
message: `Template with name "test-template" already exists`,
124+
validations: [
125+
{
126+
field: "name",
127+
detail: "This value is already in use and should be unique.",
128+
},
129+
],
130+
}),
131+
);
132+
await fillAndSubmitForm(validFormValues);
133+
await waitFor(() => expect(API.updateTemplateMeta).toBeCalledTimes(1));
134+
expect(
135+
await screen.findByText(
136+
"This value is already in use and should be unique.",
137+
),
138+
).toBeInTheDocument();
139+
});
140+
115141
it("allows a description of 128 chars", () => {
116142
const values: UpdateTemplateMeta = {
117143
...validFormValues,

0 commit comments

Comments
 (0)