import { describe, expect, it } from 'vitest' import { ref } from 'vue' import { useGroupAssignment } from '../../composables/useGroupAssignment' import type { GroupItem } from '../../types' const groups: GroupItem[] = [ { name: 'control-a', color: '#3B82F6', count: 3 }, { name: 'control-b', color: '#06B6D4', count: 2 }, { name: 'treatment-a', color: '#F43F5E', count: 4 }, ] describe('useGroupAssignment', () => { it('derives zone groups, unassigned groups, counts, and validation state', () => { const assignment = useGroupAssignment({ groups, group1: ['control-a'], group2: [], label1: 'Control', label2: 'Treatment', minPerGroup: 1, }) expect(assignment.zone1Groups.value.map(group => group.name)).toEqual(['control-a']) expect(assignment.zone2Groups.value).toEqual([]) expect(assignment.unassignedGroups.value.map(group => group.name)).toEqual(['control-b', 'treatment-a']) expect(assignment.zone1Count.value).toBe(3) expect(assignment.zone2Count.value).toBe(0) expect(assignment.isValid.value).toBe(false) expect(assignment.validationMessage.value).toBe('Add 1 more to Treatment') }) it('moves assignments between zones without mutating the input arrays', () => { const group1 = ['control-a'] const group2 = ['treatment-a'] const assignment = useGroupAssignment({ groups, group1, group2 }) expect(assignment.getZoneForGroup('control-a')).toBe('zone1') expect(assignment.assignToZone('control-a', 'zone2')).toEqual({ group1: [], group2: ['treatment-a', 'control-a'], }) expect(assignment.removeFromZone('treatment-a', 'zone2')).toEqual({ group1: ['control-a'], group2: [], }) expect(assignment.clearAll()).toEqual({ group1: [], group2: [] }) expect(group1).toEqual(['control-a']) expect(group2).toEqual(['treatment-a']) }) it('updates from reactive sources and normalizes minimum group counts', () => { const group1 = ref([]) const group2 = ref(['treatment-a']) const minPerGroup = ref(2.8) const assignment = useGroupAssignment({ groups: () => groups, group1, group2, minPerGroup, }) expect(assignment.isValid.value).toBe(false) expect(assignment.validationMessage.value).toBe('Add 2 more to Control and 1 more to Treatment') group1.value = ['control-a', 'control-b'] group2.value = ['treatment-a', 'control-a'] minPerGroup.value = 0 expect(assignment.isValid.value).toBe(true) expect(assignment.validationMessage.value).toBeNull() expect(assignment.unassignedGroups.value).toEqual([]) }) })