diff --git a/src/apps/cli/testdeno/deno.json b/src/apps/cli/testdeno/deno.json index c6de3cd5..b68a120a 100644 --- a/src/apps/cli/testdeno/deno.json +++ b/src/apps/cli/testdeno/deno.json @@ -8,6 +8,7 @@ "test:decoupled-vault": "deno test --env-file=.test.env -A --no-check test-decoupled-vault.ts", "test:remote-commands": "deno test --env-file=.test.env -A --no-check test-remote-commands.ts", "test:settings-writeback": "deno test -A --no-check test-settings-writeback.ts", + "test:remote-administration-exit-codes": "deno test -A --no-check test-remote-administration-exit-codes.ts", "test:push-pull": "deno test --env-file=.test.env -A --no-check test-push-pull.ts", "test:setup-put-cat": "deno test --env-file=.test.env -A --no-check test-setup-put-cat.ts", "test:mirror": "deno test --env-file=.test.env -A --no-check test-mirror.ts", diff --git a/src/apps/cli/testdeno/run-ci-suite.ts b/src/apps/cli/testdeno/run-ci-suite.ts index b7614135..9b5b0c60 100644 --- a/src/apps/cli/testdeno/run-ci-suite.ts +++ b/src/apps/cli/testdeno/run-ci-suite.ts @@ -1,5 +1,6 @@ const TASKS = [ "test:settings-writeback", + "test:remote-administration-exit-codes", "test:setup-put-cat", "test:mirror", "test:daemon", diff --git a/src/apps/cli/testdeno/test-remote-administration-exit-codes.ts b/src/apps/cli/testdeno/test-remote-administration-exit-codes.ts new file mode 100644 index 00000000..ccb20e6b --- /dev/null +++ b/src/apps/cli/testdeno/test-remote-administration-exit-codes.ts @@ -0,0 +1,77 @@ +import { assertEquals, assertStringIncludes } from "@std/assert"; +import { TempDir } from "./helpers/temp.ts"; +import { runCli } from "./helpers/cli.ts"; +import { applyCouchdbSettings, applyP2pSettings, applyP2pTestTweaks, initSettingsFile } from "./helpers/settings.ts"; + +async function prepareFixture(prefix: string) { + const workDir = await TempDir.create(prefix); + const settingsFile = workDir.join("settings.json"); + const databaseDir = workDir.join("database"); + await Deno.mkdir(databaseDir, { recursive: true }); + await initSettingsFile(settingsFile); + return { workDir, settingsFile, databaseDir }; +} + +Deno.test("remote administration process exit policy distinguishes returned verification failure", async () => { + const fixture = await prepareFixture("livesync-cli-remote-admin-exit"); + await using workDir = fixture.workDir; + const { settingsFile, databaseDir } = fixture; + + await applyP2pSettings( + settingsFile, + "remote-admin-exit-room", + "remote-admin-exit-passphrase", + "remote-admin-exit-tests", + "ws://127.0.0.1:1/", + "~.*", + "none" + ); + await applyP2pTestTweaks(settingsFile, "remote-admin-exit-device", "remote-admin-exit-passphrase"); + + const defaultFailure = await runCli(databaseDir, "--settings", settingsFile, "mark-resolved"); + assertEquals(defaultFailure.code, 1, defaultFailure.combined); + assertStringIncludes( + defaultFailure.combined, + "[Verification] Remote administration is unavailable for this provider." + ); + assertStringIncludes(defaultFailure.combined, "[Error] Command 'mark-resolved' failed"); + + const compatibilitySuccess = await runCli( + databaseDir, + "--settings", + settingsFile, + "--compat-remote-admin-exit-zero", + "mark-resolved" + ); + assertEquals(compatibilitySuccess.code, 0, compatibilitySuccess.combined); + assertStringIncludes( + compatibilitySuccess.combined, + "[Verification] Remote administration is unavailable for this provider." + ); + assertStringIncludes(compatibilitySuccess.combined, "[Done] Command 'mark-resolved' completed"); +}); + +Deno.test("remote administration compatibility does not hide a thrown mutation failure", async () => { + const fixture = await prepareFixture("livesync-cli-remote-admin-mutation"); + await using workDir = fixture.workDir; + const { settingsFile, databaseDir } = fixture; + + await applyCouchdbSettings( + settingsFile, + "http://127.0.0.1:1/", + "unreachable-user", + "unreachable-password", + "unreachable-database" + ); + + const mutationFailure = await runCli( + databaseDir, + "--settings", + settingsFile, + "--compat-remote-admin-exit-zero", + "mark-resolved" + ); + assertEquals(mutationFailure.code, 1, mutationFailure.combined); + assertStringIncludes(mutationFailure.combined, "[Command] mark-resolved"); + assertStringIncludes(mutationFailure.combined, "[Error] Failed to start:"); +});