48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
|
import { resolveAwardWinner } from '@/server/services/award-winner-resolver'
|
|
|
|
describe('resolveAwardWinner', () => {
|
|
it('returns the sole voted project when all agree', () => {
|
|
const votes = [
|
|
{ userId: 'u1', projectId: 'p1' },
|
|
{ userId: 'u2', projectId: 'p1' },
|
|
]
|
|
expect(resolveAwardWinner(votes, 'u1')).toBe('p1')
|
|
})
|
|
|
|
it('returns the majority winner when no tie', () => {
|
|
const votes = [
|
|
{ userId: 'u1', projectId: 'p1' },
|
|
{ userId: 'u2', projectId: 'p2' },
|
|
{ userId: 'u3', projectId: 'p1' },
|
|
]
|
|
expect(resolveAwardWinner(votes, 'u1')).toBe('p1')
|
|
})
|
|
|
|
it('uses chair vote as tiebreaker', () => {
|
|
const votes = [
|
|
{ userId: 'chair', projectId: 'p2' },
|
|
{ userId: 'u2', projectId: 'p1' },
|
|
]
|
|
expect(resolveAwardWinner(votes, 'chair')).toBe('p2')
|
|
})
|
|
|
|
it('returns chair pick when tied and chair voted for one of the tied projects', () => {
|
|
const votes = [
|
|
{ userId: 'chair', projectId: 'p3' },
|
|
{ userId: 'u2', projectId: 'p1' },
|
|
{ userId: 'u3', projectId: 'p2' },
|
|
]
|
|
expect(resolveAwardWinner(votes, 'chair')).toBe('p3')
|
|
})
|
|
|
|
it('returns sole vote for solo sponsor', () => {
|
|
const votes = [{ userId: 'sponsor', projectId: 'p1' }]
|
|
expect(resolveAwardWinner(votes, 'sponsor')).toBe('p1')
|
|
})
|
|
|
|
it('throws if no votes', () => {
|
|
expect(() => resolveAwardWinner([], 'chair')).toThrow()
|
|
})
|
|
})
|