38 lines
1.7 KiB
JavaScript
38 lines
1.7 KiB
JavaScript
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { mkdtempSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
import { tmpdir } from 'node:os';
|
|
import path from 'node:path';
|
|
import * as sets from '../../lib/icons/sets.js';
|
|
|
|
const PNG = Buffer.from([0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a]);
|
|
let dir;
|
|
beforeEach(() => { dir = mkdtempSync(path.join(tmpdir(), 'iconsets-')); sets._setDirs({ setsDir: dir, bundledDir: path.join(dir, '__bundled') }); mkdirSync(path.join(dir, '__bundled'), { recursive: true }); writeFileSync(path.join(dir, '__bundled', 'router.svg'), '<svg><path/></svg>'); });
|
|
|
|
describe('sets store', () => {
|
|
it('lists the read-only bundled set', async () => {
|
|
const list = await sets.listSets();
|
|
const dev = list.find(s => s.set === 'devices');
|
|
expect(dev.readonly).toBe(true);
|
|
expect(dev.icons).toContain('router.svg');
|
|
});
|
|
it('writes + lists an uploaded set', async () => {
|
|
await sets.writeIcon('mine', 'nas.png', PNG);
|
|
const mine = (await sets.listSets()).find(s => s.set === 'mine');
|
|
expect(mine.readonly).toBe(false);
|
|
expect(mine.icons).toContain('nas.png');
|
|
});
|
|
it('refuses to write the reserved bundled set', async () => {
|
|
await expect(sets.writeIcon('devices', 'x.png', PNG)).rejects.toThrow();
|
|
});
|
|
it('deletes an uploaded set, not the bundled one', async () => {
|
|
await sets.writeIcon('mine', 'a.png', PNG);
|
|
await sets.deleteSet('mine');
|
|
expect((await sets.listSets()).find(s => s.set === 'mine')).toBeUndefined();
|
|
await expect(sets.deleteSet('devices')).rejects.toThrow();
|
|
});
|
|
it('rejects bad slugs (traversal)', async () => {
|
|
await expect(sets.writeIcon('../x', 'a.png', PNG)).rejects.toThrow();
|
|
expect(() => sets.iconPath('mine', '../../etc/passwd')).toThrow();
|
|
});
|
|
});
|