Skip to content

Commit 9f252c9

Browse files
committed
fix(SeverityPicker): use S1-S4 severity values matching Bugzilla Mozilla
Bugzilla Mozilla uses S1, S2, S3, S4, N/A severity levels, not the traditional named severities (blocker, critical, etc.). Updated: - SeverityPicker options to S1-S4 and N/A - Card severityColors mapping to S1-S4 - All related tests to use S1-S4 values
1 parent 0dfb954 commit 9f252c9

File tree

4 files changed

+56
-77
lines changed

4 files changed

+56
-77
lines changed

src/components/Board/Card.test.tsx

Lines changed: 31 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const mockBug: BugzillaBug = {
3838
status: 'NEW',
3939
assigned_to: 'developer@example.com',
4040
priority: 'P2',
41-
severity: 'major',
41+
severity: 'S3',
4242
component: 'Authentication',
4343
whiteboard: '[kanban]',
4444
last_change_time: '2024-01-15T10:30:00Z',
@@ -90,7 +90,7 @@ describe('Card', () => {
9090
it('should render severity', () => {
9191
render(<Card bug={mockBug} />)
9292

93-
expect(screen.getByText('major')).toBeInTheDocument()
93+
expect(screen.getByText('S3')).toBeInTheDocument()
9494
})
9595

9696
it('should render component', () => {
@@ -157,52 +157,44 @@ describe('Card', () => {
157157
})
158158

159159
describe('severity badge', () => {
160-
it('should show blocker severity with error color', () => {
161-
const blockerBug = { ...mockBug, severity: 'blocker' }
162-
render(<Card bug={blockerBug} />)
160+
it('should show S1 severity with error color', () => {
161+
const s1Bug = { ...mockBug, severity: 'S1' }
162+
render(<Card bug={s1Bug} />)
163163

164-
const severityBadge = screen.getByText('blocker')
164+
const severityBadge = screen.getByText('S1')
165165
expect(severityBadge.className).toContain('accent-error')
166166
})
167167

168-
it('should show critical severity with error color', () => {
169-
const criticalBug = { ...mockBug, severity: 'critical' }
170-
render(<Card bug={criticalBug} />)
168+
it('should show S2 severity with warning color', () => {
169+
const s2Bug = { ...mockBug, severity: 'S2' }
170+
render(<Card bug={s2Bug} />)
171171

172-
const severityBadge = screen.getByText('critical')
173-
expect(severityBadge.className).toContain('accent-error')
174-
})
175-
176-
it('should show major severity with warning color', () => {
177-
const majorBug = { ...mockBug, severity: 'major' }
178-
render(<Card bug={majorBug} />)
179-
180-
const severityBadge = screen.getByText('major')
172+
const severityBadge = screen.getByText('S2')
181173
expect(severityBadge.className).toContain('accent-warning')
182174
})
183175

184-
it('should show normal severity with default color', () => {
185-
const normalBug = { ...mockBug, severity: 'normal' }
186-
render(<Card bug={normalBug} />)
176+
it('should show S3 severity with secondary text color', () => {
177+
const s3Bug = { ...mockBug, severity: 'S3' }
178+
render(<Card bug={s3Bug} />)
187179

188-
const severityBadge = screen.getByText('normal')
189-
expect(severityBadge.className).toContain('text-tertiary')
180+
const severityBadge = screen.getByText('S3')
181+
expect(severityBadge.className).toContain('text-secondary')
190182
})
191183

192-
it('should show minor severity with success color', () => {
193-
const minorBug = { ...mockBug, severity: 'minor' }
194-
render(<Card bug={minorBug} />)
184+
it('should show S4 severity with primary accent color', () => {
185+
const s4Bug = { ...mockBug, severity: 'S4' }
186+
render(<Card bug={s4Bug} />)
195187

196-
const severityBadge = screen.getByText('minor')
197-
expect(severityBadge.className).toContain('accent-success')
188+
const severityBadge = screen.getByText('S4')
189+
expect(severityBadge.className).toContain('accent-primary')
198190
})
199191

200-
it('should show trivial severity with success color', () => {
201-
const trivialBug = { ...mockBug, severity: 'trivial' }
202-
render(<Card bug={trivialBug} />)
192+
it('should show N/A severity with tertiary text color', () => {
193+
const naBug = { ...mockBug, severity: 'N/A' }
194+
render(<Card bug={naBug} />)
203195

204-
const severityBadge = screen.getByText('trivial')
205-
expect(severityBadge.className).toContain('accent-success')
196+
const severityBadge = screen.getByText('N/A')
197+
expect(severityBadge.className).toContain('text-tertiary')
206198
})
207199
})
208200

@@ -748,9 +740,9 @@ describe('Card', () => {
748740
render(<Card bug={mockBug} onSeverityChange={onSeverityChange} />)
749741

750742
await user.click(screen.getByLabelText('Change severity'))
751-
await user.click(screen.getByText('critical'))
743+
await user.click(screen.getByText('S1'))
752744

753-
expect(onSeverityChange).toHaveBeenCalledWith(mockBug.id, 'critical')
745+
expect(onSeverityChange).toHaveBeenCalledWith(mockBug.id, 'S1')
754746
})
755747

756748
it('should show isSeverityStaged indicator when severity is staged', () => {
@@ -766,15 +758,13 @@ describe('Card', () => {
766758
bug={mockBug}
767759
onSeverityChange={vi.fn()}
768760
isSeverityStaged={true}
769-
stagedSeverity="blocker"
761+
stagedSeverity="S1"
770762
/>,
771763
)
772764

773-
// Should show staged severity, not original major
774-
const severityBadges = screen.getAllByText(
775-
/blocker|critical|major|normal|minor|trivial|enhancement/,
776-
)
777-
expect(severityBadges[0]).toHaveTextContent('blocker')
765+
// Should show staged severity, not original S3
766+
const severityBadges = screen.getAllByText(/S1|S2|S3|S4|N\/A/)
767+
expect(severityBadges[0]).toHaveTextContent('S1')
778768
})
779769

780770
it('should not trigger card onClick when clicking severity button', async () => {

src/components/Board/Card.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,11 @@ const priorityColors: Record<string, string> = {
4747
}
4848

4949
const severityColors: Record<string, string> = {
50-
blocker: 'text-accent-error',
51-
critical: 'text-accent-error',
52-
major: 'text-accent-warning',
53-
normal: 'text-text-tertiary',
54-
minor: 'text-accent-success',
55-
trivial: 'text-accent-success',
56-
enhancement: 'text-accent-primary',
50+
S1: 'text-accent-error',
51+
S2: 'text-accent-warning',
52+
S3: 'text-text-secondary',
53+
S4: 'text-accent-primary',
54+
'N/A': 'text-text-tertiary',
5755
}
5856

5957
export function Card({

src/components/Board/SeverityPicker.test.tsx

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('SeverityPicker', () => {
1717
isOpen: true,
1818
onClose: vi.fn(),
1919
onSelect: vi.fn(),
20-
currentSeverity: 'normal',
20+
currentSeverity: 'S3',
2121
}
2222

2323
beforeEach(() => {
@@ -40,20 +40,18 @@ describe('SeverityPicker', () => {
4040
it('should render all severity options', () => {
4141
render(<SeverityPicker {...defaultProps} />)
4242

43-
expect(screen.getByText('blocker')).toBeInTheDocument()
44-
expect(screen.getByText('critical')).toBeInTheDocument()
45-
expect(screen.getByText('major')).toBeInTheDocument()
46-
expect(screen.getByText('normal')).toBeInTheDocument()
47-
expect(screen.getByText('minor')).toBeInTheDocument()
48-
expect(screen.getByText('trivial')).toBeInTheDocument()
49-
expect(screen.getByText('enhancement')).toBeInTheDocument()
43+
expect(screen.getByText('S1')).toBeInTheDocument()
44+
expect(screen.getByText('S2')).toBeInTheDocument()
45+
expect(screen.getByText('S3')).toBeInTheDocument()
46+
expect(screen.getByText('S4')).toBeInTheDocument()
47+
expect(screen.getByText('N/A')).toBeInTheDocument()
5048
})
5149

5250
it('should show severity descriptions', () => {
5351
render(<SeverityPicker {...defaultProps} />)
5452

55-
expect(screen.getByText(/blocks development/i)).toBeInTheDocument()
56-
expect(screen.getByText(/feature request/i)).toBeInTheDocument()
53+
expect(screen.getByText(/catastrophic/i)).toBeInTheDocument()
54+
expect(screen.getByText(/not applicable/i)).toBeInTheDocument()
5755
})
5856
})
5957

@@ -62,25 +60,25 @@ describe('SeverityPicker', () => {
6260
const onSelect = vi.fn()
6361
render(<SeverityPicker {...defaultProps} onSelect={onSelect} />)
6462

65-
fireEvent.click(screen.getByText('critical'))
63+
fireEvent.click(screen.getByText('S1'))
6664

67-
expect(onSelect).toHaveBeenCalledWith('critical')
65+
expect(onSelect).toHaveBeenCalledWith('S1')
6866
})
6967

7068
it('should call onClose after selection', () => {
7169
const onClose = vi.fn()
7270
render(<SeverityPicker {...defaultProps} onClose={onClose} />)
7371

74-
fireEvent.click(screen.getByText('major'))
72+
fireEvent.click(screen.getByText('S2'))
7573

7674
expect(onClose).toHaveBeenCalled()
7775
})
7876

7977
it('should highlight currently selected severity', () => {
80-
render(<SeverityPicker {...defaultProps} currentSeverity="major" />)
78+
render(<SeverityPicker {...defaultProps} currentSeverity="S2" />)
8179

8280
const selectedOption = screen.getByRole('option', { selected: true })
83-
expect(selectedOption).toHaveTextContent('major')
81+
expect(selectedOption).toHaveTextContent('S2')
8482
})
8583
})
8684

@@ -122,7 +120,7 @@ describe('SeverityPicker', () => {
122120
render(<SeverityPicker {...defaultProps} />)
123121

124122
const options = screen.getAllByRole('option')
125-
expect(options).toHaveLength(7) // blocker, critical, major, normal, minor, trivial, enhancement
123+
expect(options).toHaveLength(5) // S1, S2, S3, S4, N/A
126124
})
127125
})
128126

@@ -132,7 +130,7 @@ describe('SeverityPicker', () => {
132130

133131
// Each severity should have a colored indicator dot
134132
const colorDots = container.querySelectorAll('[class*="rounded-full"][class*="w-3"]')
135-
expect(colorDots).toHaveLength(7)
133+
expect(colorDots).toHaveLength(5)
136134
})
137135
})
138136
})

src/components/Board/SeverityPicker.tsx

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,11 @@ interface SeverityPickerProps {
1515
}
1616

1717
const SEVERITY_OPTIONS = [
18-
{ value: 'blocker', label: 'blocker', description: 'Blocks development', color: 'bg-red-700' },
19-
{ value: 'critical', label: 'critical', description: 'Severe impact', color: 'bg-red-500' },
20-
{ value: 'major', label: 'major', description: 'Major functionality', color: 'bg-orange-500' },
21-
{ value: 'normal', label: 'normal', description: 'Default severity', color: 'bg-gray-500' },
22-
{ value: 'minor', label: 'minor', description: 'Minor issue', color: 'bg-green-500' },
23-
{ value: 'trivial', label: 'trivial', description: 'Trivial fix', color: 'bg-green-400' },
24-
{
25-
value: 'enhancement',
26-
label: 'enhancement',
27-
description: 'Feature request',
28-
color: 'bg-blue-500',
29-
},
18+
{ value: 'S1', label: 'S1', description: 'Catastrophic', color: 'bg-red-500' },
19+
{ value: 'S2', label: 'S2', description: 'Serious', color: 'bg-orange-500' },
20+
{ value: 'S3', label: 'S3', description: 'Normal', color: 'bg-yellow-500' },
21+
{ value: 'S4', label: 'S4', description: 'Minor', color: 'bg-blue-500' },
22+
{ value: 'N/A', label: 'N/A', description: 'Not applicable', color: 'bg-gray-500' },
3023
] as const
3124

3225
export function SeverityPicker({

0 commit comments

Comments
 (0)