Skip to content

Commit 56a0048

Browse files
authored
Fix name validation when last character is a capital letter (#2101)
fix validation when last character of name is a capital letter
1 parent c0dd895 commit 56a0048

File tree

3 files changed

+19
-11
lines changed

3 files changed

+19
-11
lines changed

app/components/form/fields/NameField.spec.tsx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,22 @@ import { validateName } from './NameField'
1111

1212
describe('validateName', () => {
1313
const validate = (name: string) => validateName(name, 'Name', true)
14+
1415
it('returns undefined for valid names', () => {
1516
expect(validate('abc')).toBeUndefined()
1617
expect(validate('abc-def')).toBeUndefined()
1718
expect(validate('abc9-d0ef-6')).toBeUndefined()
1819
})
1920

2021
it('detects names starting with something other than lower-case letter', () => {
21-
expect(validate('Abc')).toEqual('Must start with a lower-case letter')
2222
expect(validate('9bc')).toEqual('Must start with a lower-case letter')
23-
expect(validate('Abc-')).toEqual('Must start with a lower-case letter')
23+
})
24+
25+
// this fails if we check last letter before we check all chars
26+
it('gives correct error on ending with capital letter', () => {
27+
expect(validate('freeBSD')).toEqual(
28+
'Can only contain lower-case letters, numbers, and dashes'
29+
)
2430
})
2531

2632
it('requires names to end with letter or number', () => {
@@ -29,13 +35,13 @@ describe('validateName', () => {
2935
})
3036

3137
it('rejects invalid characters', () => {
32-
expect(validate('aBc')).toEqual(
33-
'Can only contain lower-case letters, numbers, and dashes'
34-
)
35-
expect(validate('asldk:c')).toEqual(
36-
'Can only contain lower-case letters, numbers, and dashes'
37-
)
38+
const err = 'Can only contain lower-case letters, numbers, and dashes'
39+
expect(validate('aBc')).toEqual(err)
40+
expect(validate('asldk:c')).toEqual(err)
41+
expect(validate('Abc-')).toEqual(err)
42+
expect(validate('Abc')).toEqual(err)
3843
})
44+
3945
it('rejects names that are too long', () => {
4046
expect(validate('a'.repeat(64))).toEqual('Must be 63 characters or fewer')
4147
})

app/components/form/fields/NameField.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ export const validateName = (name: string, label: string, required: boolean) =>
4141

4242
if (name.length === 0) {
4343
return `${label} is required`
44+
} else if (!/^[a-z0-9-]+$/.test(name)) {
45+
return 'Can only contain lower-case letters, numbers, and dashes'
4446
} else if (!/^[a-z]/.test(name)) {
4547
return 'Must start with a lower-case letter'
4648
} else if (!/[a-z0-9]$/.test(name)) {
4749
return 'Must end with a letter or number'
48-
} else if (!/^[a-z0-9-]+$/.test(name)) {
49-
return 'Can only contain lower-case letters, numbers, and dashes'
5050
}
5151
}

test/e2e/project-create.e2e.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ test.describe('Project create', () => {
3535
// submit to trigger validation
3636
await page.getByRole('button', { name: 'Create project' }).click()
3737

38-
await expect(page.getByText('Must start with a lower-case letter').nth(0)).toBeVisible()
38+
await expect(
39+
page.getByText('Can only contain lower-case letters, numbers, and dashes').nth(0)
40+
).toBeVisible()
3941
})
4042

4143
test('shows form-level error for known server error', async ({ page }) => {

0 commit comments

Comments
 (0)