Persist Plutonium keys by server ID and add key management
This commit is contained in:
@@ -118,3 +118,50 @@ describe('server creation map selection', () => {
|
||||
expect(komodoCreateDeployment).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
describe('persistent server keys', () => {
|
||||
it('saves a key, retains it through destruction, and reuses it for the exact lobby', async () => {
|
||||
const { createServer, destroyServer } = await import('../../src/lib/server/fleet/create.js');
|
||||
const { getServerKey, listServerKeys } = await import('../../src/lib/server/fleet/server-keys.js');
|
||||
const { komodoCreateDeployment, komodoInspectHealthy } = await import('../../src/lib/server/integrations/komodo.js');
|
||||
vi.mocked(komodoInspectHealthy).mockResolvedValue({ ok: false, kind: 'not-found', message: 'gone' } as never);
|
||||
const name = 't5_zombie_cosmodrome_2';
|
||||
expect(await createServer({ ...input, lobby: 2 })).toMatchObject({ ok: true, name });
|
||||
expect(getServerKey(name)).toBe('test-key');
|
||||
expect(await destroyServer(name)).toMatchObject({ ok: true });
|
||||
expect(listServerKeys()).toEqual([expect.objectContaining({ server_id: name, deployed: 0 })]);
|
||||
expect(JSON.stringify(listServerKeys())).not.toContain('test-key');
|
||||
expect(await createServer({ gameMode: 'zombie', mapSlug: 'cosmodrome', lobby: 2 })).toMatchObject({ ok: true, name });
|
||||
const spec = vi.mocked(komodoCreateDeployment).mock.calls.at(-1)![0];
|
||||
expect(spec.environment).toContainEqual({ variable: 'PLUTO_SERVER_KEY', value: 'test-key' });
|
||||
expect(await createServer({ gameMode: 'zombie', mapSlug: 'cosmodrome', lobby: 1 })).toMatchObject({ ok: false, kind: 'bad-request' });
|
||||
});
|
||||
|
||||
it('updates and removes keys independently of deployments and survives reopening the database', async () => {
|
||||
const { saveServerKey, getServerKey, removeServerKey } = await import('../../src/lib/server/fleet/server-keys.js');
|
||||
const { closeDb } = await import('../../src/lib/server/db/index.js');
|
||||
saveServerKey(serverName, ' first-key ');
|
||||
closeDb();
|
||||
expect(getServerKey(serverName)).toBe('first-key');
|
||||
saveServerKey(serverName, 'replacement');
|
||||
expect(getServerKey(serverName)).toBe('replacement');
|
||||
expect(removeServerKey(serverName)).toBe(true);
|
||||
expect(getServerKey(serverName)).toBeUndefined();
|
||||
expect(() => saveServerKey('t5_zombie_unknown_1', 'key')).toThrow();
|
||||
expect(() => saveServerKey(serverName, ' ')).toThrow();
|
||||
expect(() => saveServerKey(serverName, 'two words')).toThrow();
|
||||
});
|
||||
|
||||
it('rejects invalid or occupied lobbies before external operations', async () => {
|
||||
const { createServer } = await import('../../src/lib/server/fleet/create.js');
|
||||
const { komodoCreateDeployment } = await import('../../src/lib/server/integrations/komodo.js');
|
||||
for (const lobby of [0, 21, 1.5]) {
|
||||
expect(await createServer({ ...input, lobby })).toMatchObject({ ok: false, kind: 'bad-request' });
|
||||
}
|
||||
expect(komodoCreateDeployment).not.toHaveBeenCalled();
|
||||
expect(await createServer({ ...input, lobby: 2 })).toMatchObject({ ok: true });
|
||||
expect(await createServer({ ...input, lobby: 2 })).toMatchObject({ ok: false, kind: 'no-slot' });
|
||||
expect(komodoCreateDeployment).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user