import { describe, it } from 'node:test'; import assert from 'node:assert/strict'; import { PartyService } from '../src/services/PartyService'; describe('PartyService', () => { it('create() sets mediaType and seeds the host as the first member', () => { const party = PartyService.create('u-alice', 'Alice', 'ep1', 'S01E01 - Pilote', '/img/ep1', [ { itemId: 'ep1', itemName: 'S01E01 - Pilote', itemImageUrl: '/img/ep1' }, { itemId: 'ep2', itemName: 'S01E02 - Suite', itemImageUrl: '/img/ep2' } ], 'video'); assert.equal(party.mediaType, 'video'); assert.equal(party.members.size, 1); assert.equal(party.hostUserId, 'u-alice'); }); it('advanceQueue moves through the fixed queue and stops at the end', () => { const party = PartyService.create('u-alice', 'Alice', 'ep1', 'S01E01', '/img/ep1', [ { itemId: 'ep1', itemName: 'S01E01', itemImageUrl: '/img/ep1' }, { itemId: 'ep2', itemName: 'S01E02', itemImageUrl: '/img/ep2' } ], 'video'); assert.equal(PartyService.advanceQueue(party), true); assert.equal(party.itemId, 'ep2'); assert.equal(PartyService.advanceQueue(party), false, 'nothing left after the last item'); }); it('leave(): a non-host leaving neither destroys the party nor hands off', () => { const party = PartyService.create('u-alice', 'Alice', 'm1', 'Un Film', '/img/m1', null, 'video'); PartyService.join(party, 'u-bob', 'Bob'); const result = PartyService.leave(party, 'u-bob'); assert.equal(result.destroyed, false); assert.equal(result.hostChanged, false); }); it('leave(): the host leaving with someone left hands off, and party.hostUserId actually updates', () => { const party = PartyService.create('u-alice', 'Alice', 'm1', 'Un Film', '/img/m1', null, 'video'); PartyService.join(party, 'u-bob', 'Bob'); const result = PartyService.leave(party, 'u-alice'); assert.equal(result.hostChanged, true); assert.equal(result.newHostUserId, 'u-bob'); assert.equal(party.hostUserId, 'u-bob'); }); it('leave(): the last member leaving destroys the party', () => { const party = PartyService.create('u-alice', 'Alice', 'm1', 'Un Film', '/img/m1', null, 'video'); const result = PartyService.leave(party, 'u-alice'); assert.equal(result.destroyed, true); assert.equal(PartyService.getById(party.id), null); }); it('removeIdleParties sweeps a party whose lastActivityUtc is past the cutoff', () => { const party = PartyService.create('u-dave', 'Dave', 'm1', 'Un Film', '/img/m1', null, 'video'); party.lastActivityUtc = Date.now() - 5 * 60 * 60 * 1000; PartyService.removeIdleParties(4 * 60 * 60 * 1000); assert.equal(PartyService.getById(party.id), null); }); it('toPublicState reports youAreHost for the creator, and music:null for a video party', () => { const party = PartyService.create('u-eve', 'Eve', 'm2', 'Un Autre Film', '/img/m2', null, 'video'); const state = PartyService.toPublicState(party, 'u-eve'); assert.equal(state.youAreHost, true); assert.equal(state.music, null); }); });