Skip to content

Commit 690303f

Browse files
committed
test: keybind parsing & credential multi-field stripping
Add unit tests for the completely untested Keybind module (parse, match, toString, fromParsedKey) which gates all TUI keyboard interactions, and extend credential store tests to cover simultaneous multi-field sensitive data stripping plus Docker containerToConfig conditional field omission. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> https://claude.ai/code/session_01Lui6DcLFYL75nCttunEPpH
1 parent abcaa1d commit 690303f

2 files changed

Lines changed: 289 additions & 1 deletion

File tree

packages/opencode/test/altimate/connections.test.ts

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ afterAll(() => { delete process.env.ALTIMATE_TELEMETRY_DISABLED })
1212
import * as Registry from "../../src/altimate/native/connections/registry"
1313
import * as CredentialStore from "../../src/altimate/native/connections/credential-store"
1414
import { parseDbtProfiles } from "../../src/altimate/native/connections/dbt-profiles"
15-
import { discoverContainers } from "../../src/altimate/native/connections/docker-discovery"
15+
import { discoverContainers, containerToConfig } from "../../src/altimate/native/connections/docker-discovery"
1616
import { registerAll } from "../../src/altimate/native/connections/register"
1717

1818
// ---------------------------------------------------------------------------
@@ -128,6 +128,39 @@ describe("CredentialStore", () => {
128128
expect(warnings.length).toBeGreaterThan(0)
129129
})
130130

131+
test("saveConnection strips all sensitive fields from complex config", async () => {
132+
const config = {
133+
type: "snowflake",
134+
account: "abc123",
135+
user: "svc_user",
136+
password: "pw123",
137+
private_key: "-----BEGIN PRIVATE KEY-----",
138+
private_key_passphrase: "passphrase",
139+
token: "oauth-token",
140+
oauth_client_secret: "client-secret",
141+
ssh_password: "ssh-pw",
142+
connection_string: "mongodb://...",
143+
} as any
144+
const { sanitized, warnings } = await CredentialStore.saveConnection("complex", config)
145+
146+
// All sensitive fields stripped
147+
expect(sanitized.password).toBeUndefined()
148+
expect(sanitized.private_key).toBeUndefined()
149+
expect(sanitized.private_key_passphrase).toBeUndefined()
150+
expect(sanitized.token).toBeUndefined()
151+
expect(sanitized.oauth_client_secret).toBeUndefined()
152+
expect(sanitized.ssh_password).toBeUndefined()
153+
expect(sanitized.connection_string).toBeUndefined()
154+
155+
// Non-sensitive fields preserved
156+
expect(sanitized.type).toBe("snowflake")
157+
expect(sanitized.account).toBe("abc123")
158+
expect(sanitized.user).toBe("svc_user")
159+
160+
// One warning per stripped field
161+
expect(warnings).toHaveLength(7)
162+
})
163+
131164
test("saveConnection strips OAuth credentials as sensitive", async () => {
132165
const config = { type: "snowflake", authenticator: "oauth", token: "access-token-123", oauth_client_secret: "secret" } as any
133166
const { sanitized } = await CredentialStore.saveConnection("sf_oauth", config)
@@ -272,6 +305,29 @@ describe("Docker discovery", () => {
272305
const containers = await discoverContainers()
273306
expect(containers).toEqual([])
274307
})
308+
309+
test("containerToConfig omits undefined optional fields", () => {
310+
const container = {
311+
container_id: "def456",
312+
name: "mysql_dev",
313+
image: "mysql:8",
314+
db_type: "mysql",
315+
host: "127.0.0.1",
316+
port: 3306,
317+
user: undefined as string | undefined,
318+
password: undefined as string | undefined,
319+
database: undefined as string | undefined,
320+
status: "running",
321+
}
322+
const config = containerToConfig(container as any)
323+
expect(config.type).toBe("mysql")
324+
expect(config.host).toBe("127.0.0.1")
325+
expect(config.port).toBe(3306)
326+
// Optional fields should not be set when undefined
327+
expect(config.user).toBeUndefined()
328+
expect(config.password).toBeUndefined()
329+
expect(config.database).toBeUndefined()
330+
})
275331
})
276332

277333
// ---------------------------------------------------------------------------
Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
import { describe, test, expect } from "bun:test"
2+
import { Keybind } from "../../src/util/keybind"
3+
4+
// ---------------------------------------------------------------------------
5+
// Keybind.parse
6+
// ---------------------------------------------------------------------------
7+
8+
describe("Keybind.parse", () => {
9+
test("parses simple key", () => {
10+
const result = Keybind.parse("a")
11+
expect(result).toHaveLength(1)
12+
expect(result[0]).toMatchObject({
13+
ctrl: false,
14+
meta: false,
15+
shift: false,
16+
leader: false,
17+
name: "a",
18+
})
19+
})
20+
21+
test("parses ctrl modifier", () => {
22+
const [key] = Keybind.parse("ctrl+a")
23+
expect(key.ctrl).toBe(true)
24+
expect(key.name).toBe("a")
25+
})
26+
27+
test("parses alt/meta/option as meta", () => {
28+
expect(Keybind.parse("alt+x")[0].meta).toBe(true)
29+
expect(Keybind.parse("meta+x")[0].meta).toBe(true)
30+
expect(Keybind.parse("option+x")[0].meta).toBe(true)
31+
})
32+
33+
test("parses multiple modifiers", () => {
34+
const [key] = Keybind.parse("ctrl+shift+a")
35+
expect(key.ctrl).toBe(true)
36+
expect(key.shift).toBe(true)
37+
expect(key.name).toBe("a")
38+
})
39+
40+
test("parses super modifier", () => {
41+
const [key] = Keybind.parse("super+a")
42+
expect(key.super).toBe(true)
43+
expect(key.name).toBe("a")
44+
})
45+
46+
test("parses leader key", () => {
47+
const [key] = Keybind.parse("<leader>a")
48+
expect(key.leader).toBe(true)
49+
expect(key.name).toBe("a")
50+
})
51+
52+
test("parses comma-separated multiple bindings", () => {
53+
const result = Keybind.parse("ctrl+a,ctrl+b")
54+
expect(result).toHaveLength(2)
55+
expect(result[0].name).toBe("a")
56+
expect(result[1].name).toBe("b")
57+
})
58+
59+
test("normalizes esc to escape", () => {
60+
const [key] = Keybind.parse("esc")
61+
expect(key.name).toBe("escape")
62+
})
63+
64+
test("returns empty array for 'none'", () => {
65+
expect(Keybind.parse("none")).toEqual([])
66+
})
67+
})
68+
69+
// ---------------------------------------------------------------------------
70+
// Keybind.match
71+
// ---------------------------------------------------------------------------
72+
73+
describe("Keybind.match", () => {
74+
test("matches identical keys", () => {
75+
const key: Keybind.Info = {
76+
ctrl: true,
77+
meta: false,
78+
shift: false,
79+
leader: false,
80+
name: "a",
81+
super: false,
82+
}
83+
expect(Keybind.match(key, key)).toBe(true)
84+
})
85+
86+
test("returns false for undefined first arg", () => {
87+
const key: Keybind.Info = {
88+
ctrl: false,
89+
meta: false,
90+
shift: false,
91+
leader: false,
92+
name: "a",
93+
super: false,
94+
}
95+
expect(Keybind.match(undefined, key)).toBe(false)
96+
})
97+
98+
test("normalizes missing super field to false", () => {
99+
const a = { ctrl: false, meta: false, shift: false, leader: false, name: "x" } as Keybind.Info
100+
const b: Keybind.Info = {
101+
ctrl: false,
102+
meta: false,
103+
shift: false,
104+
leader: false,
105+
name: "x",
106+
super: false,
107+
}
108+
expect(Keybind.match(a, b)).toBe(true)
109+
})
110+
111+
test("super: true vs super: false don't match", () => {
112+
const a: Keybind.Info = {
113+
ctrl: false,
114+
meta: false,
115+
shift: false,
116+
leader: false,
117+
name: "a",
118+
super: true,
119+
}
120+
const b: Keybind.Info = {
121+
ctrl: false,
122+
meta: false,
123+
shift: false,
124+
leader: false,
125+
name: "a",
126+
super: false,
127+
}
128+
expect(Keybind.match(a, b)).toBe(false)
129+
})
130+
131+
test("different modifiers don't match", () => {
132+
const a: Keybind.Info = {
133+
ctrl: true,
134+
meta: false,
135+
shift: false,
136+
leader: false,
137+
name: "a",
138+
super: false,
139+
}
140+
const b: Keybind.Info = {
141+
ctrl: false,
142+
meta: false,
143+
shift: false,
144+
leader: false,
145+
name: "a",
146+
super: false,
147+
}
148+
expect(Keybind.match(a, b)).toBe(false)
149+
})
150+
})
151+
152+
// ---------------------------------------------------------------------------
153+
// Keybind.toString
154+
// ---------------------------------------------------------------------------
155+
156+
describe("Keybind.toString", () => {
157+
test("returns empty string for undefined", () => {
158+
expect(Keybind.toString(undefined)).toBe("")
159+
})
160+
161+
test("formats simple key", () => {
162+
const key: Keybind.Info = {
163+
ctrl: false,
164+
meta: false,
165+
shift: false,
166+
leader: false,
167+
name: "a",
168+
super: false,
169+
}
170+
expect(Keybind.toString(key)).toBe("a")
171+
})
172+
173+
test("formats modifiers in order: ctrl+alt+super+shift", () => {
174+
const key: Keybind.Info = {
175+
ctrl: true,
176+
meta: true,
177+
shift: true,
178+
leader: false,
179+
name: "a",
180+
super: true,
181+
}
182+
expect(Keybind.toString(key)).toBe("ctrl+alt+super+shift+a")
183+
})
184+
185+
test("formats leader prefix", () => {
186+
const key: Keybind.Info = {
187+
ctrl: false,
188+
meta: false,
189+
shift: false,
190+
leader: true,
191+
name: "a",
192+
super: false,
193+
}
194+
expect(Keybind.toString(key)).toBe("<leader> a")
195+
})
196+
197+
test("maps delete to del", () => {
198+
const key: Keybind.Info = {
199+
ctrl: false,
200+
meta: false,
201+
shift: false,
202+
leader: false,
203+
name: "delete",
204+
super: false,
205+
}
206+
expect(Keybind.toString(key)).toBe("del")
207+
})
208+
})
209+
210+
// ---------------------------------------------------------------------------
211+
// Keybind.fromParsedKey
212+
// ---------------------------------------------------------------------------
213+
214+
describe("Keybind.fromParsedKey", () => {
215+
test("normalizes space to 'space'", () => {
216+
const parsed = { name: " ", ctrl: false, meta: false, shift: false, super: false }
217+
const result = Keybind.fromParsedKey(parsed as any)
218+
expect(result.name).toBe("space")
219+
})
220+
221+
test("sets leader flag when passed", () => {
222+
const parsed = { name: "a", ctrl: false, meta: false, shift: false, super: false }
223+
const result = Keybind.fromParsedKey(parsed as any, true)
224+
expect(result.leader).toBe(true)
225+
})
226+
227+
test("defaults leader to false", () => {
228+
const parsed = { name: "a", ctrl: false, meta: false, shift: false, super: false }
229+
const result = Keybind.fromParsedKey(parsed as any)
230+
expect(result.leader).toBe(false)
231+
})
232+
})

0 commit comments

Comments
 (0)