71 lines
3.3 KiB
TypeScript
71 lines
3.3 KiB
TypeScript
import { createHash } from 'node:crypto';
|
|
import { readFileSync } from 'node:fs';
|
|
import { join } from 'node:path';
|
|
import { describe, expect, test } from 'vitest';
|
|
import { isRendererReloadTarget } from './main/dev-reload';
|
|
|
|
const styleFiles = [
|
|
'styles.css',
|
|
'styles-workflows.css',
|
|
'styles-overlays.css',
|
|
'workspace.css',
|
|
'workspace-refinements.css',
|
|
];
|
|
|
|
describe('production style modules', () => {
|
|
test('preserves the complete stylesheet byte sequence across module boundaries', () => {
|
|
const content = Buffer.from(styleFiles
|
|
.map((fileName) => readFileSync(join(__dirname, fileName), 'utf8'))
|
|
.join('')
|
|
.replace(/\r\n/g, '\n'));
|
|
const digest = createHash('sha256').update(content).digest('hex');
|
|
|
|
expect(digest).toBe('db798e79ce538bd99fe6a21fa9de545150a2d0efd4a925e6f662a664bdb6ff03');
|
|
});
|
|
|
|
test('derives the Windows hot-development executable version from package metadata', () => {
|
|
const script = readFileSync(join(__dirname, '../scripts/dev.mjs'), 'utf8');
|
|
|
|
expect(script).toContain("readFileSync(resolve(rootDirectory, 'package.json'), 'utf8')");
|
|
expect(script).toMatch(/version:\s*developmentAppVersion/);
|
|
expect(script).not.toMatch(/version:\s*['"]\d+\.\d+\.\d+['"]/);
|
|
});
|
|
|
|
test('reloads every production stylesheet during hot development', () => {
|
|
for (const fileName of styleFiles) {
|
|
expect(isRendererReloadTarget(fileName), fileName).toBe(true);
|
|
}
|
|
expect(isRendererReloadTarget('future-workspace-surface.css')).toBe(true);
|
|
});
|
|
|
|
test('loads and packages every stylesheet in cascade order', () => {
|
|
const html = readFileSync(join(__dirname, 'index.html'), 'utf8');
|
|
const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8')) as {
|
|
build?: { files?: string[] };
|
|
};
|
|
const links = Array.from(html.matchAll(/<link rel="stylesheet" href="\.\/([^"?]+)"/g), (match) => match[1]);
|
|
|
|
expect(links).toEqual(styleFiles);
|
|
for (const fileName of styleFiles) {
|
|
expect(packageJson.build?.files).toContain(`src/${fileName}`);
|
|
}
|
|
expect(packageJson.build?.files).toContain('!dist/main/dev-executable.js');
|
|
expect(packageJson.build?.files).toContain('!dist/main/index.js');
|
|
expect(packageJson.build?.files).toContain('!dist/types.js');
|
|
});
|
|
|
|
test('animates queue progress only while downloading and visibly marks paused items', () => {
|
|
const styles = readFileSync(join(__dirname, 'styles-workflows.css'), 'utf8');
|
|
const baseShimmer = styles.match(/\.queue-progress-bar::after\s*\{([\s\S]*?)\}/)?.[1] ?? '';
|
|
const activeShimmer = styles.match(/\.queue-item:has\(\.status\.downloading\)\s+\.queue-progress-bar::after\s*\{([\s\S]*?)\}/)?.[1] ?? '';
|
|
const pausedStatus = styles.match(/\.queue-item\s+\.status\.paused\s*\{([\s\S]*?)\}/)?.[1] ?? '';
|
|
|
|
expect(baseShimmer).toMatch(/display:\s*none/);
|
|
expect(baseShimmer).toMatch(/animation:\s*none/);
|
|
expect(activeShimmer).toMatch(/display:\s*block/);
|
|
expect(activeShimmer).toMatch(/animation:\s*queue-progress-shimmer/);
|
|
expect(pausedStatus).toMatch(/background:/);
|
|
expect(pausedStatus).toMatch(/box-shadow:/);
|
|
});
|
|
});
|