返回 oh-my-ppt
io-domain-boundaries.test.ts
根目录 / tests / unit / io / io-domain-boundaries.test.ts
1 import fs from 'fs'
2 import path from 'path'
3 import { describe, expect, it } from 'vitest'
4
5 const canonicalIoFiles = [
6 'src/main/io/local-asset-roots.ts',
7 'src/main/io/assets-handlers.ts',
8 'src/main/io/file-handlers.ts',
9 'src/main/io/export-handlers.ts',
10 'src/main/io/document-csv-to-markdown.ts',
11 'src/main/io/document-outline-scan.ts',
12 'src/main/io/document-parse-handlers.ts',
13 'src/main/io/document-plan-normalizer.ts',
14 'src/main/io/document-plan-page-skeleton.ts',
15 'src/main/io/pptx-import/index.ts',
16 'src/main/io/pptx-import/animation-import.ts',
17 'src/main/io/pptx-import/chart-rewrite-agent.ts',
18 'src/main/io/pptx-import/progress.ts',
19 'src/main/io/pptx-import/shape-view-box.ts',
20 'src/main/io/pptx-import/text-validator.ts',
21 'src/main/io/pptx-import/xml-shape-metadata.ts',
22 'src/main/io/pptx-import/handlers.ts',
23 'src/main/io/html-video/exporter.ts',
24 'src/main/io/html-pptx/renderer.ts',
25 'src/main/io/thumbnails/html-thumbnail-service.ts',
26 'src/main/io/thumbnails/png-stitch.ts',
27 'src/main/io/thumbnails/handlers.ts'
28 ]
29
30 const removedIoPaths = [
31 'src/main/utils/pptx-importer/index.ts',
32 'src/main/utils/pptx-animation-import.ts',
33 'src/main/utils/pptx-chart-rewrite-agent.ts',
34 'src/main/utils/pptx-ooxml-path-renderer.ts',
35 'src/main/utils/pptx-svg-shape-geometry.ts',
36 'src/main/io/pptx-import/ooxml-path-renderer.ts',
37 'src/main/io/pptx-import/svg-shape-geometry.ts',
38 'src/main/utils/pptx-text-validator.ts',
39 'src/main/utils/pptx-xml-shape-metadata.ts',
40 'src/main/ipc/io/pptx-import-progress.ts',
41 'src/main/ipc/io/pptx-import-handlers.ts',
42 'src/main/utils/html-pptx/browser-scripts.ts',
43 'src/main/utils/html-pptx/renderer.ts',
44 'src/main/utils/html-thumbnail-service.ts',
45 'src/main/utils/html-video/exporter.ts',
46 'src/main/utils/png-stitch.ts',
47 'src/main/ipc/io/thumbnail-handlers.ts',
48 'src/main/ipc/io/local-asset-roots.ts',
49 'src/main/ipc/io/assets-handlers.ts',
50 'src/main/ipc/io/file-handlers.ts',
51 'src/main/ipc/io/export-handlers.ts',
52 'src/main/ipc/io/document-csv-to-markdown.ts',
53 'src/main/ipc/io/document-outline-scan.ts',
54 'src/main/ipc/io/document-parse-handlers.ts',
55 'src/main/ipc/io/document-plan-normalizer.ts',
56 'src/main/ipc/io/document-plan-page-skeleton.ts'
57 ]
58
59 const readTypeScriptSources = (directory: string): Array<{ filePath: string; source: string }> => {
60 const sources: Array<{ filePath: string; source: string }> = []
61 for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
62 const filePath = path.join(directory, entry.name)
63 if (entry.isDirectory()) {
64 sources.push(...readTypeScriptSources(filePath))
65 } else if (entry.isFile() && /\.tsx?$/.test(entry.name)) {
66 sources.push({ filePath, source: fs.readFileSync(filePath, 'utf8') })
67 }
68 }
69 return sources
70 }
71
72 describe('I/O domain boundaries', () => {
73 it('owns document, asset, export, PPTX, HTML-PPTX, thumbnail, and local-asset capabilities in io/', () => {
74 expect(canonicalIoFiles.filter((filePath) => !fs.existsSync(filePath))).toEqual([])
75 })
76
77 it('removes legacy I/O paths after every caller migrates', () => {
78 expect(removedIoPaths.filter((filePath) => fs.existsSync(filePath))).toEqual([])
79 })
80
81 it('does not let application code import an old I/O path', () => {
82 const removedFragments = [
83 'utils/pptx-importer',
84 'utils/pptx-animation-import',
85 'utils/pptx-chart-rewrite-agent',
86 'utils/pptx-ooxml-path-renderer',
87 'utils/pptx-svg-shape-geometry',
88 'io/pptx-import/ooxml-path-renderer',
89 'io/pptx-import/svg-shape-geometry',
90 'utils/pptx-text-validator',
91 'utils/pptx-xml-shape-metadata',
92 'ipc/io/pptx-import-progress',
93 'ipc/io/pptx-import-handlers',
94 'utils/html-pptx',
95 'utils/html-thumbnail-service',
96 'utils/html-video/exporter',
97 'utils/png-stitch',
98 'ipc/io/thumbnail-handlers',
99 'ipc/io/local-asset-roots',
100 'ipc/io/assets-handlers',
101 'ipc/io/file-handlers',
102 'ipc/io/export-handlers',
103 'ipc/io/document-csv-to-markdown',
104 'ipc/io/document-outline-scan',
105 'ipc/io/document-parse-handlers',
106 'ipc/io/document-plan-normalizer',
107 'ipc/io/document-plan-page-skeleton'
108 ]
109 for (const { filePath, source } of readTypeScriptSources('src/main')) {
110 for (const fragment of removedFragments) {
111 expect(source, `${filePath}: ${fragment}`).not.toContain(fragment)
112 }
113 }
114 })
115 })
116
116 lines TYPESCRIPT