import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; import { newFixture, type Fixture } from '../helpers/fixture.js'; let fixture: Fixture; beforeEach(async () => { vi.resetModules(); fixture = await newFixture( { 'hud.gsc': 'v1', 'zom.gsc': 'v1', 'perks/perk1.gsc': 'p1' }, ['t5_kino_1', 't5_ascension_1'] ); }); afterEach(async () => { await fixture.cleanup(); }); describe('doPush', () => { it('adds every source file on a fresh server', async () => { const { doPush } = await import('../../src/lib/server/fleet/push.js'); const { seedServerRegistry } = await import('../../src/lib/server/fleet/servers.js'); await seedServerRegistry(); const res = await doPush({ patterns: ['*'], dryRun: false, create: false }); expect(res.totalChangedServers).toBe(2); expect(res.totalFiles).toBe(3 * 2); expect(res.deploymentId).toBeTruthy(); const written = await readFile(join(fixture.t5, 't5_kino_1', 'runtime/plutonium/storage/t5/raw/scripts/sp/hud.gsc'), 'utf8'); expect(written).toBe('v1'); }); it('dry-run makes no changes and creates no deployment row', async () => { const { doPush } = await import('../../src/lib/server/fleet/push.js'); const { seedServerRegistry } = await import('../../src/lib/server/fleet/servers.js'); await seedServerRegistry(); const res = await doPush({ patterns: ['*'], dryRun: true, create: false }); expect(res.deploymentId).toBeNull(); expect(res.totalChangedServers).toBe(2); // no file created await expect(readFile(join(fixture.t5, 't5_kino_1', 'runtime/plutonium/storage/t5/raw/scripts/sp/hud.gsc'))).rejects.toThrow(); }); it('skips servers that are already up to date', async () => { const { doPush } = await import('../../src/lib/server/fleet/push.js'); const { seedServerRegistry } = await import('../../src/lib/server/fleet/servers.js'); await seedServerRegistry(); await doPush({ patterns: ['*'], dryRun: false }); // second run: everything matches → no deployment const res = await doPush({ patterns: ['*'], dryRun: false }); expect(res.deploymentId).toBeNull(); expect(res.totalChangedServers).toBe(0); }); });