Huge bunch of UI/UX improvements and tweaks!
Some checks failed
Test / vitest (push) Successful in 10m36s
Test / playwright (push) Failing after 9m23s
Test / visual (push) Failing after 9m13s
Test / Notify on failure (push) Successful in 2s

This commit is contained in:
Jennie Robinson Faber 2026-04-06 16:17:12 +01:00
parent 501be10bfe
commit fb25e72215
37 changed files with 1651 additions and 949 deletions

View file

@ -22,6 +22,9 @@ vi.mock('../../../server/utils/slack.ts', () => ({
vi.mock('../../../server/utils/resend.js', () => ({
sendWelcomeEmail: vi.fn().mockResolvedValue(undefined)
}))
vi.mock('../../../server/utils/memberNumber.js', () => ({
assignMemberNumber: vi.fn().mockResolvedValue(1)
}))
import Member from '../../../server/models/member.js'
import { validateBody } from '../../../server/utils/validateBody.js'

View file

@ -0,0 +1,64 @@
import { describe, it, expect, vi, beforeEach } from 'vitest'
vi.mock('../../../server/models/counter.js', () => ({
default: {
findOneAndUpdate: vi.fn()
}
}))
vi.mock('../../../server/models/member.js', () => ({
default: {
findByIdAndUpdate: vi.fn()
}
}))
import Counter from '../../../server/models/counter.js'
import Member from '../../../server/models/member.js'
import { assignMemberNumber } from '../../../server/utils/memberNumber.js'
describe('assignMemberNumber', () => {
beforeEach(() => {
vi.clearAllMocks()
Member.findByIdAndUpdate.mockResolvedValue(undefined)
})
it('returns 1 for the first member', async () => {
Counter.findOneAndUpdate.mockResolvedValue({ seq: 1 })
const result = await assignMemberNumber('member-abc')
expect(result).toBe(1)
})
it('increments atomically using findOneAndUpdate with $inc and upsert', async () => {
Counter.findOneAndUpdate.mockResolvedValue({ seq: 5 })
await assignMemberNumber('member-xyz')
expect(Counter.findOneAndUpdate).toHaveBeenCalledWith(
{ _id: 'memberNumber' },
{ $inc: { seq: 1 } },
{ new: true, upsert: true }
)
})
it('saves the member number to the member record without running validators', async () => {
Counter.findOneAndUpdate.mockResolvedValue({ seq: 3 })
await assignMemberNumber('member-abc')
expect(Member.findByIdAndUpdate).toHaveBeenCalledWith(
'member-abc',
{ memberNumber: 3 },
{ runValidators: false }
)
})
it('returns the sequence number for the given member', async () => {
Counter.findOneAndUpdate.mockResolvedValue({ seq: 42 })
const result = await assignMemberNumber('member-999')
expect(result).toBe(42)
})
})