@aigne/doc-smith 0.8.12-beta.7 → 0.8.12-beta.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/agents/clear/choose-contents.mjs +14 -1
- package/agents/clear/clear-media-description.mjs +129 -0
- package/agents/clear/index.yaml +3 -1
- package/agents/evaluate/code-snippet.mjs +28 -24
- package/agents/evaluate/document-structure.yaml +0 -4
- package/agents/evaluate/document.yaml +1 -5
- package/agents/generate/index.yaml +1 -0
- package/agents/init/index.mjs +10 -0
- package/agents/media/batch-generate-media-description.yaml +44 -0
- package/agents/media/generate-media-description.yaml +47 -0
- package/agents/media/load-media-description.mjs +238 -0
- package/agents/publish/index.yaml +4 -0
- package/agents/publish/publish-docs.mjs +77 -5
- package/agents/publish/translate-meta.mjs +103 -0
- package/agents/update/generate-document.yaml +30 -28
- package/agents/update/index.yaml +1 -0
- package/agents/update/update-document-detail.yaml +3 -1
- package/agents/utils/load-sources.mjs +103 -53
- package/agents/utils/update-branding.mjs +69 -0
- package/aigne.yaml +6 -0
- package/assets/report-template/report.html +34 -34
- package/package.json +17 -2
- package/prompts/common/document/role-and-personality.md +3 -1
- package/prompts/detail/d2-diagram/guide.md +7 -1
- package/prompts/detail/d2-diagram/user-prompt.md +3 -0
- package/prompts/detail/generate/system-prompt.md +6 -7
- package/prompts/detail/generate/user-prompt.md +12 -3
- package/prompts/detail/update/user-prompt.md +0 -2
- package/prompts/evaluate/document-structure.md +6 -7
- package/prompts/evaluate/document.md +16 -25
- package/prompts/media/media-description/system-prompt.md +35 -0
- package/prompts/media/media-description/user-prompt.md +8 -0
- package/prompts/structure/update/user-prompt.md +0 -4
- package/utils/constants/index.mjs +0 -107
- package/utils/file-utils.mjs +86 -0
- package/utils/markdown-checker.mjs +0 -20
- package/utils/request.mjs +7 -0
- package/utils/upload-files.mjs +231 -0
- package/utils/utils.mjs +11 -1
- package/.aigne/doc-smith/config.yaml +0 -77
- package/.aigne/doc-smith/history.yaml +0 -37
- package/.aigne/doc-smith/output/structure-plan.json +0 -162
- package/.aigne/doc-smith/preferences.yml +0 -97
- package/.aigne/doc-smith/upload-cache.yaml +0 -1893
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
- package/.github/workflows/ci.yml +0 -54
- package/.github/workflows/create-release-pr.yaml +0 -21
- package/.github/workflows/publish-docs.yml +0 -65
- package/.github/workflows/release.yml +0 -49
- package/.github/workflows/reviewer.yml +0 -54
- package/.release-please-manifest.json +0 -3
- package/RELEASE.md +0 -9
- package/assets/screenshots/doc-complete-setup.png +0 -0
- package/assets/screenshots/doc-generate-docs.png +0 -0
- package/assets/screenshots/doc-generate.png +0 -0
- package/assets/screenshots/doc-generated-successfully.png +0 -0
- package/assets/screenshots/doc-publish.png +0 -0
- package/assets/screenshots/doc-regenerate.png +0 -0
- package/assets/screenshots/doc-translate-langs.png +0 -0
- package/assets/screenshots/doc-translate.png +0 -0
- package/assets/screenshots/doc-update.png +0 -0
- package/biome.json +0 -73
- package/codecov.yml +0 -15
- package/docs/_sidebar.md +0 -15
- package/docs/configuration-initial-setup.ja.md +0 -179
- package/docs/configuration-initial-setup.md +0 -179
- package/docs/configuration-initial-setup.zh-TW.md +0 -179
- package/docs/configuration-initial-setup.zh.md +0 -179
- package/docs/configuration-managing-preferences.ja.md +0 -100
- package/docs/configuration-managing-preferences.md +0 -100
- package/docs/configuration-managing-preferences.zh-TW.md +0 -100
- package/docs/configuration-managing-preferences.zh.md +0 -100
- package/docs/configuration.ja.md +0 -96
- package/docs/configuration.md +0 -96
- package/docs/configuration.zh-TW.md +0 -96
- package/docs/configuration.zh.md +0 -96
- package/docs/getting-started.ja.md +0 -88
- package/docs/getting-started.md +0 -88
- package/docs/getting-started.zh-TW.md +0 -88
- package/docs/getting-started.zh.md +0 -88
- package/docs/guides-cleaning-up.ja.md +0 -51
- package/docs/guides-cleaning-up.md +0 -51
- package/docs/guides-cleaning-up.zh-TW.md +0 -51
- package/docs/guides-cleaning-up.zh.md +0 -51
- package/docs/guides-evaluating-documents.ja.md +0 -66
- package/docs/guides-evaluating-documents.md +0 -66
- package/docs/guides-evaluating-documents.zh-TW.md +0 -66
- package/docs/guides-evaluating-documents.zh.md +0 -66
- package/docs/guides-generating-documentation.ja.md +0 -151
- package/docs/guides-generating-documentation.md +0 -151
- package/docs/guides-generating-documentation.zh-TW.md +0 -151
- package/docs/guides-generating-documentation.zh.md +0 -151
- package/docs/guides-interactive-chat.ja.md +0 -85
- package/docs/guides-interactive-chat.md +0 -85
- package/docs/guides-interactive-chat.zh-TW.md +0 -85
- package/docs/guides-interactive-chat.zh.md +0 -85
- package/docs/guides-managing-history.ja.md +0 -48
- package/docs/guides-managing-history.md +0 -48
- package/docs/guides-managing-history.zh-TW.md +0 -48
- package/docs/guides-managing-history.zh.md +0 -48
- package/docs/guides-publishing-your-docs.ja.md +0 -78
- package/docs/guides-publishing-your-docs.md +0 -78
- package/docs/guides-publishing-your-docs.zh-TW.md +0 -78
- package/docs/guides-publishing-your-docs.zh.md +0 -78
- package/docs/guides-translating-documentation.ja.md +0 -95
- package/docs/guides-translating-documentation.md +0 -95
- package/docs/guides-translating-documentation.zh-TW.md +0 -95
- package/docs/guides-translating-documentation.zh.md +0 -95
- package/docs/guides-updating-documentation.ja.md +0 -77
- package/docs/guides-updating-documentation.md +0 -77
- package/docs/guides-updating-documentation.zh-TW.md +0 -77
- package/docs/guides-updating-documentation.zh.md +0 -77
- package/docs/guides.ja.md +0 -32
- package/docs/guides.md +0 -32
- package/docs/guides.zh-TW.md +0 -32
- package/docs/guides.zh.md +0 -32
- package/docs/overview.ja.md +0 -61
- package/docs/overview.md +0 -61
- package/docs/overview.zh-TW.md +0 -61
- package/docs/overview.zh.md +0 -61
- package/docs/release-notes.ja.md +0 -255
- package/docs/release-notes.md +0 -255
- package/docs/release-notes.zh-TW.md +0 -255
- package/docs/release-notes.zh.md +0 -255
- package/media.md +0 -19
- package/prompts/common/afs/afs-tools-usage.md +0 -5
- package/prompts/common/afs/use-afs-instruction.md +0 -1
- package/release-please-config.json +0 -14
- package/tests/agents/chat/chat.test.mjs +0 -46
- package/tests/agents/clear/choose-contents.test.mjs +0 -284
- package/tests/agents/clear/clear-auth-tokens.test.mjs +0 -268
- package/tests/agents/clear/clear-document-config.test.mjs +0 -167
- package/tests/agents/clear/clear-document-structure.test.mjs +0 -380
- package/tests/agents/clear/clear-generated-docs.test.mjs +0 -222
- package/tests/agents/evaluate/code-snippet.test.mjs +0 -163
- package/tests/agents/evaluate/fixtures/api-services.md +0 -87
- package/tests/agents/evaluate/fixtures/js-sdk.md +0 -94
- package/tests/agents/evaluate/generate-report.test.mjs +0 -312
- package/tests/agents/generate/check-document-structure.test.mjs +0 -45
- package/tests/agents/generate/check-need-generate-structure.test.mjs +0 -279
- package/tests/agents/generate/document-structure-tools/add-document.test.mjs +0 -449
- package/tests/agents/generate/document-structure-tools/delete-document.test.mjs +0 -410
- package/tests/agents/generate/document-structure-tools/generate-sub-structure.test.mjs +0 -277
- package/tests/agents/generate/document-structure-tools/move-document.test.mjs +0 -476
- package/tests/agents/generate/document-structure-tools/update-document.test.mjs +0 -548
- package/tests/agents/generate/generate-structure.test.mjs +0 -45
- package/tests/agents/generate/user-review-document-structure.test.mjs +0 -319
- package/tests/agents/history/view.test.mjs +0 -97
- package/tests/agents/init/init.test.mjs +0 -1657
- package/tests/agents/prefs/prefs.test.mjs +0 -431
- package/tests/agents/publish/publish-docs.test.mjs +0 -787
- package/tests/agents/translate/choose-language.test.mjs +0 -311
- package/tests/agents/translate/translate-document.test.mjs +0 -51
- package/tests/agents/update/check-document.test.mjs +0 -463
- package/tests/agents/update/check-update-is-single.test.mjs +0 -300
- package/tests/agents/update/document-tools/update-document-content.test.mjs +0 -329
- package/tests/agents/update/generate-document.test.mjs +0 -51
- package/tests/agents/update/save-and-translate-document.test.mjs +0 -369
- package/tests/agents/update/user-review-document.test.mjs +0 -582
- package/tests/agents/utils/action-success.test.mjs +0 -54
- package/tests/agents/utils/check-detail-result.test.mjs +0 -743
- package/tests/agents/utils/check-feedback-refiner.test.mjs +0 -478
- package/tests/agents/utils/choose-docs.test.mjs +0 -406
- package/tests/agents/utils/exit.test.mjs +0 -70
- package/tests/agents/utils/feedback-refiner.test.mjs +0 -51
- package/tests/agents/utils/find-item-by-path.test.mjs +0 -517
- package/tests/agents/utils/find-user-preferences-by-path.test.mjs +0 -382
- package/tests/agents/utils/format-document-structure.test.mjs +0 -364
- package/tests/agents/utils/fs.test.mjs +0 -267
- package/tests/agents/utils/load-sources.test.mjs +0 -1470
- package/tests/agents/utils/save-docs.test.mjs +0 -109
- package/tests/agents/utils/save-output.test.mjs +0 -315
- package/tests/agents/utils/save-single-doc.test.mjs +0 -364
- package/tests/agents/utils/transform-detail-datasources.test.mjs +0 -320
- package/tests/utils/auth-utils.test.mjs +0 -596
- package/tests/utils/blocklet.test.mjs +0 -336
- package/tests/utils/conflict-detector.test.mjs +0 -355
- package/tests/utils/constants.test.mjs +0 -295
- package/tests/utils/d2-utils.test.mjs +0 -437
- package/tests/utils/deploy.test.mjs +0 -399
- package/tests/utils/docs-finder-utils.test.mjs +0 -650
- package/tests/utils/file-utils.test.mjs +0 -521
- package/tests/utils/history-utils.test.mjs +0 -206
- package/tests/utils/kroki-utils.test.mjs +0 -646
- package/tests/utils/linter/fixtures/css/keyword-error.css +0 -1
- package/tests/utils/linter/fixtures/css/missing-semicolon.css +0 -1
- package/tests/utils/linter/fixtures/css/syntax-error.css +0 -1
- package/tests/utils/linter/fixtures/css/undeclare-variable.css +0 -1
- package/tests/utils/linter/fixtures/css/unused-variable.css +0 -2
- package/tests/utils/linter/fixtures/css/valid-code.css +0 -1
- package/tests/utils/linter/fixtures/dockerfile/keyword-error.dockerfile +0 -1
- package/tests/utils/linter/fixtures/dockerfile/missing-semicolon.dockerfile +0 -2
- package/tests/utils/linter/fixtures/dockerfile/syntax-error.dockerfile +0 -2
- package/tests/utils/linter/fixtures/dockerfile/undeclare-variable.dockerfile +0 -1
- package/tests/utils/linter/fixtures/dockerfile/unused-variable.dockerfile +0 -1
- package/tests/utils/linter/fixtures/dockerfile/valid-code.dockerfile +0 -2
- package/tests/utils/linter/fixtures/go/keyword-error.go +0 -5
- package/tests/utils/linter/fixtures/go/missing-semicolon.go +0 -5
- package/tests/utils/linter/fixtures/go/syntax-error.go +0 -6
- package/tests/utils/linter/fixtures/go/undeclare-variable.go +0 -5
- package/tests/utils/linter/fixtures/go/unused-variable.go +0 -5
- package/tests/utils/linter/fixtures/go/valid-code.go +0 -7
- package/tests/utils/linter/fixtures/js/keyword-error.js +0 -3
- package/tests/utils/linter/fixtures/js/missing-semicolon.js +0 -6
- package/tests/utils/linter/fixtures/js/syntax-error.js +0 -4
- package/tests/utils/linter/fixtures/js/undeclare-variable.js +0 -3
- package/tests/utils/linter/fixtures/js/unused-variable.js +0 -7
- package/tests/utils/linter/fixtures/js/valid-code.js +0 -15
- package/tests/utils/linter/fixtures/json/keyword-error.json +0 -1
- package/tests/utils/linter/fixtures/json/missing-semicolon.json +0 -1
- package/tests/utils/linter/fixtures/json/syntax-error.json +0 -1
- package/tests/utils/linter/fixtures/json/undeclare-variable.json +0 -1
- package/tests/utils/linter/fixtures/json/unused-variable.json +0 -1
- package/tests/utils/linter/fixtures/json/valid-code.json +0 -1
- package/tests/utils/linter/fixtures/jsx/keyword-error.jsx +0 -5
- package/tests/utils/linter/fixtures/jsx/missing-semicolon.jsx +0 -5
- package/tests/utils/linter/fixtures/jsx/syntax-error.jsx +0 -5
- package/tests/utils/linter/fixtures/jsx/undeclare-variable.jsx +0 -5
- package/tests/utils/linter/fixtures/jsx/unused-variable.jsx +0 -4
- package/tests/utils/linter/fixtures/jsx/valid-code.jsx +0 -5
- package/tests/utils/linter/fixtures/python/keyword-error.py +0 -3
- package/tests/utils/linter/fixtures/python/missing-semicolon.py +0 -2
- package/tests/utils/linter/fixtures/python/syntax-error.py +0 -3
- package/tests/utils/linter/fixtures/python/undeclare-variable.py +0 -3
- package/tests/utils/linter/fixtures/python/unused-variable.py +0 -6
- package/tests/utils/linter/fixtures/python/valid-code.py +0 -12
- package/tests/utils/linter/fixtures/ruby/keyword-error.rb +0 -2
- package/tests/utils/linter/fixtures/ruby/missing-semicolon.rb +0 -1
- package/tests/utils/linter/fixtures/ruby/syntax-error.rb +0 -2
- package/tests/utils/linter/fixtures/ruby/undeclare-variable.rb +0 -1
- package/tests/utils/linter/fixtures/ruby/unused-variable.rb +0 -2
- package/tests/utils/linter/fixtures/ruby/valid-code.rb +0 -1
- package/tests/utils/linter/fixtures/sass/keyword-error.sass +0 -2
- package/tests/utils/linter/fixtures/sass/missing-semicolon.sass +0 -3
- package/tests/utils/linter/fixtures/sass/syntax-error.sass +0 -3
- package/tests/utils/linter/fixtures/sass/undeclare-variable.sass +0 -2
- package/tests/utils/linter/fixtures/sass/unused-variable.sass +0 -4
- package/tests/utils/linter/fixtures/sass/valid-code.sass +0 -2
- package/tests/utils/linter/fixtures/scss/keyword-error.scss +0 -1
- package/tests/utils/linter/fixtures/scss/missing-semicolon.scss +0 -1
- package/tests/utils/linter/fixtures/scss/syntax-error.scss +0 -1
- package/tests/utils/linter/fixtures/scss/undeclare-variable.scss +0 -1
- package/tests/utils/linter/fixtures/scss/unused-variable.scss +0 -2
- package/tests/utils/linter/fixtures/scss/valid-code.scss +0 -1
- package/tests/utils/linter/fixtures/shell/keyword-error.sh +0 -5
- package/tests/utils/linter/fixtures/shell/missing-semicolon.sh +0 -3
- package/tests/utils/linter/fixtures/shell/syntax-error.sh +0 -4
- package/tests/utils/linter/fixtures/shell/undeclare-variable.sh +0 -3
- package/tests/utils/linter/fixtures/shell/unused-variable.sh +0 -4
- package/tests/utils/linter/fixtures/shell/valid-code.sh +0 -3
- package/tests/utils/linter/fixtures/ts/keyword-error.ts +0 -1
- package/tests/utils/linter/fixtures/ts/missing-semicolon.ts +0 -1
- package/tests/utils/linter/fixtures/ts/syntax-error.ts +0 -1
- package/tests/utils/linter/fixtures/ts/undeclare-variable.ts +0 -1
- package/tests/utils/linter/fixtures/ts/unused-variable.ts +0 -3
- package/tests/utils/linter/fixtures/ts/valid-code.ts +0 -3
- package/tests/utils/linter/fixtures/tsx/keyword-error.tsx +0 -5
- package/tests/utils/linter/fixtures/tsx/missing-semicolon.tsx +0 -5
- package/tests/utils/linter/fixtures/tsx/syntax-error.tsx +0 -5
- package/tests/utils/linter/fixtures/tsx/undeclare-variable.tsx +0 -6
- package/tests/utils/linter/fixtures/tsx/unused-variable.tsx +0 -6
- package/tests/utils/linter/fixtures/tsx/valid-code.tsx +0 -5
- package/tests/utils/linter/fixtures/vue/keyword-error.vue +0 -6
- package/tests/utils/linter/fixtures/vue/missing-semicolon.vue +0 -6
- package/tests/utils/linter/fixtures/vue/syntax-error.vue +0 -6
- package/tests/utils/linter/fixtures/vue/undeclare-variable.vue +0 -6
- package/tests/utils/linter/fixtures/vue/unused-variable.vue +0 -7
- package/tests/utils/linter/fixtures/vue/valid-code.vue +0 -6
- package/tests/utils/linter/fixtures/yaml/keyword-error.yml +0 -1
- package/tests/utils/linter/fixtures/yaml/missing-semicolon.yml +0 -2
- package/tests/utils/linter/fixtures/yaml/syntax-error.yml +0 -1
- package/tests/utils/linter/fixtures/yaml/undeclare-variable.yml +0 -1
- package/tests/utils/linter/fixtures/yaml/unused-variable.yml +0 -2
- package/tests/utils/linter/fixtures/yaml/valid-code.yml +0 -3
- package/tests/utils/linter/index.test.mjs +0 -440
- package/tests/utils/linter/scan-results.mjs +0 -42
- package/tests/utils/load-config.test.mjs +0 -141
- package/tests/utils/markdown/index.test.mjs +0 -478
- package/tests/utils/mermaid-validator.test.mjs +0 -541
- package/tests/utils/mock-chat-model.mjs +0 -12
- package/tests/utils/preferences-utils.test.mjs +0 -465
- package/tests/utils/save-value-to-config.test.mjs +0 -483
- package/tests/utils/utils.test.mjs +0 -941
|
@@ -1,449 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test";
|
|
2
|
-
import addDocument from "../../../../agents/generate/document-structure-tools/add-document.mjs";
|
|
3
|
-
|
|
4
|
-
describe("add-document", () => {
|
|
5
|
-
let consoleSpy;
|
|
6
|
-
let baseDocumentStructure;
|
|
7
|
-
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
consoleSpy = spyOn(console, "log").mockImplementation(() => {});
|
|
10
|
-
baseDocumentStructure = [
|
|
11
|
-
{
|
|
12
|
-
title: "Getting Started",
|
|
13
|
-
description: "Introduction to the project",
|
|
14
|
-
path: "/getting-started",
|
|
15
|
-
parentId: null,
|
|
16
|
-
sourceIds: ["intro.md"],
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
title: "API Reference",
|
|
20
|
-
description: "Complete API documentation",
|
|
21
|
-
path: "/api",
|
|
22
|
-
parentId: null,
|
|
23
|
-
sourceIds: ["api.js"],
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
title: "Authentication",
|
|
27
|
-
description: "How to authenticate with the API",
|
|
28
|
-
path: "/api/auth",
|
|
29
|
-
parentId: "/api",
|
|
30
|
-
sourceIds: ["auth.js", "security.md"],
|
|
31
|
-
},
|
|
32
|
-
];
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
afterEach(() => {
|
|
36
|
-
consoleSpy?.mockRestore();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
// SUCCESSFUL ADDITION TESTS
|
|
40
|
-
test("should add a new top-level document successfully", async () => {
|
|
41
|
-
const result = await addDocument({
|
|
42
|
-
documentStructure: baseDocumentStructure,
|
|
43
|
-
title: "Deployment Guide",
|
|
44
|
-
description: "How to deploy the application",
|
|
45
|
-
path: "/deployment",
|
|
46
|
-
parentId: null,
|
|
47
|
-
sourceIds: ["deploy.md", "docker.yml"],
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
expect(result.documentStructure).toHaveLength(4);
|
|
51
|
-
expect(result.addedDocument).toEqual({
|
|
52
|
-
title: "Deployment Guide",
|
|
53
|
-
description: "How to deploy the application",
|
|
54
|
-
path: "/deployment",
|
|
55
|
-
parentId: null,
|
|
56
|
-
sourceIds: ["deploy.md", "docker.yml"],
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
// Verify original structure is unchanged
|
|
60
|
-
expect(result.documentStructure.slice(0, 3)).toEqual(baseDocumentStructure);
|
|
61
|
-
expect(result.documentStructure[3]).toEqual(result.addedDocument);
|
|
62
|
-
expect(consoleSpy).not.toHaveBeenCalled();
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
test("should add a child document successfully", async () => {
|
|
66
|
-
const result = await addDocument({
|
|
67
|
-
documentStructure: baseDocumentStructure,
|
|
68
|
-
title: "Rate Limiting",
|
|
69
|
-
description: "API rate limiting documentation",
|
|
70
|
-
path: "/api/rate-limiting",
|
|
71
|
-
parentId: "/api",
|
|
72
|
-
sourceIds: ["rate-limit.js"],
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
expect(result.documentStructure).toHaveLength(4);
|
|
76
|
-
expect(result.addedDocument).toEqual({
|
|
77
|
-
title: "Rate Limiting",
|
|
78
|
-
description: "API rate limiting documentation",
|
|
79
|
-
path: "/api/rate-limiting",
|
|
80
|
-
parentId: "/api",
|
|
81
|
-
sourceIds: ["rate-limit.js"],
|
|
82
|
-
});
|
|
83
|
-
expect(consoleSpy).not.toHaveBeenCalled();
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
test("should handle undefined parentId as null", async () => {
|
|
87
|
-
const result = await addDocument({
|
|
88
|
-
documentStructure: baseDocumentStructure,
|
|
89
|
-
title: "FAQ",
|
|
90
|
-
description: "Frequently asked questions",
|
|
91
|
-
path: "/faq",
|
|
92
|
-
parentId: undefined,
|
|
93
|
-
sourceIds: ["faq.md"],
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
expect(result.addedDocument.parentId).toBeNull();
|
|
97
|
-
expect(result.documentStructure).toHaveLength(4);
|
|
98
|
-
expect(consoleSpy).not.toHaveBeenCalled();
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
test("should handle empty string parentId as null", async () => {
|
|
102
|
-
const result = await addDocument({
|
|
103
|
-
documentStructure: baseDocumentStructure,
|
|
104
|
-
title: "Changelog",
|
|
105
|
-
description: "Project changelog",
|
|
106
|
-
path: "/changelog",
|
|
107
|
-
parentId: "",
|
|
108
|
-
sourceIds: ["changelog.md"],
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
expect(result.addedDocument.parentId).toBeNull();
|
|
112
|
-
expect(result.documentStructure).toHaveLength(4);
|
|
113
|
-
expect(consoleSpy).not.toHaveBeenCalled();
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
test("should handle string 'null' parentId but keep it as string", async () => {
|
|
117
|
-
const result = await addDocument({
|
|
118
|
-
documentStructure: baseDocumentStructure,
|
|
119
|
-
title: "License",
|
|
120
|
-
description: "Project license information",
|
|
121
|
-
path: "/license",
|
|
122
|
-
parentId: "null",
|
|
123
|
-
sourceIds: ["license.txt"],
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
// The code treats "null" as a string and doesn't convert it to null
|
|
127
|
-
// But it's still treated as a top-level document in validation
|
|
128
|
-
expect(result.addedDocument.parentId).toBe("null");
|
|
129
|
-
expect(result.documentStructure).toHaveLength(4);
|
|
130
|
-
expect(consoleSpy).not.toHaveBeenCalled();
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
test("should create a copy of sourceIds array", async () => {
|
|
134
|
-
const originalSourceIds = ["source1.js", "source2.md"];
|
|
135
|
-
const result = await addDocument({
|
|
136
|
-
documentStructure: baseDocumentStructure,
|
|
137
|
-
title: "Test Document",
|
|
138
|
-
description: "Test description",
|
|
139
|
-
path: "/test",
|
|
140
|
-
parentId: null,
|
|
141
|
-
sourceIds: originalSourceIds,
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
// Verify it's a copy, not a reference
|
|
145
|
-
expect(result.addedDocument.sourceIds).toEqual(originalSourceIds);
|
|
146
|
-
expect(result.addedDocument.sourceIds).not.toBe(originalSourceIds);
|
|
147
|
-
|
|
148
|
-
// Modifying original should not affect the added document
|
|
149
|
-
originalSourceIds.push("source3.js");
|
|
150
|
-
expect(result.addedDocument.sourceIds).not.toContain("source3.js");
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
// VALIDATION ERROR TESTS - MISSING PARAMETERS
|
|
154
|
-
test("should return error when title is missing", async () => {
|
|
155
|
-
const result = await addDocument({
|
|
156
|
-
documentStructure: baseDocumentStructure,
|
|
157
|
-
description: "Test description",
|
|
158
|
-
path: "/test",
|
|
159
|
-
sourceIds: ["test.md"],
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
expect(result.documentStructure).toEqual(baseDocumentStructure);
|
|
163
|
-
expect(result.addedDocument).toBeUndefined();
|
|
164
|
-
expect(consoleSpy).toHaveBeenCalledWith("⚠️ Cannot add document: title: Required");
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
test("should return error when description is missing", async () => {
|
|
168
|
-
const result = await addDocument({
|
|
169
|
-
documentStructure: baseDocumentStructure,
|
|
170
|
-
title: "Test Title",
|
|
171
|
-
path: "/test",
|
|
172
|
-
sourceIds: ["test.md"],
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
expect(result.documentStructure).toEqual(baseDocumentStructure);
|
|
176
|
-
expect(result.addedDocument).toBeUndefined();
|
|
177
|
-
expect(consoleSpy).toHaveBeenCalledWith("⚠️ Cannot add document: description: Required");
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
test("should return error when path is missing", async () => {
|
|
181
|
-
const result = await addDocument({
|
|
182
|
-
documentStructure: baseDocumentStructure,
|
|
183
|
-
title: "Test Title",
|
|
184
|
-
description: "Test description",
|
|
185
|
-
sourceIds: ["test.md"],
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
expect(result.documentStructure).toEqual(baseDocumentStructure);
|
|
189
|
-
expect(result.addedDocument).toBeUndefined();
|
|
190
|
-
expect(consoleSpy).toHaveBeenCalledWith("⚠️ Cannot add document: path: Required");
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
test("should return error when sourceIds is missing", async () => {
|
|
194
|
-
const result = await addDocument({
|
|
195
|
-
documentStructure: baseDocumentStructure,
|
|
196
|
-
title: "Test Title",
|
|
197
|
-
description: "Test description",
|
|
198
|
-
path: "/test",
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
expect(result.documentStructure).toEqual(baseDocumentStructure);
|
|
202
|
-
expect(result.addedDocument).toBeUndefined();
|
|
203
|
-
expect(consoleSpy).toHaveBeenCalledWith("⚠️ Cannot add document: sourceIds: Required");
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
test("should return error when sourceIds is not an array", async () => {
|
|
207
|
-
const result = await addDocument({
|
|
208
|
-
documentStructure: baseDocumentStructure,
|
|
209
|
-
title: "Test Title",
|
|
210
|
-
description: "Test description",
|
|
211
|
-
path: "/test",
|
|
212
|
-
sourceIds: "not-an-array",
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
expect(result.documentStructure).toEqual(baseDocumentStructure);
|
|
216
|
-
expect(result.addedDocument).toBeUndefined();
|
|
217
|
-
expect(consoleSpy).toHaveBeenCalledWith(
|
|
218
|
-
"⚠️ Cannot add document: sourceIds: Expected array, received string",
|
|
219
|
-
);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
test("should return error when sourceIds is empty array", async () => {
|
|
223
|
-
const result = await addDocument({
|
|
224
|
-
documentStructure: baseDocumentStructure,
|
|
225
|
-
title: "Test Title",
|
|
226
|
-
description: "Test description",
|
|
227
|
-
path: "/test",
|
|
228
|
-
sourceIds: [],
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
expect(result.documentStructure).toEqual(baseDocumentStructure);
|
|
232
|
-
expect(result.addedDocument).toBeUndefined();
|
|
233
|
-
expect(consoleSpy).toHaveBeenCalledWith(
|
|
234
|
-
"⚠️ Cannot add document: sourceIds: At least one source ID is required",
|
|
235
|
-
);
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
// PATH VALIDATION TESTS
|
|
239
|
-
test("should return error when path does not start with /", async () => {
|
|
240
|
-
const result = await addDocument({
|
|
241
|
-
documentStructure: baseDocumentStructure,
|
|
242
|
-
title: "Test Title",
|
|
243
|
-
description: "Test description",
|
|
244
|
-
path: "invalid-path",
|
|
245
|
-
sourceIds: ["test.md"],
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
expect(result.documentStructure).toEqual(baseDocumentStructure);
|
|
249
|
-
expect(result.addedDocument).toBeUndefined();
|
|
250
|
-
expect(consoleSpy).toHaveBeenCalledWith(
|
|
251
|
-
'⚠️ Cannot add document: path: Path must start with "/"',
|
|
252
|
-
);
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
test("should accept valid path formats", async () => {
|
|
256
|
-
const validPaths = ["/test", "/api/endpoint", "/deep/nested/path", "/single"];
|
|
257
|
-
|
|
258
|
-
for (const path of validPaths) {
|
|
259
|
-
const result = await addDocument({
|
|
260
|
-
documentStructure: baseDocumentStructure,
|
|
261
|
-
title: "Test Title",
|
|
262
|
-
description: "Test description",
|
|
263
|
-
path,
|
|
264
|
-
sourceIds: ["test.md"],
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
expect(result.addedDocument.path).toBe(path);
|
|
268
|
-
expect(consoleSpy).not.toHaveBeenCalled();
|
|
269
|
-
consoleSpy.mockClear();
|
|
270
|
-
}
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
// PARENT VALIDATION TESTS
|
|
274
|
-
test("should return error when parent document does not exist", async () => {
|
|
275
|
-
const result = await addDocument({
|
|
276
|
-
documentStructure: baseDocumentStructure,
|
|
277
|
-
title: "Test Title",
|
|
278
|
-
description: "Test description",
|
|
279
|
-
path: "/test",
|
|
280
|
-
parentId: "/nonexistent-parent",
|
|
281
|
-
sourceIds: ["test.md"],
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
expect(result.documentStructure).toEqual(baseDocumentStructure);
|
|
285
|
-
expect(result.addedDocument).toBeUndefined();
|
|
286
|
-
expect(consoleSpy).toHaveBeenCalledWith(
|
|
287
|
-
"⚠️ Cannot add document: Parent document '/nonexistent-parent' not found.",
|
|
288
|
-
);
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
test("should accept existing parent document", async () => {
|
|
292
|
-
const result = await addDocument({
|
|
293
|
-
documentStructure: baseDocumentStructure,
|
|
294
|
-
title: "New API Endpoint",
|
|
295
|
-
description: "Documentation for new endpoint",
|
|
296
|
-
path: "/api/new-endpoint",
|
|
297
|
-
parentId: "/api",
|
|
298
|
-
sourceIds: ["endpoint.js"],
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
expect(result.addedDocument.parentId).toBe("/api");
|
|
302
|
-
expect(result.documentStructure).toHaveLength(4);
|
|
303
|
-
expect(consoleSpy).not.toHaveBeenCalled();
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
// DUPLICATE PATH TESTS
|
|
307
|
-
test("should return error when document with same path already exists", async () => {
|
|
308
|
-
const result = await addDocument({
|
|
309
|
-
documentStructure: baseDocumentStructure,
|
|
310
|
-
title: "Duplicate",
|
|
311
|
-
description: "This will conflict",
|
|
312
|
-
path: "/getting-started", // This path already exists
|
|
313
|
-
sourceIds: ["duplicate.md"],
|
|
314
|
-
});
|
|
315
|
-
|
|
316
|
-
expect(result.documentStructure).toEqual(baseDocumentStructure);
|
|
317
|
-
expect(result.addedDocument).toBeUndefined();
|
|
318
|
-
expect(consoleSpy).toHaveBeenCalledWith(
|
|
319
|
-
"⚠️ Cannot add document: A document with path '/getting-started' already exists. Choose a different path.",
|
|
320
|
-
);
|
|
321
|
-
});
|
|
322
|
-
|
|
323
|
-
test("should allow different paths even with similar content", async () => {
|
|
324
|
-
const result = await addDocument({
|
|
325
|
-
documentStructure: baseDocumentStructure,
|
|
326
|
-
title: "Getting Started", // Same title as existing
|
|
327
|
-
description: "Different getting started guide",
|
|
328
|
-
path: "/getting-started-advanced", // Different path
|
|
329
|
-
sourceIds: ["advanced.md"],
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
expect(result.documentStructure).toHaveLength(4);
|
|
333
|
-
expect(result.addedDocument.path).toBe("/getting-started-advanced");
|
|
334
|
-
expect(consoleSpy).not.toHaveBeenCalled();
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
// EDGE CASES
|
|
338
|
-
test("should handle empty documentation structure", async () => {
|
|
339
|
-
const result = await addDocument({
|
|
340
|
-
documentStructure: [],
|
|
341
|
-
title: "First Document",
|
|
342
|
-
description: "The first document ever",
|
|
343
|
-
path: "/first",
|
|
344
|
-
parentId: null,
|
|
345
|
-
sourceIds: ["first.md"],
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
expect(result.documentStructure).toHaveLength(1);
|
|
349
|
-
expect(result.addedDocument).toEqual({
|
|
350
|
-
title: "First Document",
|
|
351
|
-
description: "The first document ever",
|
|
352
|
-
path: "/first",
|
|
353
|
-
parentId: null,
|
|
354
|
-
sourceIds: ["first.md"],
|
|
355
|
-
});
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
test("should handle complex nested structure", async () => {
|
|
359
|
-
const complexStructure = [
|
|
360
|
-
...baseDocumentStructure,
|
|
361
|
-
{
|
|
362
|
-
title: "Deep Nested",
|
|
363
|
-
description: "Deep nesting test",
|
|
364
|
-
path: "/api/auth/oauth",
|
|
365
|
-
parentId: "/api/auth",
|
|
366
|
-
sourceIds: ["oauth.js"],
|
|
367
|
-
},
|
|
368
|
-
];
|
|
369
|
-
|
|
370
|
-
const result = await addDocument({
|
|
371
|
-
documentStructure: complexStructure,
|
|
372
|
-
title: "OAuth Scopes",
|
|
373
|
-
description: "OAuth scope documentation",
|
|
374
|
-
path: "/api/auth/oauth/scopes",
|
|
375
|
-
parentId: "/api/auth/oauth",
|
|
376
|
-
sourceIds: ["scopes.md"],
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
expect(result.documentStructure).toHaveLength(5);
|
|
380
|
-
expect(result.addedDocument.parentId).toBe("/api/auth/oauth");
|
|
381
|
-
expect(consoleSpy).not.toHaveBeenCalled();
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
test("should handle special characters in paths", async () => {
|
|
385
|
-
const result = await addDocument({
|
|
386
|
-
documentStructure: baseDocumentStructure,
|
|
387
|
-
title: "Special Characters",
|
|
388
|
-
description: "Document with special chars in path",
|
|
389
|
-
path: "/api/special-chars_and.numbers123",
|
|
390
|
-
sourceIds: ["special.md"],
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
expect(result.addedDocument.path).toBe("/api/special-chars_and.numbers123");
|
|
394
|
-
expect(result.documentStructure).toHaveLength(4);
|
|
395
|
-
expect(consoleSpy).not.toHaveBeenCalled();
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
test("should handle multiple source IDs", async () => {
|
|
399
|
-
const multipleSourceIds = [
|
|
400
|
-
"main.js",
|
|
401
|
-
"helper.js",
|
|
402
|
-
"documentation.md",
|
|
403
|
-
"examples/example1.js",
|
|
404
|
-
"examples/example2.js",
|
|
405
|
-
];
|
|
406
|
-
|
|
407
|
-
const result = await addDocument({
|
|
408
|
-
documentStructure: baseDocumentStructure,
|
|
409
|
-
title: "Multi-Source Doc",
|
|
410
|
-
description: "Document with multiple sources",
|
|
411
|
-
path: "/multi-source",
|
|
412
|
-
sourceIds: multipleSourceIds,
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
expect(result.addedDocument.sourceIds).toEqual(multipleSourceIds);
|
|
416
|
-
expect(result.addedDocument.sourceIds).toHaveLength(5);
|
|
417
|
-
expect(consoleSpy).not.toHaveBeenCalled();
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
// DATA INTEGRITY TESTS
|
|
421
|
-
test("should not modify original documentation structure", async () => {
|
|
422
|
-
const originalStructure = [...baseDocumentStructure];
|
|
423
|
-
|
|
424
|
-
await addDocument({
|
|
425
|
-
documentStructure: baseDocumentStructure,
|
|
426
|
-
title: "New Document",
|
|
427
|
-
description: "Test document",
|
|
428
|
-
path: "/new",
|
|
429
|
-
sourceIds: ["new.md"],
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
expect(baseDocumentStructure).toEqual(originalStructure);
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
test("should create independent document objects", async () => {
|
|
436
|
-
const result = await addDocument({
|
|
437
|
-
documentStructure: baseDocumentStructure,
|
|
438
|
-
title: "Independent Doc",
|
|
439
|
-
description: "Test independence",
|
|
440
|
-
path: "/independent",
|
|
441
|
-
sourceIds: ["independent.md"],
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
// Modifying the added document should not affect the original structure
|
|
445
|
-
result.addedDocument.title = "Modified Title";
|
|
446
|
-
expect(result.documentStructure[3].title).toBe("Modified Title");
|
|
447
|
-
expect(baseDocumentStructure.find((doc) => doc.path === "/independent")).toBeUndefined();
|
|
448
|
-
});
|
|
449
|
-
});
|