83 lines
3.2 KiB
JavaScript
83 lines
3.2 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
const assert = require("assert");
|
|
const cp = require("child_process");
|
|
const path = require("path");
|
|
|
|
const repo = path.resolve(__dirname, "..");
|
|
const coordinator = "https://coord.example.test";
|
|
const defaultOperatorEndpoint = "https://disasmer.michelpaulissen.com:9443";
|
|
|
|
function disasmer(args) {
|
|
return JSON.parse(
|
|
cp.execFileSync(
|
|
"cargo",
|
|
["run", "-q", "-p", "disasmer-cli", "--bin", "disasmer", "--", ...args],
|
|
{ cwd: repo, encoding: "utf8" }
|
|
)
|
|
);
|
|
}
|
|
|
|
function disasmerRaw(args, env = {}) {
|
|
return cp.spawnSync(
|
|
"cargo",
|
|
["run", "-q", "-p", "disasmer-cli", "--bin", "disasmer", "--", ...args],
|
|
{
|
|
cwd: repo,
|
|
encoding: "utf8",
|
|
env: {
|
|
...process.env,
|
|
...env,
|
|
},
|
|
}
|
|
);
|
|
}
|
|
|
|
const device = disasmer(["login", "--coordinator", coordinator, "--json"]);
|
|
assert.strictEqual(device.coordinator, coordinator);
|
|
assert(device.human_flow.Device, "default human login should use device flow");
|
|
assert.strictEqual(device.human_flow.Device.verification_url, `${coordinator}/auth/device`);
|
|
assert.match(device.human_flow.Device.user_code, /^DISASMER-[A-F0-9]{4}-[A-F0-9]{4}$/);
|
|
assert.match(device.human_flow.Device.device_code, /^sha256:[a-f0-9]{64}$/);
|
|
assert.strictEqual(device.human_flow.Device.expires_in_seconds, 900);
|
|
assert.strictEqual(device.human_flow.Device.yields_long_lived_secret_directly, false);
|
|
|
|
const defaultDevice = disasmer(["login", "--json"]);
|
|
assert.strictEqual(defaultDevice.coordinator, defaultOperatorEndpoint);
|
|
assert.strictEqual(
|
|
defaultDevice.human_flow.Device.verification_url,
|
|
`${defaultOperatorEndpoint}/auth/device`
|
|
);
|
|
|
|
const browser = disasmer(["login", "--browser", "--plan", "--coordinator", coordinator, "--json"]);
|
|
assert.strictEqual(browser.coordinator, coordinator);
|
|
assert(browser.human_flow.Browser, "browser login should be available for human users");
|
|
assert.match(
|
|
browser.human_flow.Browser.authorization_url,
|
|
new RegExp(`^${coordinator.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}/auth/browser/start\\?`)
|
|
);
|
|
assert.match(browser.human_flow.Browser.callback_path, /^http:\/\/127\.0\.0\.1:\d+\/callback$/);
|
|
assert.match(browser.human_flow.Browser.state, /^sha256:[a-f0-9]{64}$/);
|
|
|
|
const nonInteractiveBrowser = disasmerRaw(
|
|
["login", "--browser", "--non-interactive", "--coordinator", coordinator, "--json"],
|
|
{
|
|
DISASMER_BROWSER_OPEN_COMMAND:
|
|
"node -e 'require(\"fs\").writeFileSync(\"/tmp/disasmer-browser-should-not-open\", \"opened\")'",
|
|
}
|
|
);
|
|
assert.strictEqual(nonInteractiveBrowser.status, 20, nonInteractiveBrowser.stderr);
|
|
assert.doesNotMatch(nonInteractiveBrowser.stderr, /Opening Disasmer browser login/);
|
|
const nonInteractiveReport = JSON.parse(nonInteractiveBrowser.stdout);
|
|
assert.strictEqual(nonInteractiveReport.status, "authentication_required");
|
|
assert.strictEqual(nonInteractiveReport.non_interactive, true);
|
|
assert.strictEqual(nonInteractiveReport.browser_opened, false);
|
|
assert.strictEqual(nonInteractiveReport.machine_error.category, "authentication");
|
|
assert.strictEqual(nonInteractiveReport.machine_error.stable_exit_code, 20);
|
|
assert(
|
|
nonInteractiveReport.machine_error.next_actions.includes(
|
|
"rerun without --non-interactive to open the browser"
|
|
)
|
|
);
|
|
|
|
console.log("CLI login smoke passed");
|