返回 oh-my-ppt
session-domain-boundaries.test.ts
根目录 / tests / unit / session / session-domain-boundaries.test.ts
1 import fs from 'fs'
2 import path from 'path'
3 import { describe, expect, it } from 'vitest'
4
5 const canonicalSessionFiles = [
6 'src/main/session/handlers.ts',
7 'src/main/session/import-handlers.ts',
8 'src/main/session/save-as-new.ts',
9 'src/main/session/page-assets.ts',
10 'src/main/session/page-html-builders.ts',
11 'src/main/session/page-management-handlers.ts',
12 'src/main/session/page-management-service.ts',
13 'src/main/session/page-merge-concurrency.ts',
14 'src/main/session/page-merge-handlers.ts',
15 'src/main/session/page-merge-rewriter.ts',
16 'src/main/session/page-merge-service.ts',
17 'src/main/session/page-outline-utils.ts',
18 'src/main/session/presentation-handlers.ts',
19 'src/main/session/preview-handlers.ts',
20 'src/main/session/runtime-assets.ts',
21 'src/main/session/template-builder.ts'
22 ]
23
24 const removedSessionPaths = [
25 'src/main/ipc/session/session-handlers.ts',
26 'src/main/ipc/session/session-import-handlers.ts',
27 'src/main/ipc/session/session-save-as-new.ts',
28 'src/main/ipc/session/page-assets.ts',
29 'src/main/ipc/session/page-html-builders.ts',
30 'src/main/ipc/session/page-management-handlers.ts',
31 'src/main/ipc/session/page-management-service.ts',
32 'src/main/ipc/session/page-merge-concurrency.ts',
33 'src/main/ipc/session/page-merge-handlers.ts',
34 'src/main/ipc/session/page-merge-rewriter.ts',
35 'src/main/ipc/session/page-merge-service.ts',
36 'src/main/ipc/session/page-outline-utils.ts',
37 'src/main/ipc/session/presentation-handlers.ts',
38 'src/main/ipc/session/preview-handlers.ts',
39 'src/main/ipc/session/runtime-assets.ts',
40 'src/main/ipc/session/template-builder.ts'
41 ]
42
43 const readTypeScriptSources = (directory: string): Array<{ filePath: string; source: string }> => {
44 const sources: Array<{ filePath: string; source: string }> = []
45 for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
46 const filePath = path.join(directory, entry.name)
47 if (entry.isDirectory()) {
48 sources.push(...readTypeScriptSources(filePath))
49 } else if (entry.isFile() && /\.tsx?$/.test(entry.name)) {
50 sources.push({ filePath, source: fs.readFileSync(filePath, 'utf8') })
51 }
52 }
53 return sources
54 }
55
56 describe('session domain boundaries', () => {
57 it('owns session handlers, page management, merge, preview, and presentation in session/', () => {
58 expect(canonicalSessionFiles.filter((filePath) => !fs.existsSync(filePath))).toEqual([])
59 })
60
61 it('removes legacy IPC session paths after every caller migrates', () => {
62 expect(removedSessionPaths.filter((filePath) => fs.existsSync(filePath))).toEqual([])
63 })
64
65 it('does not let application code import an old IPC session path', () => {
66 for (const { filePath, source } of readTypeScriptSources('src/main')) {
67 expect(source, filePath).not.toContain('ipc/session')
68 }
69 })
70 })
71
71 lines TYPESCRIPT