Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 14 additions & 8 deletions app/components/form/fields/NameField.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,22 @@ import { validateName } from './NameField'

describe('validateName', () => {
const validate = (name: string) => validateName(name, 'Name', true)

it('returns undefined for valid names', () => {
expect(validate('abc')).toBeUndefined()
expect(validate('abc-def')).toBeUndefined()
expect(validate('abc9-d0ef-6')).toBeUndefined()
})

it('detects names starting with something other than lower-case letter', () => {
expect(validate('Abc')).toEqual('Must start with a lower-case letter')
expect(validate('9bc')).toEqual('Must start with a lower-case letter')
expect(validate('Abc-')).toEqual('Must start with a lower-case letter')
})

// this fails if we check last letter before we check all chars
it('gives correct error on ending with capital letter', () => {
expect(validate('freeBSD')).toEqual(
'Can only contain lower-case letters, numbers, and dashes'
)
})

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

it('rejects invalid characters', () => {
expect(validate('aBc')).toEqual(
'Can only contain lower-case letters, numbers, and dashes'
)
expect(validate('asldk:c')).toEqual(
'Can only contain lower-case letters, numbers, and dashes'
)
const err = 'Can only contain lower-case letters, numbers, and dashes'
expect(validate('aBc')).toEqual(err)
expect(validate('asldk:c')).toEqual(err)
expect(validate('Abc-')).toEqual(err)
expect(validate('Abc')).toEqual(err)
})

it('rejects names that are too long', () => {
expect(validate('a'.repeat(64))).toEqual('Must be 63 characters or fewer')
})
Expand Down
4 changes: 2 additions & 2 deletions app/components/form/fields/NameField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@ export const validateName = (name: string, label: string, required: boolean) =>

if (name.length === 0) {
return `${label} is required`
} else if (!/^[a-z0-9-]+$/.test(name)) {
return 'Can only contain lower-case letters, numbers, and dashes'
} else if (!/^[a-z]/.test(name)) {
return 'Must start with a lower-case letter'
} else if (!/[a-z0-9]$/.test(name)) {
return 'Must end with a letter or number'
} else if (!/^[a-z0-9-]+$/.test(name)) {
return 'Can only contain lower-case letters, numbers, and dashes'
}
}
4 changes: 3 additions & 1 deletion test/e2e/project-create.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ test.describe('Project create', () => {
// submit to trigger validation
await page.getByRole('button', { name: 'Create project' }).click()

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

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