@aigne/doc-smith 0.8.12-beta.8 → 0.8.12
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 +15 -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/update-document-detail.yaml +3 -1
- package/agents/utils/update-branding.mjs +69 -0
- package/package.json +16 -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/structure/update/user-prompt.md +0 -4
- package/utils/file-utils.mjs +69 -24
- 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/media-description.yaml +0 -91
- 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 -1830
- 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 -198
- 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 -69
- package/docs/configuration.md +0 -69
- package/docs/configuration.zh-TW.md +0 -69
- package/docs/configuration.zh.md +0 -69
- package/docs/getting-started.ja.md +0 -107
- package/docs/getting-started.md +0 -107
- package/docs/getting-started.zh-TW.md +0 -107
- package/docs/getting-started.zh.md +0 -107
- package/docs/guides-cleaning-up.ja.md +0 -51
- package/docs/guides-cleaning-up.md +0 -52
- 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 -107
- 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 -89
- 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 -93
- 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 -53
- 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 -83
- 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 -100
- 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 -79
- 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 -288
- package/docs/release-notes.zh-TW.md +0 -255
- package/docs/release-notes.zh.md +0 -255
- 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,399 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from "bun:test";
|
|
2
|
-
import * as openModule from "open";
|
|
3
|
-
import * as authUtilsModule from "../../utils/auth-utils.mjs";
|
|
4
|
-
|
|
5
|
-
// Import the deploy function
|
|
6
|
-
import { deploy } from "../../utils/deploy.mjs";
|
|
7
|
-
import * as utilsModule from "../../utils/utils.mjs";
|
|
8
|
-
|
|
9
|
-
const TEST_HOME_URL = "https_home_test_url";
|
|
10
|
-
const TEST_APP_URL = "https_app_test_url";
|
|
11
|
-
const TEST_DASHBOARD_URL = "https_dashboard_test_url";
|
|
12
|
-
const TEST_SUBSCRIPTION_URL = "https_subscription_test_url";
|
|
13
|
-
|
|
14
|
-
// Mock BrokerClient
|
|
15
|
-
const mockBrokerClient = {
|
|
16
|
-
deploy: mock(),
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const mockBrokerClientConstructor = mock(() => mockBrokerClient);
|
|
20
|
-
|
|
21
|
-
// Mock the payment broker client module
|
|
22
|
-
mock.module("@blocklet/payment-broker-client/node", () => ({
|
|
23
|
-
BrokerClient: mockBrokerClientConstructor,
|
|
24
|
-
STEPS: {
|
|
25
|
-
PAYMENT_PENDING: "PAYMENT_PENDING",
|
|
26
|
-
INSTALLATION_STARTING: "INSTALLATION_STARTING",
|
|
27
|
-
SERVICE_STARTING: "SERVICE_STARTING",
|
|
28
|
-
ACCESS_PREPARING: "ACCESS_PREPARING",
|
|
29
|
-
ACCESS_READY: "ACCESS_READY",
|
|
30
|
-
},
|
|
31
|
-
}));
|
|
32
|
-
|
|
33
|
-
describe("deploy", () => {
|
|
34
|
-
let originalConsole;
|
|
35
|
-
let consoleOutput;
|
|
36
|
-
let getOfficialAccessTokenSpy;
|
|
37
|
-
let saveValueToConfigSpy;
|
|
38
|
-
let openDefaultSpy;
|
|
39
|
-
|
|
40
|
-
beforeEach(() => {
|
|
41
|
-
// Note: DOC_SMITH_BASE_URL is not set, so BASE_URL will be empty string
|
|
42
|
-
|
|
43
|
-
// Mock console to capture output
|
|
44
|
-
consoleOutput = [];
|
|
45
|
-
originalConsole = {
|
|
46
|
-
log: console.log,
|
|
47
|
-
error: console.error,
|
|
48
|
-
};
|
|
49
|
-
console.log = (...args) => consoleOutput.push({ type: "log", args });
|
|
50
|
-
console.error = (...args) => consoleOutput.push({ type: "error", args });
|
|
51
|
-
|
|
52
|
-
// Mock dependencies
|
|
53
|
-
getOfficialAccessTokenSpy = spyOn(authUtilsModule, "getOfficialAccessToken").mockResolvedValue(
|
|
54
|
-
"mock-auth-token",
|
|
55
|
-
);
|
|
56
|
-
saveValueToConfigSpy = spyOn(utilsModule, "saveValueToConfig").mockResolvedValue();
|
|
57
|
-
openDefaultSpy = spyOn(openModule, "default").mockResolvedValue();
|
|
58
|
-
|
|
59
|
-
// Reset mocks
|
|
60
|
-
mockBrokerClientConstructor.mockClear();
|
|
61
|
-
mockBrokerClient.deploy.mockClear();
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
afterEach(() => {
|
|
65
|
-
// Restore console
|
|
66
|
-
console.log = originalConsole.log;
|
|
67
|
-
console.error = originalConsole.error;
|
|
68
|
-
|
|
69
|
-
// Restore all spies
|
|
70
|
-
getOfficialAccessTokenSpy?.mockRestore();
|
|
71
|
-
saveValueToConfigSpy?.mockRestore();
|
|
72
|
-
openDefaultSpy?.mockRestore();
|
|
73
|
-
|
|
74
|
-
// Clean up environment
|
|
75
|
-
delete process.env.NODE_ENV;
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
test("successful deployment flow", async () => {
|
|
79
|
-
// Mock successful deployment result
|
|
80
|
-
const mockResult = {
|
|
81
|
-
appUrl: TEST_APP_URL,
|
|
82
|
-
homeUrl: TEST_HOME_URL,
|
|
83
|
-
dashboardUrl: TEST_DASHBOARD_URL,
|
|
84
|
-
subscriptionUrl: TEST_SUBSCRIPTION_URL,
|
|
85
|
-
vendors: [{ token: "auth-token-123" }],
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
mockBrokerClient.deploy.mockResolvedValue(mockResult);
|
|
89
|
-
|
|
90
|
-
const result = await deploy();
|
|
91
|
-
|
|
92
|
-
// Verify BrokerClient was constructed with correct config
|
|
93
|
-
expect(mockBrokerClientConstructor).toHaveBeenCalledWith({
|
|
94
|
-
authToken: "mock-auth-token",
|
|
95
|
-
baseUrl: "https://docsmith.aigne.io",
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// Verify deploy was called with correct parameters
|
|
99
|
-
expect(mockBrokerClient.deploy).toHaveBeenCalledWith(
|
|
100
|
-
expect.objectContaining({
|
|
101
|
-
cachedCheckoutId: undefined,
|
|
102
|
-
cachedPaymentUrl: undefined,
|
|
103
|
-
pageInfo: expect.objectContaining({
|
|
104
|
-
successMessage: expect.objectContaining({
|
|
105
|
-
en: expect.stringContaining("Congratulations"),
|
|
106
|
-
zh: expect.stringContaining("恭喜您"),
|
|
107
|
-
}),
|
|
108
|
-
}),
|
|
109
|
-
hooks: expect.objectContaining({
|
|
110
|
-
PAYMENT_PENDING: expect.any(Function),
|
|
111
|
-
INSTALLATION_STARTING: expect.any(Function),
|
|
112
|
-
SERVICE_STARTING: expect.any(Function),
|
|
113
|
-
ACCESS_PREPARING: expect.any(Function),
|
|
114
|
-
ACCESS_READY: expect.any(Function),
|
|
115
|
-
}),
|
|
116
|
-
}),
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
// Verify result transformation
|
|
120
|
-
expect(result).toEqual({
|
|
121
|
-
appUrl: TEST_APP_URL,
|
|
122
|
-
homeUrl: TEST_HOME_URL,
|
|
123
|
-
dashboardUrl: TEST_DASHBOARD_URL,
|
|
124
|
-
subscriptionUrl: TEST_SUBSCRIPTION_URL,
|
|
125
|
-
token: "auth-token-123",
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
// Verify console output
|
|
129
|
-
const logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
|
|
130
|
-
expect(logs.some((log) => log.includes("🚀 Starting deployment..."))).toBe(true);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
test("successful deployment with cached parameters", async () => {
|
|
134
|
-
const mockResult = {
|
|
135
|
-
appUrl: TEST_APP_URL,
|
|
136
|
-
homeUrl: TEST_HOME_URL,
|
|
137
|
-
vendors: [{ token: "auth-token-123" }],
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
mockBrokerClient.deploy.mockResolvedValue(mockResult);
|
|
141
|
-
|
|
142
|
-
const result = await deploy("cached-checkout-id", "https://cached-payment.url");
|
|
143
|
-
|
|
144
|
-
// Verify deploy was called with cached parameters
|
|
145
|
-
expect(mockBrokerClient.deploy).toHaveBeenCalledWith(
|
|
146
|
-
expect.objectContaining({
|
|
147
|
-
cachedCheckoutId: "cached-checkout-id",
|
|
148
|
-
cachedPaymentUrl: "https://cached-payment.url",
|
|
149
|
-
}),
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
expect(result.appUrl).toBe(TEST_APP_URL);
|
|
153
|
-
expect(result.token).toBe("auth-token-123");
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
test("handles missing auth token", async () => {
|
|
157
|
-
getOfficialAccessTokenSpy.mockResolvedValue(null);
|
|
158
|
-
|
|
159
|
-
await expect(deploy()).rejects.toThrow("Failed to get official access token");
|
|
160
|
-
|
|
161
|
-
// Verify BrokerClient was not created
|
|
162
|
-
expect(mockBrokerClientConstructor).not.toHaveBeenCalled();
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
test("handles BrokerClient deployment failure", async () => {
|
|
166
|
-
const deployError = new Error("Deployment failed");
|
|
167
|
-
mockBrokerClient.deploy.mockRejectedValue(deployError);
|
|
168
|
-
|
|
169
|
-
await expect(deploy()).rejects.toThrow("Deployment failed");
|
|
170
|
-
|
|
171
|
-
// Verify BrokerClient was created and deploy was called
|
|
172
|
-
expect(mockBrokerClientConstructor).toHaveBeenCalled();
|
|
173
|
-
expect(mockBrokerClient.deploy).toHaveBeenCalled();
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
test("PAYMENT_PENDING hook functionality", async () => {
|
|
177
|
-
let paymentPendingHook;
|
|
178
|
-
|
|
179
|
-
mockBrokerClient.deploy.mockImplementation(async (config) => {
|
|
180
|
-
paymentPendingHook = config.hooks.PAYMENT_PENDING;
|
|
181
|
-
return {
|
|
182
|
-
appUrl: TEST_APP_URL,
|
|
183
|
-
vendors: [{ token: "test-token" }],
|
|
184
|
-
};
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
await deploy();
|
|
188
|
-
|
|
189
|
-
// Test the PAYMENT_PENDING hook
|
|
190
|
-
await paymentPendingHook({
|
|
191
|
-
sessionId: "session-123",
|
|
192
|
-
paymentUrl: "https://payment.test/session-123",
|
|
193
|
-
isResuming: false,
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
// Verify saveValueToConfig was called
|
|
197
|
-
expect(saveValueToConfigSpy).toHaveBeenCalledWith(
|
|
198
|
-
"checkoutId",
|
|
199
|
-
"session-123",
|
|
200
|
-
"Checkout ID for document deployment website",
|
|
201
|
-
);
|
|
202
|
-
expect(saveValueToConfigSpy).toHaveBeenCalledWith(
|
|
203
|
-
"paymentUrl",
|
|
204
|
-
"https://payment.test/session-123",
|
|
205
|
-
"Payment URL for document deployment website",
|
|
206
|
-
);
|
|
207
|
-
|
|
208
|
-
// Verify browser was opened
|
|
209
|
-
expect(openDefaultSpy).toHaveBeenCalledWith("https://payment.test/session-123");
|
|
210
|
-
|
|
211
|
-
// Verify console output
|
|
212
|
-
const logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
|
|
213
|
-
expect(logs.some((log) => log.includes("⏳ Step 1/4: Waiting for payment..."))).toBe(true);
|
|
214
|
-
expect(logs.some((log) => log.includes("🔗 Payment link:"))).toBe(true);
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
test("PAYMENT_PENDING hook with isResuming=true", async () => {
|
|
218
|
-
let paymentPendingHook;
|
|
219
|
-
|
|
220
|
-
mockBrokerClient.deploy.mockImplementation(async (config) => {
|
|
221
|
-
paymentPendingHook = config.hooks.PAYMENT_PENDING;
|
|
222
|
-
return {
|
|
223
|
-
appUrl: TEST_APP_URL,
|
|
224
|
-
vendors: [{ token: "test-token" }],
|
|
225
|
-
};
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
await deploy();
|
|
229
|
-
|
|
230
|
-
// Test the PAYMENT_PENDING hook with isResuming=true
|
|
231
|
-
await paymentPendingHook({
|
|
232
|
-
sessionId: "session-123",
|
|
233
|
-
paymentUrl: "https://payment.test/session-123",
|
|
234
|
-
isResuming: true,
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
// Verify browser was NOT opened when resuming
|
|
238
|
-
expect(openDefaultSpy).not.toHaveBeenCalled();
|
|
239
|
-
|
|
240
|
-
// But saveValueToConfig should still be called
|
|
241
|
-
expect(saveValueToConfigSpy).toHaveBeenCalledWith(
|
|
242
|
-
"checkoutId",
|
|
243
|
-
"session-123",
|
|
244
|
-
"Checkout ID for document deployment website",
|
|
245
|
-
);
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
test("other hooks functionality", async () => {
|
|
249
|
-
let hooks;
|
|
250
|
-
|
|
251
|
-
mockBrokerClient.deploy.mockImplementation(async (config) => {
|
|
252
|
-
hooks = config.hooks;
|
|
253
|
-
return {
|
|
254
|
-
appUrl: TEST_APP_URL,
|
|
255
|
-
vendors: [{ token: "test-token" }],
|
|
256
|
-
};
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
await deploy();
|
|
260
|
-
|
|
261
|
-
// Test INSTALLATION_STARTING hook
|
|
262
|
-
hooks.INSTALLATION_STARTING();
|
|
263
|
-
let logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
|
|
264
|
-
expect(logs.some((log) => log.includes("📦 Step 2/4: Installing Website..."))).toBe(true);
|
|
265
|
-
|
|
266
|
-
// Test SERVICE_STARTING hook
|
|
267
|
-
hooks.SERVICE_STARTING();
|
|
268
|
-
logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
|
|
269
|
-
expect(logs.some((log) => log.includes("🚀 Step 3/4: Starting Website..."))).toBe(true);
|
|
270
|
-
|
|
271
|
-
// Test ACCESS_PREPARING hook
|
|
272
|
-
hooks.ACCESS_PREPARING();
|
|
273
|
-
logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
|
|
274
|
-
expect(logs.some((log) => log.includes("🌐 Step 4/4: Getting Website URL..."))).toBe(true);
|
|
275
|
-
|
|
276
|
-
// Test ACCESS_READY hook without subscription
|
|
277
|
-
await hooks.ACCESS_READY({
|
|
278
|
-
appUrl: TEST_APP_URL,
|
|
279
|
-
homeUrl: TEST_HOME_URL,
|
|
280
|
-
});
|
|
281
|
-
logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
|
|
282
|
-
expect(logs.some((log) => log.includes("🔗 Your website is available at:"))).toBe(true);
|
|
283
|
-
expect(logs.some((log) => log.includes(TEST_HOME_URL))).toBe(true);
|
|
284
|
-
|
|
285
|
-
// Test ACCESS_READY hook with subscription
|
|
286
|
-
await hooks.ACCESS_READY({
|
|
287
|
-
appUrl: TEST_APP_URL,
|
|
288
|
-
homeUrl: TEST_HOME_URL,
|
|
289
|
-
subscriptionUrl: TEST_SUBSCRIPTION_URL,
|
|
290
|
-
});
|
|
291
|
-
logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
|
|
292
|
-
expect(logs.some((log) => log.includes("🔗 Your subscription management URL:"))).toBe(true);
|
|
293
|
-
expect(logs.some((log) => log.includes(TEST_SUBSCRIPTION_URL))).toBe(true);
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
test("handles missing vendors in result", async () => {
|
|
297
|
-
const mockResult = {
|
|
298
|
-
appUrl: TEST_APP_URL,
|
|
299
|
-
homeUrl: TEST_HOME_URL,
|
|
300
|
-
vendors: null,
|
|
301
|
-
};
|
|
302
|
-
|
|
303
|
-
mockBrokerClient.deploy.mockResolvedValue(mockResult);
|
|
304
|
-
|
|
305
|
-
const result = await deploy();
|
|
306
|
-
|
|
307
|
-
expect(result.token).toBeUndefined();
|
|
308
|
-
expect(result.appUrl).toBe(TEST_APP_URL);
|
|
309
|
-
expect(result.homeUrl).toBe(TEST_HOME_URL);
|
|
310
|
-
});
|
|
311
|
-
|
|
312
|
-
test("handles empty vendors array in result", async () => {
|
|
313
|
-
const mockResult = {
|
|
314
|
-
appUrl: TEST_APP_URL,
|
|
315
|
-
homeUrl: TEST_HOME_URL,
|
|
316
|
-
vendors: [],
|
|
317
|
-
};
|
|
318
|
-
|
|
319
|
-
mockBrokerClient.deploy.mockResolvedValue(mockResult);
|
|
320
|
-
|
|
321
|
-
const result = await deploy();
|
|
322
|
-
|
|
323
|
-
expect(result.token).toBeUndefined();
|
|
324
|
-
expect(result.appUrl).toBe(TEST_APP_URL);
|
|
325
|
-
expect(result.homeUrl).toBe(TEST_HOME_URL);
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
test("uses default BASE_URL when not set", async () => {
|
|
329
|
-
delete process.env.DOC_SMITH_BASE_URL;
|
|
330
|
-
|
|
331
|
-
const mockResult = {
|
|
332
|
-
appUrl: TEST_APP_URL,
|
|
333
|
-
vendors: [{ token: "test-token" }],
|
|
334
|
-
};
|
|
335
|
-
|
|
336
|
-
mockBrokerClient.deploy.mockResolvedValue(mockResult);
|
|
337
|
-
|
|
338
|
-
await deploy();
|
|
339
|
-
|
|
340
|
-
// Verify BrokerClient was constructed with empty baseUrl
|
|
341
|
-
expect(mockBrokerClientConstructor).toHaveBeenCalledWith(
|
|
342
|
-
expect.objectContaining({
|
|
343
|
-
authToken: "mock-auth-token",
|
|
344
|
-
baseUrl: "https://docsmith.aigne.io",
|
|
345
|
-
}),
|
|
346
|
-
);
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
test("handles browser opening failure", async () => {
|
|
350
|
-
openDefaultSpy.mockRejectedValue(new Error("Cannot open browser"));
|
|
351
|
-
|
|
352
|
-
let paymentPendingHook;
|
|
353
|
-
mockBrokerClient.deploy.mockImplementation(async (config) => {
|
|
354
|
-
paymentPendingHook = config.hooks.PAYMENT_PENDING;
|
|
355
|
-
return {
|
|
356
|
-
appUrl: TEST_APP_URL,
|
|
357
|
-
vendors: [{ token: "test-token" }],
|
|
358
|
-
};
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
await deploy();
|
|
362
|
-
|
|
363
|
-
// The hook should throw when browser opening fails (expected behavior)
|
|
364
|
-
await expect(
|
|
365
|
-
paymentPendingHook({
|
|
366
|
-
sessionId: "session-123",
|
|
367
|
-
paymentUrl: "https://payment.test/session-123",
|
|
368
|
-
isResuming: false,
|
|
369
|
-
}),
|
|
370
|
-
).rejects.toThrow("Cannot open browser");
|
|
371
|
-
|
|
372
|
-
// Config should still be saved
|
|
373
|
-
expect(saveValueToConfigSpy).toHaveBeenCalled();
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
test("handles saveValueToConfig failure", async () => {
|
|
377
|
-
saveValueToConfigSpy.mockRejectedValue(new Error("Config save failed"));
|
|
378
|
-
|
|
379
|
-
let paymentPendingHook;
|
|
380
|
-
mockBrokerClient.deploy.mockImplementation(async (config) => {
|
|
381
|
-
paymentPendingHook = config.hooks.PAYMENT_PENDING;
|
|
382
|
-
return {
|
|
383
|
-
appUrl: TEST_APP_URL,
|
|
384
|
-
vendors: [{ token: "test-token" }],
|
|
385
|
-
};
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
await deploy();
|
|
389
|
-
|
|
390
|
-
// The hook should throw when config saving fails (expected behavior)
|
|
391
|
-
await expect(
|
|
392
|
-
paymentPendingHook({
|
|
393
|
-
sessionId: "session-123",
|
|
394
|
-
paymentUrl: "https://payment.test/session-123",
|
|
395
|
-
isResuming: false,
|
|
396
|
-
}),
|
|
397
|
-
).rejects.toThrow("Config save failed");
|
|
398
|
-
});
|
|
399
|
-
});
|