Quick Connect (the DEFAULT add-connection mode) has no username field, so every
auth-build site (username && password ? {..} : undefined) produced undefined auth
whenever a password was set but username empty -> NO Authorization header -> 401
against a password-protected server. This is the common setup
(OPENCODE_SERVER_PASSWORD=... opencode serve) and a top install->churn cause:
user sets a password, can't connect, gives up.
Fix: extract buildAuth() to a pure, testable module; when a password is present but
username is empty, default username to 'opencode' (the server's own default,
OPENCODE_SERVER_USERNAME ?? 'opencode'). Advanced mode's explicit username is
preserved. Replaced all 6 inline ternaries in connections.ts.
+3 regression tests (68 total pass), typecheck clean. Found while setting up an
on-device emulator test of the connect flow.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
23 lines
1.1 KiB
TypeScript
23 lines
1.1 KiB
TypeScript
import { test } from "node:test"
|
|
import assert from "node:assert/strict"
|
|
import { buildAuth } from "./auth.ts"
|
|
|
|
test("no password -> no auth (open server)", () => {
|
|
assert.equal(buildAuth("opencode", undefined), undefined)
|
|
assert.equal(buildAuth("opencode", null), undefined)
|
|
assert.equal(buildAuth("opencode", ""), undefined)
|
|
})
|
|
|
|
test("password but no username -> defaults username to 'opencode' (Quick Connect fix)", () => {
|
|
// Regression guard: Quick Connect has no username field. Before the fix, an empty
|
|
// username made auth undefined and the app sent NO Authorization header -> 401.
|
|
assert.deepEqual(buildAuth(undefined, "secret"), { username: "opencode", password: "secret" })
|
|
assert.deepEqual(buildAuth("", "secret"), { username: "opencode", password: "secret" })
|
|
assert.deepEqual(buildAuth(" ", "secret"), { username: "opencode", password: "secret" })
|
|
})
|
|
|
|
test("explicit username preserved (Advanced mode), trimmed", () => {
|
|
assert.deepEqual(buildAuth("alice", "secret"), { username: "alice", password: "secret" })
|
|
assert.deepEqual(buildAuth(" alice ", "secret"), { username: "alice", password: "secret" })
|
|
})
|