rwsdk 0.1.16 → 0.1.17-test.20250715200658
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/dist/lib/$.d.mts +8 -0
- package/dist/lib/$.mjs +5 -0
- package/dist/lib/constants.d.mts +4 -0
- package/dist/lib/constants.mjs +6 -0
- package/dist/lib/findWranglerConfig.d.mts +1 -0
- package/dist/lib/findWranglerConfig.mjs +12 -0
- package/dist/lib/getShortName.d.mts +1 -0
- package/dist/lib/getShortName.mjs +2 -0
- package/dist/lib/getSrcPaths.d.ts +15 -0
- package/dist/lib/getSrcPaths.js +80 -0
- package/dist/lib/hasPkgScript.d.mts +1 -0
- package/dist/lib/hasPkgScript.mjs +9 -0
- package/dist/lib/jsonUtils.d.mts +28 -0
- package/dist/lib/jsonUtils.mjs +167 -0
- package/dist/lib/setupEnvFiles.d.mts +4 -0
- package/dist/lib/setupEnvFiles.mjs +31 -0
- package/dist/lib/smokeTests/artifacts.d.mts +10 -0
- package/dist/lib/smokeTests/artifacts.mjs +164 -0
- package/dist/lib/smokeTests/browser.d.mts +48 -0
- package/dist/lib/smokeTests/browser.mjs +1041 -0
- package/dist/lib/smokeTests/cleanup.d.mts +5 -0
- package/dist/lib/smokeTests/cleanup.mjs +214 -0
- package/dist/lib/smokeTests/codeUpdates.d.mts +8 -0
- package/dist/lib/smokeTests/codeUpdates.mjs +229 -0
- package/dist/lib/smokeTests/constants.d.mts +5 -0
- package/dist/lib/smokeTests/constants.mjs +10 -0
- package/dist/lib/smokeTests/development.d.mts +11 -0
- package/dist/lib/smokeTests/development.mjs +209 -0
- package/dist/lib/smokeTests/environment.d.mts +14 -0
- package/dist/lib/smokeTests/environment.mjs +163 -0
- package/dist/lib/smokeTests/release.d.mts +61 -0
- package/dist/lib/smokeTests/release.mjs +526 -0
- package/dist/lib/smokeTests/reporting.d.mts +13 -0
- package/dist/lib/smokeTests/reporting.mjs +355 -0
- package/dist/lib/smokeTests/runSmokeTests.d.mts +5 -0
- package/dist/lib/smokeTests/runSmokeTests.mjs +144 -0
- package/dist/lib/smokeTests/state.d.mts +48 -0
- package/dist/lib/smokeTests/state.mjs +57 -0
- package/dist/lib/smokeTests/templates/SmokeTest.template.d.ts +1 -0
- package/dist/lib/smokeTests/templates/SmokeTest.template.js +81 -0
- package/dist/lib/smokeTests/templates/SmokeTestClient.template.d.ts +1 -0
- package/dist/lib/smokeTests/templates/SmokeTestClient.template.js +159 -0
- package/dist/lib/smokeTests/templates/smokeTestFunctions.template.d.ts +1 -0
- package/dist/lib/smokeTests/templates/smokeTestFunctions.template.js +19 -0
- package/dist/lib/smokeTests/types.d.mts +75 -0
- package/dist/lib/smokeTests/utils.d.mts +15 -0
- package/dist/lib/smokeTests/utils.mjs +147 -0
- package/dist/llms/index.d.ts +3 -0
- package/dist/llms/index.js +35 -0
- package/dist/llms/rules/interruptors.d.ts +1 -0
- package/dist/llms/rules/interruptors.js +243 -0
- package/dist/llms/rules/middleware.d.ts +1 -0
- package/dist/llms/rules/middleware.js +71 -0
- package/dist/llms/rules/react.d.ts +1 -0
- package/dist/llms/rules/react.js +106 -0
- package/dist/llms/rules/request-response.d.ts +1 -0
- package/dist/llms/rules/request-response.js +209 -0
- package/dist/runtime/client.d.ts +17 -0
- package/dist/runtime/client.js +74 -0
- package/dist/runtime/clientNavigation.d.ts +4 -0
- package/dist/runtime/clientNavigation.js +53 -0
- package/dist/runtime/clientNavigation.test.d.ts +1 -0
- package/dist/runtime/clientNavigation.test.js +55 -0
- package/dist/runtime/constants.d.ts +1 -0
- package/dist/runtime/constants.js +1 -0
- package/dist/runtime/entries/auth.d.ts +1 -0
- package/dist/runtime/entries/auth.js +1 -0
- package/dist/runtime/entries/client.d.ts +4 -0
- package/dist/runtime/entries/client.js +4 -0
- package/dist/runtime/entries/clientSSR.d.ts +1 -0
- package/dist/runtime/entries/clientSSR.js +1 -0
- package/dist/runtime/entries/no-react-server.d.ts +0 -0
- package/dist/runtime/entries/no-react-server.js +2 -0
- package/dist/runtime/entries/react-server-only.d.ts +0 -0
- package/dist/runtime/entries/react-server-only.js +2 -0
- package/dist/runtime/entries/router.d.ts +2 -0
- package/dist/runtime/entries/router.js +2 -0
- package/dist/runtime/entries/ssr.d.ts +1 -0
- package/dist/runtime/entries/ssr.js +1 -0
- package/dist/runtime/entries/worker.d.ts +9 -0
- package/dist/runtime/entries/worker.js +9 -0
- package/dist/runtime/error.d.ts +6 -0
- package/dist/runtime/error.js +8 -0
- package/dist/runtime/imports/ClientOnly.d.ts +3 -0
- package/dist/runtime/imports/ClientOnly.js +8 -0
- package/dist/runtime/imports/client.d.ts +4 -0
- package/dist/runtime/imports/client.js +33 -0
- package/dist/runtime/imports/ssr.d.ts +5 -0
- package/dist/runtime/imports/ssr.js +20 -0
- package/dist/runtime/imports/worker.d.ts +5 -0
- package/dist/runtime/imports/worker.js +22 -0
- package/dist/runtime/lib/auth/index.d.ts +1 -0
- package/dist/runtime/lib/auth/index.js +1 -0
- package/dist/runtime/lib/auth/session.d.ts +50 -0
- package/dist/runtime/lib/auth/session.js +148 -0
- package/dist/runtime/lib/db/DOWorkerDialect.d.ts +29 -0
- package/dist/runtime/lib/db/DOWorkerDialect.js +66 -0
- package/dist/runtime/lib/db/SqliteDurableObject.d.ts +14 -0
- package/dist/runtime/lib/db/SqliteDurableObject.js +42 -0
- package/dist/runtime/lib/db/createDb.d.ts +2 -0
- package/dist/runtime/lib/db/createDb.js +33 -0
- package/dist/runtime/lib/db/index.d.ts +4 -0
- package/dist/runtime/lib/db/index.js +3 -0
- package/dist/runtime/lib/db/migrations.d.ts +23 -0
- package/dist/runtime/lib/db/migrations.js +34 -0
- package/dist/runtime/lib/db/typeInference/assert.d.ts +2 -0
- package/dist/runtime/lib/db/typeInference/assert.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/alterColumn.d.ts +27 -0
- package/dist/runtime/lib/db/typeInference/builders/alterColumn.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/alterTable.d.ts +53 -0
- package/dist/runtime/lib/db/typeInference/builders/alterTable.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/columnDefinition.d.ts +26 -0
- package/dist/runtime/lib/db/typeInference/builders/columnDefinition.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/createTable.d.ts +49 -0
- package/dist/runtime/lib/db/typeInference/builders/createTable.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/createView.d.ts +17 -0
- package/dist/runtime/lib/db/typeInference/builders/createView.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/dropTable.d.ts +11 -0
- package/dist/runtime/lib/db/typeInference/builders/dropTable.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/dropView.d.ts +12 -0
- package/dist/runtime/lib/db/typeInference/builders/dropView.js +1 -0
- package/dist/runtime/lib/db/typeInference/builders/schema.d.ts +24 -0
- package/dist/runtime/lib/db/typeInference/builders/schema.js +1 -0
- package/dist/runtime/lib/db/typeInference/database.d.ts +27 -0
- package/dist/runtime/lib/db/typeInference/database.js +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/alterTable.typetest.d.ts +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/alterTable.typetest.js +360 -0
- package/dist/runtime/lib/db/typeInference/typetests/createTable.typetest.d.ts +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/createTable.typetest.js +33 -0
- package/dist/runtime/lib/db/typeInference/typetests/dropTable.typetest.d.ts +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/dropTable.typetest.js +143 -0
- package/dist/runtime/lib/db/typeInference/typetests/print.d.ts +3 -0
- package/dist/runtime/lib/db/typeInference/typetests/print.js +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/testUtils.d.ts +2 -0
- package/dist/runtime/lib/db/typeInference/typetests/testUtils.js +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/typeInference.typetest.d.ts +1 -0
- package/dist/runtime/lib/db/typeInference/typetests/typeInference.typetest.js +17 -0
- package/dist/runtime/lib/db/typeInference/utils.d.ts +82 -0
- package/dist/runtime/lib/db/typeInference/utils.js +2 -0
- package/dist/runtime/lib/debug.d.ts +2 -0
- package/dist/runtime/lib/debug.js +36 -0
- package/dist/runtime/lib/links.d.ts +14 -0
- package/dist/runtime/lib/links.js +38 -0
- package/dist/runtime/lib/realtime/client.d.ts +7 -0
- package/dist/runtime/lib/realtime/client.js +166 -0
- package/dist/runtime/lib/realtime/constants.d.ts +1 -0
- package/dist/runtime/lib/realtime/constants.js +1 -0
- package/dist/runtime/lib/realtime/durableObject.d.ts +29 -0
- package/dist/runtime/lib/realtime/durableObject.js +187 -0
- package/dist/runtime/lib/realtime/renderRealtimeClients.d.ts +7 -0
- package/dist/runtime/lib/realtime/renderRealtimeClients.js +6 -0
- package/dist/runtime/lib/realtime/shared.d.ts +10 -0
- package/dist/runtime/lib/realtime/shared.js +10 -0
- package/dist/runtime/lib/realtime/validateUpgradeRequest.d.ts +6 -0
- package/dist/runtime/lib/realtime/validateUpgradeRequest.js +29 -0
- package/dist/runtime/lib/realtime/worker.d.ts +3 -0
- package/dist/runtime/lib/realtime/worker.js +16 -0
- package/dist/runtime/lib/router.d.ts +56 -0
- package/dist/runtime/lib/router.js +210 -0
- package/dist/runtime/lib/router.test.d.ts +1 -0
- package/dist/runtime/lib/router.test.js +58 -0
- package/dist/runtime/lib/streams/consumeEventStream.d.ts +4 -0
- package/dist/runtime/lib/streams/consumeEventStream.js +13 -0
- package/dist/runtime/lib/turnstile/TurnstileScript.d.ts +1 -0
- package/dist/runtime/lib/turnstile/TurnstileScript.js +2 -0
- package/dist/runtime/lib/turnstile/turnstile.d.ts +3 -0
- package/dist/runtime/lib/turnstile/turnstile.js +3 -0
- package/dist/runtime/lib/turnstile/useTurnstile.d.ts +4 -0
- package/dist/runtime/lib/turnstile/useTurnstile.js +23 -0
- package/dist/runtime/lib/turnstile/verifyTurnstileToken.d.ts +4 -0
- package/dist/runtime/lib/turnstile/verifyTurnstileToken.js +15 -0
- package/dist/runtime/lib/utils.d.ts +1 -0
- package/dist/runtime/lib/utils.js +1 -0
- package/dist/runtime/register/client.d.ts +1 -0
- package/dist/runtime/register/client.js +5 -0
- package/dist/runtime/register/ssr.d.ts +3 -0
- package/dist/runtime/register/ssr.js +26 -0
- package/dist/runtime/register/worker.d.ts +4 -0
- package/dist/runtime/register/worker.js +42 -0
- package/dist/runtime/render/createClientManifest.d.ts +1 -0
- package/dist/runtime/render/createClientManifest.js +7 -0
- package/dist/runtime/render/createModuleMap.d.ts +1 -0
- package/dist/runtime/render/createModuleMap.js +13 -0
- package/dist/runtime/render/renderRscThenableToHtmlStream.d.ts +9 -0
- package/dist/runtime/render/renderRscThenableToHtmlStream.js +49 -0
- package/dist/runtime/render/renderToRscStream.d.ts +5 -0
- package/dist/runtime/render/renderToRscStream.js +46 -0
- package/dist/runtime/render/renderToStream.d.ts +9 -0
- package/dist/runtime/render/renderToStream.js +27 -0
- package/dist/runtime/render/renderToString.d.ts +7 -0
- package/dist/runtime/render/renderToString.js +26 -0
- package/dist/runtime/render/transformRscToHtmlStream.d.ts +8 -0
- package/dist/runtime/render/transformRscToHtmlStream.js +19 -0
- package/dist/runtime/requestInfo/types.d.ts +11 -0
- package/dist/runtime/requestInfo/types.js +1 -0
- package/dist/runtime/requestInfo/worker.d.ts +5 -0
- package/dist/runtime/requestInfo/worker.js +33 -0
- package/dist/runtime/script.d.ts +5 -0
- package/dist/runtime/script.js +8 -0
- package/dist/runtime/ssrBridge.d.ts +2 -0
- package/dist/runtime/ssrBridge.js +11 -0
- package/dist/runtime/worker.d.ts +18 -0
- package/dist/runtime/worker.js +173 -0
- package/dist/scripts/__sdk.d.mts +1 -0
- package/dist/scripts/__sdk.mjs +14 -0
- package/dist/scripts/debug-sync.d.mts +6 -0
- package/dist/scripts/debug-sync.mjs +224 -0
- package/dist/scripts/dev-init.d.mts +1 -0
- package/dist/scripts/dev-init.mjs +25 -0
- package/dist/scripts/ensure-deploy-env.d.mts +1 -0
- package/dist/scripts/ensure-deploy-env.mjs +271 -0
- package/dist/scripts/ensure-env.d.mts +1 -0
- package/dist/scripts/ensure-env.mjs +9 -0
- package/dist/scripts/migrate-new.d.mts +1 -0
- package/dist/scripts/migrate-new.mjs +51 -0
- package/dist/scripts/smoke-test.d.mts +1 -0
- package/dist/scripts/smoke-test.mjs +166 -0
- package/dist/scripts/worker-run.d.mts +1 -0
- package/dist/scripts/worker-run.mjs +82 -0
- package/dist/vite/checkIsUsingPrisma.d.mts +6 -0
- package/dist/vite/checkIsUsingPrisma.mjs +18 -0
- package/dist/vite/configPlugin.d.mts +9 -0
- package/dist/vite/configPlugin.mjs +169 -0
- package/dist/vite/createDirectiveLookupPlugin.d.mts +21 -0
- package/dist/vite/createDirectiveLookupPlugin.mjs +231 -0
- package/dist/vite/devServerTimingPlugin.d.mts +2 -0
- package/dist/vite/devServerTimingPlugin.mjs +24 -0
- package/dist/vite/directivesPlugin.d.mts +6 -0
- package/dist/vite/directivesPlugin.mjs +200 -0
- package/dist/vite/ensureAliasArray.d.mts +2 -0
- package/dist/vite/ensureAliasArray.mjs +17 -0
- package/dist/vite/findSpecifiers.d.mts +31 -0
- package/dist/vite/findSpecifiers.mjs +230 -0
- package/dist/vite/findSsrSpecifiers.d.mts +11 -0
- package/dist/vite/findSsrSpecifiers.mjs +67 -0
- package/dist/vite/hasDirective.d.mts +7 -0
- package/dist/vite/hasDirective.mjs +54 -0
- package/dist/vite/hasOwnCloudflareVitePlugin.d.mts +3 -0
- package/dist/vite/hasOwnCloudflareVitePlugin.mjs +14 -0
- package/dist/vite/index.d.mts +1 -0
- package/dist/vite/index.mjs +1 -0
- package/dist/vite/injectVitePreamblePlugin.d.mts +4 -0
- package/dist/vite/injectVitePreamblePlugin.mjs +23 -0
- package/dist/vite/invalidateCacheIfPrismaClientChanged.d.mts +3 -0
- package/dist/vite/invalidateCacheIfPrismaClientChanged.mjs +27 -0
- package/dist/vite/invalidateModule.d.mts +6 -0
- package/dist/vite/invalidateModule.mjs +30 -0
- package/dist/vite/miniflareHMRPlugin.d.mts +10 -0
- package/dist/vite/miniflareHMRPlugin.mjs +209 -0
- package/dist/vite/moveStaticAssetsPlugin.d.mts +4 -0
- package/dist/vite/moveStaticAssetsPlugin.mjs +12 -0
- package/dist/vite/normalizeModulePath.d.mts +1 -0
- package/dist/vite/normalizeModulePath.mjs +13 -0
- package/dist/vite/prismaPlugin.d.mts +4 -0
- package/dist/vite/prismaPlugin.mjs +43 -0
- package/dist/vite/reactConditionsResolverPlugin.d.mts +16 -0
- package/dist/vite/reactConditionsResolverPlugin.mjs +179 -0
- package/dist/vite/redwoodPlugin.d.mts +12 -0
- package/dist/vite/redwoodPlugin.mjs +105 -0
- package/dist/vite/ssrBridgePlugin.d.mts +7 -0
- package/dist/vite/ssrBridgePlugin.mjs +137 -0
- package/dist/vite/transformClientComponents.d.mts +12 -0
- package/dist/vite/transformClientComponents.mjs +116 -0
- package/dist/vite/transformClientComponents.test.d.mts +1 -0
- package/dist/vite/transformClientComponents.test.mjs +264 -0
- package/dist/vite/transformJsxScriptTagsPlugin.d.mts +8 -0
- package/dist/vite/transformJsxScriptTagsPlugin.mjs +315 -0
- package/dist/vite/transformJsxScriptTagsPlugin.test.d.mts +1 -0
- package/dist/vite/transformJsxScriptTagsPlugin.test.mjs +334 -0
- package/dist/vite/transformServerFunctions.d.mts +16 -0
- package/dist/vite/transformServerFunctions.mjs +296 -0
- package/dist/vite/transformServerFunctions.test.d.mts +1 -0
- package/dist/vite/transformServerFunctions.test.mjs +124 -0
- package/dist/vite/useClientLookupPlugin.d.mts +5 -0
- package/dist/vite/useClientLookupPlugin.mjs +15 -0
- package/dist/vite/useServerLookupPlugin.d.mts +5 -0
- package/dist/vite/useServerLookupPlugin.mjs +15 -0
- package/dist/vite/useServerPlugin.d.mts +1 -0
- package/dist/vite/useServerPlugin.mjs +1 -0
- package/dist/vite/virtualPlugin.d.mts +2 -0
- package/dist/vite/virtualPlugin.mjs +18 -0
- package/dist/vite/vitePreamblePlugin.d.mts +1 -0
- package/dist/vite/vitePreamblePlugin.mjs +11 -0
- package/package.json +1 -1
- package/dist/runtime/lib/db/typeInference/builders/table.d.ts +0 -10
- package/dist/vite/invalidateClientModule.d.mts +0 -2
- package/dist/vite/invalidateClientModule.mjs +0 -8
- package/dist/vite/invalidateModule copy.d.mts +0 -2
- package/dist/vite/invalidateModule copy.mjs +0 -14
- package/dist/vite/invalidateSSRModule.d.mts +0 -2
- package/dist/vite/invalidateSSRModule.mjs +0 -7
- package/dist/vite/mode.d.mts +0 -5
- package/dist/vite/mode.mjs +0 -25
- package/dist/vite/modePlugin.d.mts +0 -2
- package/dist/vite/modePlugin.mjs +0 -10
- /package/dist/{runtime/lib/db/typeInference/builders/table.js → lib/smokeTests/types.mjs} +0 -0
- /package/dist/vite/{isJsFile.d.ts → isJsFile.d.mts} +0 -0
- /package/dist/vite/{isJsFile.js → isJsFile.mjs} +0 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { join, basename } from "path";
|
|
2
|
+
import { writeFile } from "fs/promises";
|
|
3
|
+
import { mkdirp } from "fs-extra";
|
|
4
|
+
import { log } from "./constants.mjs";
|
|
5
|
+
import { state } from "./state.mjs";
|
|
6
|
+
/**
|
|
7
|
+
* Maps a test status to a display string with emoji
|
|
8
|
+
*/
|
|
9
|
+
function formatTestStatus(status) {
|
|
10
|
+
switch (status) {
|
|
11
|
+
case "PASSED":
|
|
12
|
+
return "✅ PASSED";
|
|
13
|
+
case "FAILED":
|
|
14
|
+
return "❌ FAILED";
|
|
15
|
+
case "SKIPPED":
|
|
16
|
+
return "⏩ SKIPPED";
|
|
17
|
+
case "DID_NOT_RUN":
|
|
18
|
+
return "⚠️ DID NOT RUN";
|
|
19
|
+
default:
|
|
20
|
+
return "❓ UNKNOWN";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generates the final test report without doing any resource cleanup.
|
|
25
|
+
*/
|
|
26
|
+
export async function generateFinalReport() {
|
|
27
|
+
try {
|
|
28
|
+
// Helper function to check if a failure matches the specified patterns
|
|
29
|
+
function failureMatches(failure, patterns, notPatterns = []) {
|
|
30
|
+
// Check if any of the patterns match in either step or error
|
|
31
|
+
const matchesPattern = patterns.some((pattern) => failure.step.includes(pattern) ||
|
|
32
|
+
(failure.error && failure.error.includes(pattern)));
|
|
33
|
+
// Check if any of the not-patterns match in either step or error
|
|
34
|
+
const matchesNotPattern = notPatterns.some((pattern) => failure.step.includes(pattern) ||
|
|
35
|
+
(failure.error && failure.error.includes(pattern)));
|
|
36
|
+
// Return true if it matches a pattern and doesn't match any not-pattern
|
|
37
|
+
return matchesPattern && !matchesNotPattern;
|
|
38
|
+
}
|
|
39
|
+
// Create a report object
|
|
40
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
41
|
+
const report = {
|
|
42
|
+
timestamp,
|
|
43
|
+
success: state.exitCode === 0,
|
|
44
|
+
exitCode: state.exitCode,
|
|
45
|
+
workerName: (state.resources.workerName || null),
|
|
46
|
+
projectDir: state.options.artifactDir
|
|
47
|
+
? join(state.options.artifactDir, "project")
|
|
48
|
+
: null,
|
|
49
|
+
logFiles: state.options.artifactDir
|
|
50
|
+
? {
|
|
51
|
+
stdout: join(state.options.artifactDir, "logs", `stdout-${timestamp}.log`),
|
|
52
|
+
stderr: join(state.options.artifactDir, "logs", `stderr-${timestamp}.log`),
|
|
53
|
+
combined: join(state.options.artifactDir, "logs", `combined-${timestamp}.log`),
|
|
54
|
+
}
|
|
55
|
+
: null,
|
|
56
|
+
failures: state.failures,
|
|
57
|
+
options: {
|
|
58
|
+
customPath: state.options.customPath,
|
|
59
|
+
skipDev: state.options.skipDev,
|
|
60
|
+
skipRelease: state.options.skipRelease,
|
|
61
|
+
skipClient: state.options.skipClient,
|
|
62
|
+
},
|
|
63
|
+
testStatus: state.testStatus,
|
|
64
|
+
};
|
|
65
|
+
// Always print the report to console in a pretty format
|
|
66
|
+
console.log("\n==================================================");
|
|
67
|
+
console.log(" 📊 SMOKE TEST REPORT ");
|
|
68
|
+
console.log("==================================================");
|
|
69
|
+
console.log("--------------------------------------------------");
|
|
70
|
+
console.log(`Timestamp: ${timestamp}`);
|
|
71
|
+
console.log(`Status: ${report.success ? "✅ PASSED" : "❌ FAILED"}`);
|
|
72
|
+
console.log(`Exit code: ${state.exitCode}`);
|
|
73
|
+
if (report.workerName) {
|
|
74
|
+
console.log(`Worker name: ${report.workerName}`);
|
|
75
|
+
}
|
|
76
|
+
console.log(`Test options:`);
|
|
77
|
+
console.log(` - Custom path: ${report.options.customPath || "/"}`);
|
|
78
|
+
console.log(` - Skip dev: ${report.options.skipDev ? "Yes" : "No"}`);
|
|
79
|
+
console.log(` - Skip release: ${report.options.skipRelease ? "Yes" : "No"}`);
|
|
80
|
+
console.log(` - Skip client: ${report.options.skipClient ? "Yes" : "No"}`);
|
|
81
|
+
// Add info about log files
|
|
82
|
+
if (report.logFiles) {
|
|
83
|
+
console.log(`Log files:`);
|
|
84
|
+
console.log(` - stdout: ${basename(report.logFiles.stdout)}`);
|
|
85
|
+
console.log(` - stderr: ${basename(report.logFiles.stderr)}`);
|
|
86
|
+
console.log(` - combined: ${basename(report.logFiles.combined)}`);
|
|
87
|
+
}
|
|
88
|
+
console.log("--------------------------------------------------");
|
|
89
|
+
// Add summary of failures count
|
|
90
|
+
if (state.failures.length > 0) {
|
|
91
|
+
console.log(`\n❌ Failed tests: ${state.failures.length}`);
|
|
92
|
+
}
|
|
93
|
+
else if (report.success) {
|
|
94
|
+
console.log("\n✅ All smoke tests passed successfully!");
|
|
95
|
+
}
|
|
96
|
+
// Group failures by step to determine which stages had issues
|
|
97
|
+
const devFailures = state.failures.filter((f) => failureMatches(f, ["Development", "Development Server", "Development -"]));
|
|
98
|
+
const releaseFailures = state.failures.filter((f) => failureMatches(f, ["Production", "Release", "Production -"]));
|
|
99
|
+
// Add hierarchical test results overview
|
|
100
|
+
console.log("\n==================================================");
|
|
101
|
+
console.log(" 🔍 TEST RESULTS SUMMARY ");
|
|
102
|
+
console.log("==================================================");
|
|
103
|
+
// Dev tests summary using the new testStatus system
|
|
104
|
+
console.log(`● Development Tests: ${formatTestStatus(state.testStatus.dev.overall)}`);
|
|
105
|
+
// Only show details if the overall test status is not "SKIPPED" or "DID_NOT_RUN"
|
|
106
|
+
if (state.testStatus.dev.overall !== "SKIPPED" &&
|
|
107
|
+
state.testStatus.dev.overall !== "DID_NOT_RUN") {
|
|
108
|
+
console.log(` ├─ Initial Tests:`);
|
|
109
|
+
console.log(` │ ├─ Server-side: ${formatTestStatus(state.testStatus.dev.initialServerSide)}`);
|
|
110
|
+
console.log(` │ ├─ Client-side: ${formatTestStatus(state.testStatus.dev.initialClientSide)}`);
|
|
111
|
+
console.log(` │ ├─ Server Render Check: ${formatTestStatus(state.testStatus.dev.initialServerRenderCheck)}`);
|
|
112
|
+
console.log(` │ ├─ Server HMR: ${formatTestStatus(state.testStatus.dev.initialServerHmr)}`);
|
|
113
|
+
console.log(` │ └─ Client HMR: ${formatTestStatus(state.testStatus.dev.initialClientHmr)}`);
|
|
114
|
+
console.log(` └─ Realtime Tests:`);
|
|
115
|
+
console.log(` ├─ Upgrade: ${formatTestStatus(state.testStatus.dev.realtimeUpgrade)}`);
|
|
116
|
+
console.log(` ├─ Server-side: ${formatTestStatus(state.testStatus.dev.realtimeServerSide)}`);
|
|
117
|
+
console.log(` ├─ Client-side: ${formatTestStatus(state.testStatus.dev.realtimeClientSide)}`);
|
|
118
|
+
console.log(` ├─ Server Render Check: ${formatTestStatus(state.testStatus.dev.realtimeServerRenderCheck)}`);
|
|
119
|
+
console.log(` ├─ Server HMR: ${formatTestStatus(state.testStatus.dev.realtimeServerHmr)}`);
|
|
120
|
+
console.log(` └─ Client HMR: ${formatTestStatus(state.testStatus.dev.realtimeClientHmr)}`);
|
|
121
|
+
}
|
|
122
|
+
// Production tests summary using the new testStatus system
|
|
123
|
+
console.log(`● Production Tests: ${formatTestStatus(state.testStatus.production.overall)}`);
|
|
124
|
+
// Only show details if the overall test status is not "SKIPPED" or "DID_NOT_RUN"
|
|
125
|
+
if (state.testStatus.production.overall !== "SKIPPED" &&
|
|
126
|
+
state.testStatus.production.overall !== "DID_NOT_RUN") {
|
|
127
|
+
console.log(` ├─ Release Command: ${formatTestStatus(state.testStatus.production.releaseCommand)}`);
|
|
128
|
+
// Only show these if release command was either not run or passed
|
|
129
|
+
if (state.testStatus.production.releaseCommand !== "FAILED") {
|
|
130
|
+
console.log(` ├─ Initial Tests:`);
|
|
131
|
+
console.log(` │ ├─ Server-side: ${formatTestStatus(state.testStatus.production.initialServerSide)}`);
|
|
132
|
+
console.log(` │ ├─ Client-side: ${formatTestStatus(state.testStatus.production.initialClientSide)}`);
|
|
133
|
+
console.log(` │ └─ Server Render Check: ${formatTestStatus(state.testStatus.production.initialServerRenderCheck)}`);
|
|
134
|
+
console.log(` └─ Realtime Tests:`);
|
|
135
|
+
console.log(` ├─ Upgrade: ${formatTestStatus(state.testStatus.production.realtimeUpgrade)}`);
|
|
136
|
+
console.log(` ├─ Server-side: ${formatTestStatus(state.testStatus.production.realtimeServerSide)}`);
|
|
137
|
+
console.log(` ├─ Client-side: ${formatTestStatus(state.testStatus.production.realtimeClientSide)}`);
|
|
138
|
+
console.log(` └─ Server Render Check: ${formatTestStatus(state.testStatus.production.realtimeServerRenderCheck)}`);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
console.log(` └─ Tests: ⏩ SKIPPED (release command failed)`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Add failures to the report file if we have a valid artifactDir
|
|
145
|
+
if (state.options.artifactDir) {
|
|
146
|
+
try {
|
|
147
|
+
// Ensure the directory exists, even if it was not created earlier
|
|
148
|
+
await mkdirp(state.options.artifactDir);
|
|
149
|
+
// Use the standardized reports directory
|
|
150
|
+
const reportDir = join(state.options.artifactDir, "reports");
|
|
151
|
+
// Ensure the directory exists
|
|
152
|
+
await mkdirp(reportDir);
|
|
153
|
+
const reportPath = join(reportDir, `smoke-test-report-${timestamp}.json`);
|
|
154
|
+
await writeFile(reportPath, JSON.stringify(report, null, 2));
|
|
155
|
+
console.log(`\n📝 Report saved to ${reportPath}`);
|
|
156
|
+
}
|
|
157
|
+
catch (reportError) {
|
|
158
|
+
console.error(`⚠️ Could not save report to file: ${reportError instanceof Error ? reportError.message : String(reportError)}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
console.log("\n⚠️ No artifacts directory specified, report not saved to disk");
|
|
163
|
+
}
|
|
164
|
+
// Report failures with clear environment context
|
|
165
|
+
if (state.failures.length > 0) {
|
|
166
|
+
console.log("\n==================================================");
|
|
167
|
+
console.log(" 🔍 FAILURE DETAILS ");
|
|
168
|
+
console.log("==================================================");
|
|
169
|
+
// Group failures by environment (Dev vs Release)
|
|
170
|
+
if (devFailures.length > 0) {
|
|
171
|
+
console.log("----------------- DEVELOPMENT ENVIRONMENT -----------------");
|
|
172
|
+
devFailures.forEach((failure, index) => {
|
|
173
|
+
console.log(`Failure #${index + 1}: ${failure.step}`);
|
|
174
|
+
// Split error message into lines if it's long
|
|
175
|
+
const errorLines = failure.error.split("\n");
|
|
176
|
+
console.log(`Error: ${errorLines[0]}`);
|
|
177
|
+
for (let i = 1; i < errorLines.length; i++) {
|
|
178
|
+
console.log(` ${errorLines[i]}`);
|
|
179
|
+
}
|
|
180
|
+
console.log(``);
|
|
181
|
+
});
|
|
182
|
+
console.log(`--------------------------------------------------`);
|
|
183
|
+
}
|
|
184
|
+
if (releaseFailures.length > 0) {
|
|
185
|
+
console.log("----------------- PRODUCTION ENVIRONMENT -----------------");
|
|
186
|
+
releaseFailures.forEach((failure, index) => {
|
|
187
|
+
console.log(`Failure #${index + 1}: ${failure.step}`);
|
|
188
|
+
// Split error message into lines if it's long
|
|
189
|
+
const errorLines = failure.error.split("\n");
|
|
190
|
+
console.log(`Error: ${errorLines[0]}`);
|
|
191
|
+
for (let i = 1; i < errorLines.length; i++) {
|
|
192
|
+
console.log(` ${errorLines[i]}`);
|
|
193
|
+
}
|
|
194
|
+
console.log(``);
|
|
195
|
+
});
|
|
196
|
+
console.log(`--------------------------------------------------`);
|
|
197
|
+
}
|
|
198
|
+
// Show other failures that don't fit into the above categories
|
|
199
|
+
const otherFailures = state.failures.filter((f) => !devFailures.includes(f) && !releaseFailures.includes(f));
|
|
200
|
+
if (otherFailures.length > 0) {
|
|
201
|
+
console.log("----------------- OTHER FAILURES -----------------");
|
|
202
|
+
otherFailures.forEach((failure, index) => {
|
|
203
|
+
console.log(`Failure #${index + 1}: ${failure.step}`);
|
|
204
|
+
// Split error message into lines if it's long
|
|
205
|
+
const errorLines = failure.error.split("\n");
|
|
206
|
+
console.log(`Error: ${errorLines[0]}`);
|
|
207
|
+
for (let i = 1; i < errorLines.length; i++) {
|
|
208
|
+
console.log(` ${errorLines[i]}`);
|
|
209
|
+
}
|
|
210
|
+
console.log(``);
|
|
211
|
+
});
|
|
212
|
+
console.log(`--------------------------------------------------`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
// Last resort error handling
|
|
218
|
+
console.error("❌ Failed to generate report:", error);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Updates the test status in the state object and reports the result.
|
|
223
|
+
*/
|
|
224
|
+
export function reportSmokeTestResult(result, type, phase = "", environment = "Development") {
|
|
225
|
+
const phasePrefix = phase ? `(${phase}) ` : "";
|
|
226
|
+
log("Reporting %s%s smoke test result: %O", phasePrefix, type, result);
|
|
227
|
+
if (result.verificationPassed) {
|
|
228
|
+
console.log(`✅ ${phasePrefix}${type} smoke test passed!`);
|
|
229
|
+
if (result.serverTimestamp) {
|
|
230
|
+
console.log(`✅ Server timestamp: ${result.serverTimestamp}`);
|
|
231
|
+
}
|
|
232
|
+
if (result.clientTimestamp) {
|
|
233
|
+
console.log(`✅ Client timestamp: ${result.clientTimestamp}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
log("ERROR: %s%s smoke test failed. Status: %s. Error: %s", phasePrefix, type, result.status, result.error || "unknown");
|
|
238
|
+
// The actual state update and error throwing is now handled by the caller functions
|
|
239
|
+
// We only need to report the result in the console
|
|
240
|
+
console.error(`❌ ${phasePrefix}${type} smoke test failed. Status: ${result.status}${result.error ? `. Error: ${result.error}` : ""}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Initialize test statuses based on test options
|
|
245
|
+
*/
|
|
246
|
+
export function initializeTestStatus() {
|
|
247
|
+
// Set default status for all tests as "DID_NOT_RUN"
|
|
248
|
+
// Dev tests
|
|
249
|
+
state.testStatus.dev.overall = "DID_NOT_RUN";
|
|
250
|
+
state.testStatus.dev.initialServerSide = "DID_NOT_RUN";
|
|
251
|
+
state.testStatus.dev.initialClientSide = "DID_NOT_RUN";
|
|
252
|
+
state.testStatus.dev.initialServerRenderCheck = "DID_NOT_RUN";
|
|
253
|
+
state.testStatus.dev.realtimeUpgrade = "DID_NOT_RUN";
|
|
254
|
+
state.testStatus.dev.realtimeServerSide = "DID_NOT_RUN";
|
|
255
|
+
state.testStatus.dev.realtimeClientSide = "DID_NOT_RUN";
|
|
256
|
+
state.testStatus.dev.realtimeServerRenderCheck = "DID_NOT_RUN";
|
|
257
|
+
state.testStatus.dev.initialServerHmr = "DID_NOT_RUN";
|
|
258
|
+
state.testStatus.dev.initialClientHmr = "DID_NOT_RUN";
|
|
259
|
+
state.testStatus.dev.realtimeServerHmr = "DID_NOT_RUN";
|
|
260
|
+
state.testStatus.dev.realtimeClientHmr = "DID_NOT_RUN";
|
|
261
|
+
// Production tests
|
|
262
|
+
state.testStatus.production.overall = "DID_NOT_RUN";
|
|
263
|
+
state.testStatus.production.releaseCommand = "DID_NOT_RUN";
|
|
264
|
+
state.testStatus.production.initialServerSide = "DID_NOT_RUN";
|
|
265
|
+
state.testStatus.production.initialClientSide = "DID_NOT_RUN";
|
|
266
|
+
state.testStatus.production.initialServerRenderCheck = "DID_NOT_RUN";
|
|
267
|
+
state.testStatus.production.realtimeUpgrade = "DID_NOT_RUN";
|
|
268
|
+
state.testStatus.production.realtimeServerSide = "DID_NOT_RUN";
|
|
269
|
+
state.testStatus.production.realtimeClientSide = "DID_NOT_RUN";
|
|
270
|
+
state.testStatus.production.realtimeServerRenderCheck = "DID_NOT_RUN";
|
|
271
|
+
state.testStatus.production.initialServerHmr = "DID_NOT_RUN";
|
|
272
|
+
state.testStatus.production.initialClientHmr = "DID_NOT_RUN";
|
|
273
|
+
state.testStatus.production.realtimeServerHmr = "DID_NOT_RUN";
|
|
274
|
+
state.testStatus.production.realtimeClientHmr = "DID_NOT_RUN";
|
|
275
|
+
// Now override with specific statuses based on options
|
|
276
|
+
// Mark skipped tests based on options
|
|
277
|
+
if (state.options.skipDev) {
|
|
278
|
+
state.testStatus.dev.overall = "SKIPPED";
|
|
279
|
+
state.testStatus.dev.initialServerSide = "SKIPPED";
|
|
280
|
+
state.testStatus.dev.initialClientSide = "SKIPPED";
|
|
281
|
+
state.testStatus.dev.initialServerRenderCheck = "SKIPPED";
|
|
282
|
+
state.testStatus.dev.realtimeUpgrade = "SKIPPED";
|
|
283
|
+
state.testStatus.dev.realtimeServerSide = "SKIPPED";
|
|
284
|
+
state.testStatus.dev.realtimeClientSide = "SKIPPED";
|
|
285
|
+
state.testStatus.dev.realtimeServerRenderCheck = "SKIPPED";
|
|
286
|
+
state.testStatus.dev.initialServerHmr = "SKIPPED";
|
|
287
|
+
state.testStatus.dev.initialClientHmr = "SKIPPED";
|
|
288
|
+
state.testStatus.dev.realtimeServerHmr = "SKIPPED";
|
|
289
|
+
state.testStatus.dev.realtimeClientHmr = "SKIPPED";
|
|
290
|
+
}
|
|
291
|
+
if (state.options.skipRelease) {
|
|
292
|
+
state.testStatus.production.overall = "SKIPPED";
|
|
293
|
+
state.testStatus.production.releaseCommand = "SKIPPED";
|
|
294
|
+
state.testStatus.production.initialServerSide = "SKIPPED";
|
|
295
|
+
state.testStatus.production.initialClientSide = "SKIPPED";
|
|
296
|
+
state.testStatus.production.initialServerRenderCheck = "SKIPPED";
|
|
297
|
+
state.testStatus.production.realtimeUpgrade = "SKIPPED";
|
|
298
|
+
state.testStatus.production.realtimeServerSide = "SKIPPED";
|
|
299
|
+
state.testStatus.production.realtimeClientSide = "SKIPPED";
|
|
300
|
+
state.testStatus.production.realtimeServerRenderCheck = "SKIPPED";
|
|
301
|
+
state.testStatus.production.initialServerHmr = "SKIPPED";
|
|
302
|
+
state.testStatus.production.initialClientHmr = "SKIPPED";
|
|
303
|
+
state.testStatus.production.realtimeServerHmr = "SKIPPED";
|
|
304
|
+
state.testStatus.production.realtimeClientHmr = "SKIPPED";
|
|
305
|
+
}
|
|
306
|
+
if (state.options.skipClient) {
|
|
307
|
+
state.testStatus.dev.initialClientSide = "SKIPPED";
|
|
308
|
+
state.testStatus.dev.realtimeClientSide = "SKIPPED";
|
|
309
|
+
state.testStatus.production.initialClientSide = "SKIPPED";
|
|
310
|
+
state.testStatus.production.realtimeClientSide = "SKIPPED";
|
|
311
|
+
state.testStatus.dev.initialServerRenderCheck = "SKIPPED";
|
|
312
|
+
state.testStatus.dev.realtimeServerRenderCheck = "SKIPPED";
|
|
313
|
+
state.testStatus.production.initialServerRenderCheck = "SKIPPED";
|
|
314
|
+
state.testStatus.production.realtimeServerRenderCheck = "SKIPPED";
|
|
315
|
+
state.testStatus.dev.initialClientHmr = "SKIPPED";
|
|
316
|
+
state.testStatus.dev.realtimeClientHmr = "SKIPPED";
|
|
317
|
+
state.testStatus.production.initialClientHmr = "SKIPPED";
|
|
318
|
+
state.testStatus.production.realtimeClientHmr = "SKIPPED";
|
|
319
|
+
}
|
|
320
|
+
// Skip HMR tests in production and when requested
|
|
321
|
+
state.testStatus.production.initialServerHmr = "SKIPPED";
|
|
322
|
+
state.testStatus.production.initialClientHmr = "SKIPPED";
|
|
323
|
+
state.testStatus.production.realtimeServerHmr = "SKIPPED";
|
|
324
|
+
state.testStatus.production.realtimeClientHmr = "SKIPPED";
|
|
325
|
+
if (state.options.skipHmr) {
|
|
326
|
+
state.testStatus.dev.initialServerHmr = "SKIPPED";
|
|
327
|
+
state.testStatus.dev.initialClientHmr = "SKIPPED";
|
|
328
|
+
state.testStatus.dev.realtimeServerHmr = "SKIPPED";
|
|
329
|
+
state.testStatus.dev.realtimeClientHmr = "SKIPPED";
|
|
330
|
+
}
|
|
331
|
+
// Handle realtime option which skips initial tests
|
|
332
|
+
if (state.options.realtime) {
|
|
333
|
+
// In realtime mode, initial tests are skipped
|
|
334
|
+
if (!state.options.skipDev) {
|
|
335
|
+
state.testStatus.dev.initialServerSide = "SKIPPED";
|
|
336
|
+
state.testStatus.dev.initialClientSide = "SKIPPED";
|
|
337
|
+
state.testStatus.dev.initialServerRenderCheck = "SKIPPED";
|
|
338
|
+
state.testStatus.dev.initialServerHmr = "SKIPPED";
|
|
339
|
+
state.testStatus.dev.initialClientHmr = "SKIPPED";
|
|
340
|
+
// Set the upgrade test to PASSED as it's implicitly run for realtime mode
|
|
341
|
+
state.testStatus.dev.realtimeUpgrade = "PASSED";
|
|
342
|
+
}
|
|
343
|
+
if (!state.options.skipRelease) {
|
|
344
|
+
state.testStatus.production.initialServerSide = "SKIPPED";
|
|
345
|
+
state.testStatus.production.initialClientSide = "SKIPPED";
|
|
346
|
+
state.testStatus.production.initialServerRenderCheck = "SKIPPED";
|
|
347
|
+
state.testStatus.production.initialServerHmr = "SKIPPED";
|
|
348
|
+
state.testStatus.production.initialClientHmr = "SKIPPED";
|
|
349
|
+
// Set release command to PASSED since it must have succeeded for realtime tests to run
|
|
350
|
+
state.testStatus.production.releaseCommand = "PASSED";
|
|
351
|
+
// Set the upgrade test to PASSED as it's implicitly run for realtime mode
|
|
352
|
+
state.testStatus.production.realtimeUpgrade = "PASSED";
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { join } from "path";
|
|
2
|
+
import { getBrowserPath } from "./browser.mjs";
|
|
3
|
+
import { setupArtifactsDirectory } from "./artifacts.mjs";
|
|
4
|
+
import { setupTestEnvironment } from "./environment.mjs";
|
|
5
|
+
import { runDevServer, runDevTest } from "./development.mjs";
|
|
6
|
+
import { runReleaseTest } from "./release.mjs";
|
|
7
|
+
import { fail, teardown, log } from "./utils.mjs";
|
|
8
|
+
import { state, updateTestStatus } from "./state.mjs";
|
|
9
|
+
import { initializeTestStatus } from "./reporting.mjs";
|
|
10
|
+
/**
|
|
11
|
+
* Main function that orchestrates the smoke test flow
|
|
12
|
+
*/
|
|
13
|
+
export async function runSmokeTests(options = {}) {
|
|
14
|
+
log("Starting smoke test with options: %O", options);
|
|
15
|
+
// Store options in state immediately for force report generation if needed
|
|
16
|
+
state.options = options;
|
|
17
|
+
// Initialize test status based on options
|
|
18
|
+
initializeTestStatus();
|
|
19
|
+
// Set default artifacts directory if not specified
|
|
20
|
+
if (!options.artifactDir) {
|
|
21
|
+
options.artifactDir = join(process.cwd(), ".artifacts");
|
|
22
|
+
log("Using default artifacts directory: %s", options.artifactDir);
|
|
23
|
+
// Update state.options with the default value
|
|
24
|
+
state.options.artifactDir = options.artifactDir;
|
|
25
|
+
}
|
|
26
|
+
// Clean and recreate artifacts directory
|
|
27
|
+
await setupArtifactsDirectory(options.artifactDir, options);
|
|
28
|
+
log("Initialized log capturing to artifact files");
|
|
29
|
+
// Throw immediately if both tests would be skipped
|
|
30
|
+
if (options.skipDev && options.skipRelease) {
|
|
31
|
+
log("Error: Both dev and release tests are skipped");
|
|
32
|
+
await fail(new Error("Cannot skip both dev and release tests. At least one must run."), 1, "Configuration");
|
|
33
|
+
}
|
|
34
|
+
// Prepare browser early to avoid waiting later
|
|
35
|
+
console.log("🔍 Preparing browser for testing...");
|
|
36
|
+
let browserPath;
|
|
37
|
+
try {
|
|
38
|
+
browserPath = await getBrowserPath(options);
|
|
39
|
+
console.log(`✅ Browser ready at: ${browserPath}`);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
await fail(error, 1, "Browser Preparation");
|
|
43
|
+
}
|
|
44
|
+
log("Setting up test environment");
|
|
45
|
+
try {
|
|
46
|
+
const resources = await setupTestEnvironment(options);
|
|
47
|
+
// Store resources in module-level state
|
|
48
|
+
state.resources = resources;
|
|
49
|
+
// Track failures to determine final exit code
|
|
50
|
+
let hasFailures = false;
|
|
51
|
+
// Run the tests that weren't skipped
|
|
52
|
+
if (!options.skipDev) {
|
|
53
|
+
log("Starting development server");
|
|
54
|
+
try {
|
|
55
|
+
// Start the dev server first, store the stop function in resources
|
|
56
|
+
const { url, stopDev } = await runDevServer(resources.targetDir);
|
|
57
|
+
resources.stopDev = stopDev;
|
|
58
|
+
state.resources.stopDev = stopDev;
|
|
59
|
+
log("Running development server tests");
|
|
60
|
+
await runDevTest(url, options.artifactDir, options.customPath, browserPath, options.headless !== false, options.bail, options.skipClient, options.realtime, options.skipHmr);
|
|
61
|
+
// Mark that dev tests have run successfully
|
|
62
|
+
state.devTestsRan = true;
|
|
63
|
+
// Update the overall dev test status to PASSED
|
|
64
|
+
state.testStatus.dev.overall = "PASSED";
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
hasFailures = true;
|
|
68
|
+
log("Error during development server testing: %O", error);
|
|
69
|
+
console.error(`❌ Development server test failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
70
|
+
// Record the failure
|
|
71
|
+
state.failures.push({
|
|
72
|
+
step: "Development Server Test",
|
|
73
|
+
error: error instanceof Error ? error.message : String(error),
|
|
74
|
+
details: error instanceof Error && error.stack ? error.stack : undefined,
|
|
75
|
+
});
|
|
76
|
+
// Mark overall dev test status as FAILED
|
|
77
|
+
state.testStatus.dev.overall = "FAILED";
|
|
78
|
+
// If bail option is true, stop the tests
|
|
79
|
+
if (options.bail) {
|
|
80
|
+
await fail(error, 1, "Development Server Test");
|
|
81
|
+
}
|
|
82
|
+
// Otherwise, continue with the release test
|
|
83
|
+
console.log("Continuing with next tests since --bail is not enabled...");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
log("Skipping development server tests");
|
|
88
|
+
}
|
|
89
|
+
if (!options.skipRelease) {
|
|
90
|
+
if (options.realtime) {
|
|
91
|
+
// If --realtime flag is set, status is already set in initializeTestStatus
|
|
92
|
+
console.log("⏩ Using realtime mode for Production tests (--realtime option enabled)");
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Update status when release command runs
|
|
96
|
+
try {
|
|
97
|
+
console.log("\n🚀 Running release command smoke test");
|
|
98
|
+
await runReleaseTest(options.customPath, options.artifactDir, resources, browserPath, options.headless !== false, options.bail, options.skipClient, options.projectDir, options.realtime, options.skipHmr);
|
|
99
|
+
// Update release command status to PASSED
|
|
100
|
+
updateTestStatus("production", "releaseCommand", "PASSED");
|
|
101
|
+
// Mark that release tests have run successfully
|
|
102
|
+
state.releaseTestsRan = true;
|
|
103
|
+
// Update the overall production test status to PASSED
|
|
104
|
+
state.testStatus.production.overall = "PASSED";
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
// Update release command status to FAILED
|
|
108
|
+
updateTestStatus("production", "releaseCommand", "FAILED");
|
|
109
|
+
hasFailures = true;
|
|
110
|
+
log("Error during release testing: %O", error);
|
|
111
|
+
console.error(`❌ Release test failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
// Record the failure
|
|
113
|
+
state.failures.push({
|
|
114
|
+
step: "Release Test",
|
|
115
|
+
error: error instanceof Error ? error.message : String(error),
|
|
116
|
+
details: error instanceof Error && error.stack ? error.stack : undefined,
|
|
117
|
+
});
|
|
118
|
+
// Mark overall production test status as FAILED
|
|
119
|
+
state.testStatus.production.overall = "FAILED";
|
|
120
|
+
// If bail option is true, stop the tests
|
|
121
|
+
if (options.bail) {
|
|
122
|
+
await fail(error, 1, "Release Test");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
log("Skipping release/production tests");
|
|
129
|
+
}
|
|
130
|
+
// Set the exit code based on whether there were failures
|
|
131
|
+
if (hasFailures) {
|
|
132
|
+
state.exitCode = 1;
|
|
133
|
+
console.log("\n⚠️ Some smoke tests failed, but continued running since --bail was not enabled.");
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log("\n✅ All smoke tests passed!");
|
|
137
|
+
}
|
|
138
|
+
// Call teardown with the final exit code
|
|
139
|
+
await teardown();
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
await fail(error, 1, "Test Environment Setup");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { SmokeTestOptions, TestResources } from "./types.mjs";
|
|
2
|
+
export type TestStatusValue = "SKIPPED" | "DID_NOT_RUN" | "PASSED" | "FAILED";
|
|
3
|
+
export interface TestStatus {
|
|
4
|
+
dev: {
|
|
5
|
+
overall: TestStatusValue;
|
|
6
|
+
initialServerSide: TestStatusValue;
|
|
7
|
+
initialClientSide: TestStatusValue;
|
|
8
|
+
initialServerRenderCheck: TestStatusValue;
|
|
9
|
+
realtimeUpgrade: TestStatusValue;
|
|
10
|
+
realtimeServerSide: TestStatusValue;
|
|
11
|
+
realtimeClientSide: TestStatusValue;
|
|
12
|
+
realtimeServerRenderCheck: TestStatusValue;
|
|
13
|
+
initialServerHmr: TestStatusValue;
|
|
14
|
+
initialClientHmr: TestStatusValue;
|
|
15
|
+
realtimeServerHmr: TestStatusValue;
|
|
16
|
+
realtimeClientHmr: TestStatusValue;
|
|
17
|
+
};
|
|
18
|
+
production: {
|
|
19
|
+
overall: TestStatusValue;
|
|
20
|
+
releaseCommand: TestStatusValue;
|
|
21
|
+
initialServerSide: TestStatusValue;
|
|
22
|
+
initialClientSide: TestStatusValue;
|
|
23
|
+
initialServerRenderCheck: TestStatusValue;
|
|
24
|
+
realtimeUpgrade: TestStatusValue;
|
|
25
|
+
realtimeServerSide: TestStatusValue;
|
|
26
|
+
realtimeClientSide: TestStatusValue;
|
|
27
|
+
realtimeServerRenderCheck: TestStatusValue;
|
|
28
|
+
initialServerHmr: TestStatusValue;
|
|
29
|
+
initialClientHmr: TestStatusValue;
|
|
30
|
+
realtimeServerHmr: TestStatusValue;
|
|
31
|
+
realtimeClientHmr: TestStatusValue;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export declare const state: {
|
|
35
|
+
isTearingDown: boolean;
|
|
36
|
+
exitCode: number;
|
|
37
|
+
resources: TestResources;
|
|
38
|
+
options: SmokeTestOptions;
|
|
39
|
+
failures: {
|
|
40
|
+
step: string;
|
|
41
|
+
error: string;
|
|
42
|
+
details?: string;
|
|
43
|
+
}[];
|
|
44
|
+
devTestsRan: boolean;
|
|
45
|
+
releaseTestsRan: boolean;
|
|
46
|
+
testStatus: TestStatus;
|
|
47
|
+
};
|
|
48
|
+
export declare function updateTestStatus(env: "dev" | "production", test: keyof TestStatus["dev"] | keyof TestStatus["production"], status: TestStatusValue): void;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Module-level state to track resources and teardown status
|
|
2
|
+
export const state = {
|
|
3
|
+
isTearingDown: false,
|
|
4
|
+
exitCode: 0,
|
|
5
|
+
resources: {
|
|
6
|
+
tempDirCleanup: undefined,
|
|
7
|
+
workerName: undefined,
|
|
8
|
+
originalCwd: process.cwd(),
|
|
9
|
+
targetDir: undefined,
|
|
10
|
+
workerCreatedDuringTest: false,
|
|
11
|
+
stopDev: undefined,
|
|
12
|
+
},
|
|
13
|
+
options: {},
|
|
14
|
+
// Add a new failures array to track all failures
|
|
15
|
+
failures: [],
|
|
16
|
+
// Track whether tests have actually run
|
|
17
|
+
devTestsRan: false,
|
|
18
|
+
releaseTestsRan: false,
|
|
19
|
+
// New detailed test status tracking
|
|
20
|
+
testStatus: {
|
|
21
|
+
dev: {
|
|
22
|
+
overall: "DID_NOT_RUN",
|
|
23
|
+
initialServerSide: "DID_NOT_RUN",
|
|
24
|
+
initialClientSide: "DID_NOT_RUN",
|
|
25
|
+
initialServerRenderCheck: "DID_NOT_RUN",
|
|
26
|
+
realtimeUpgrade: "DID_NOT_RUN",
|
|
27
|
+
realtimeServerSide: "DID_NOT_RUN",
|
|
28
|
+
realtimeClientSide: "DID_NOT_RUN",
|
|
29
|
+
realtimeServerRenderCheck: "DID_NOT_RUN",
|
|
30
|
+
// HMR test statuses
|
|
31
|
+
initialServerHmr: "DID_NOT_RUN",
|
|
32
|
+
initialClientHmr: "DID_NOT_RUN",
|
|
33
|
+
realtimeServerHmr: "DID_NOT_RUN",
|
|
34
|
+
realtimeClientHmr: "DID_NOT_RUN",
|
|
35
|
+
},
|
|
36
|
+
production: {
|
|
37
|
+
overall: "DID_NOT_RUN",
|
|
38
|
+
releaseCommand: "DID_NOT_RUN",
|
|
39
|
+
initialServerSide: "DID_NOT_RUN",
|
|
40
|
+
initialClientSide: "DID_NOT_RUN",
|
|
41
|
+
initialServerRenderCheck: "DID_NOT_RUN",
|
|
42
|
+
realtimeUpgrade: "DID_NOT_RUN",
|
|
43
|
+
realtimeServerSide: "DID_NOT_RUN",
|
|
44
|
+
realtimeClientSide: "DID_NOT_RUN",
|
|
45
|
+
realtimeServerRenderCheck: "DID_NOT_RUN",
|
|
46
|
+
// HMR test statuses
|
|
47
|
+
initialServerHmr: "DID_NOT_RUN",
|
|
48
|
+
initialClientHmr: "DID_NOT_RUN",
|
|
49
|
+
realtimeServerHmr: "DID_NOT_RUN",
|
|
50
|
+
realtimeClientHmr: "DID_NOT_RUN",
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
// Helper function to update test status
|
|
55
|
+
export function updateTestStatus(env, test, status) {
|
|
56
|
+
state.testStatus[env][test] = status;
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getSmokeTestTemplate(skipClient?: boolean): string;
|