@levr-one/auth 1.0.3 → 1.1.1
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/oauth-client.d.ts.map +1 -1
- package/dist/oauth-client.js +7 -2
- package/dist/oauth-client.js.map +1 -1
- package/dist/oauth-client.test.js +4 -1
- package/dist/oauth-client.test.js.map +1 -1
- package/dist/token-store.d.ts +21 -0
- package/dist/token-store.d.ts.map +1 -1
- package/dist/token-store.js +35 -6
- package/dist/token-store.js.map +1 -1
- package/dist/workspace-store.d.ts +70 -26
- package/dist/workspace-store.d.ts.map +1 -1
- package/dist/workspace-store.js +302 -78
- package/dist/workspace-store.js.map +1 -1
- package/dist/workspace-store.test.js +418 -0
- package/dist/workspace-store.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -15,9 +15,14 @@ let saveWorkspace;
|
|
|
15
15
|
let clearWorkspace;
|
|
16
16
|
let getWorkspaceFilePath;
|
|
17
17
|
let loadIdentityCache;
|
|
18
|
+
let refreshMirror;
|
|
18
19
|
let saveIdentityCache;
|
|
19
20
|
beforeEach(async () => {
|
|
20
21
|
state.tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'tq-ws-test-'));
|
|
22
|
+
// The backend resolver reads TQ_BACKEND_URL, so a developer or CI runner
|
|
23
|
+
// with it exported would silently re-key every expectation here (8 of these
|
|
24
|
+
// failed that way before this line existed).
|
|
25
|
+
vi.stubEnv('TQ_BACKEND_URL', '');
|
|
21
26
|
vi.resetModules();
|
|
22
27
|
const mod = await import('./workspace-store.js');
|
|
23
28
|
loadWorkspace = mod.loadWorkspace;
|
|
@@ -25,9 +30,11 @@ beforeEach(async () => {
|
|
|
25
30
|
clearWorkspace = mod.clearWorkspace;
|
|
26
31
|
getWorkspaceFilePath = mod.getWorkspaceFilePath;
|
|
27
32
|
loadIdentityCache = mod.loadIdentityCache;
|
|
33
|
+
refreshMirror = mod.refreshMirror;
|
|
28
34
|
saveIdentityCache = mod.saveIdentityCache;
|
|
29
35
|
});
|
|
30
36
|
afterEach(() => {
|
|
37
|
+
vi.unstubAllEnvs();
|
|
31
38
|
fs.rmSync(state.tmpDir, { recursive: true, force: true });
|
|
32
39
|
});
|
|
33
40
|
describe('getWorkspaceFilePath', () => {
|
|
@@ -166,4 +173,415 @@ describe('loadIdentityCache', () => {
|
|
|
166
173
|
expect(loadIdentityCache()).toBeNull();
|
|
167
174
|
});
|
|
168
175
|
});
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
// internal — per-backend keying
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
//
|
|
180
|
+
// The file is keyed by backend URL, same key space as oauth-tokens.json. The
|
|
181
|
+
// load-bearing assertions are the NEGATIVE ones: an id saved against one
|
|
182
|
+
// backend must never be readable for another. Before this, a login against a
|
|
183
|
+
// local/worktree backend overwrote a single global slot, and the next
|
|
184
|
+
// `yarn setup:mcp` stamped that local id into a STAGING Workspace-Id header.
|
|
185
|
+
const STAGING = 'https://api.levr.now';
|
|
186
|
+
const WORKTREE = 'http://localhost:9780';
|
|
187
|
+
describe('per-backend keying', () => {
|
|
188
|
+
it('does not return a worktree workspace id for staging', () => {
|
|
189
|
+
saveWorkspace('ws-local', WORKTREE);
|
|
190
|
+
expect(loadWorkspace(STAGING)).toBeNull();
|
|
191
|
+
});
|
|
192
|
+
it('does not return a staging workspace id for a worktree', () => {
|
|
193
|
+
saveWorkspace('ws-staging', STAGING);
|
|
194
|
+
expect(loadWorkspace(WORKTREE)).toBeNull();
|
|
195
|
+
});
|
|
196
|
+
it('keeps both backends independently readable', () => {
|
|
197
|
+
saveWorkspace('ws-staging', STAGING);
|
|
198
|
+
saveWorkspace('ws-local', WORKTREE);
|
|
199
|
+
expect(loadWorkspace(STAGING)).toBe('ws-staging');
|
|
200
|
+
expect(loadWorkspace(WORKTREE)).toBe('ws-local');
|
|
201
|
+
});
|
|
202
|
+
it('saving one backend does not clobber another', () => {
|
|
203
|
+
saveWorkspace('ws-staging', STAGING);
|
|
204
|
+
saveWorkspace('ws-local', WORKTREE);
|
|
205
|
+
saveWorkspace('ws-staging-2', STAGING);
|
|
206
|
+
expect(loadWorkspace(WORKTREE)).toBe('ws-local');
|
|
207
|
+
});
|
|
208
|
+
it('treats two worktrees on different ports as different backends', () => {
|
|
209
|
+
saveWorkspace('ws-a', 'http://localhost:8180');
|
|
210
|
+
saveWorkspace('ws-b', 'http://localhost:8580');
|
|
211
|
+
expect(loadWorkspace('http://localhost:8180')).toBe('ws-a');
|
|
212
|
+
expect(loadWorkspace('http://localhost:8580')).toBe('ws-b');
|
|
213
|
+
});
|
|
214
|
+
it('normalizes trailing slashes so one backend is one key', () => {
|
|
215
|
+
saveWorkspace('ws-staging', `${STAGING}/`);
|
|
216
|
+
expect(loadWorkspace(STAGING)).toBe('ws-staging');
|
|
217
|
+
});
|
|
218
|
+
it('saveWorkspace preserves the identity fields already cached for that backend', () => {
|
|
219
|
+
saveIdentityCache({
|
|
220
|
+
workspace_id: 'ws-1',
|
|
221
|
+
user_id: 'u-1',
|
|
222
|
+
user_email: 'a@b.com',
|
|
223
|
+
user_name: 'A',
|
|
224
|
+
role: 'owner',
|
|
225
|
+
}, STAGING);
|
|
226
|
+
saveWorkspace('ws-2', STAGING);
|
|
227
|
+
expect(loadIdentityCache(STAGING)).toEqual({
|
|
228
|
+
workspace_id: 'ws-2',
|
|
229
|
+
user_id: 'u-1',
|
|
230
|
+
user_email: 'a@b.com',
|
|
231
|
+
user_name: 'A',
|
|
232
|
+
role: 'owner',
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
it('scopes the identity cache per backend', () => {
|
|
236
|
+
saveIdentityCache({
|
|
237
|
+
workspace_id: 'ws-1',
|
|
238
|
+
user_id: 'u-1',
|
|
239
|
+
user_email: 'a@b.com',
|
|
240
|
+
user_name: 'A',
|
|
241
|
+
role: 'owner',
|
|
242
|
+
}, STAGING);
|
|
243
|
+
expect(loadIdentityCache(WORKTREE)).toBeNull();
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
describe('clearWorkspace is per-backend', () => {
|
|
247
|
+
it('clears only the named backend', () => {
|
|
248
|
+
saveWorkspace('ws-staging', STAGING);
|
|
249
|
+
saveWorkspace('ws-local', WORKTREE);
|
|
250
|
+
clearWorkspace(WORKTREE);
|
|
251
|
+
expect(loadWorkspace(WORKTREE)).toBeNull();
|
|
252
|
+
expect(loadWorkspace(STAGING)).toBe('ws-staging');
|
|
253
|
+
});
|
|
254
|
+
it('removes the file once the last backend is cleared', () => {
|
|
255
|
+
saveWorkspace('ws-staging', STAGING);
|
|
256
|
+
clearWorkspace(STAGING);
|
|
257
|
+
expect(fs.existsSync(getWorkspaceFilePath())).toBe(false);
|
|
258
|
+
});
|
|
259
|
+
it('is a no-op for a backend with no entry', () => {
|
|
260
|
+
saveWorkspace('ws-staging', STAGING);
|
|
261
|
+
clearWorkspace(WORKTREE);
|
|
262
|
+
expect(loadWorkspace(STAGING)).toBe('ws-staging');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe('legacy flat-file migration', () => {
|
|
266
|
+
const legacy = {
|
|
267
|
+
workspace_id: 'ws-legacy',
|
|
268
|
+
user_id: 'u-1',
|
|
269
|
+
user_email: 'a@b.com',
|
|
270
|
+
user_name: 'A',
|
|
271
|
+
role: 'owner',
|
|
272
|
+
};
|
|
273
|
+
function writeLegacy() {
|
|
274
|
+
const tqDir = path.join(state.tmpDir, '.tq');
|
|
275
|
+
fs.mkdirSync(tqDir, { recursive: true });
|
|
276
|
+
fs.writeFileSync(path.join(tqDir, 'workspace.json'), JSON.stringify(legacy));
|
|
277
|
+
}
|
|
278
|
+
it('attributes a legacy record to the configured backend and rewrites the file keyed', () => {
|
|
279
|
+
writeLegacy();
|
|
280
|
+
// No ~/.tq/config.json in the temp home, so the configured backend falls
|
|
281
|
+
// back to staging — the same attribution readTokenMap() uses.
|
|
282
|
+
expect(loadWorkspace(STAGING)).toBe('ws-legacy');
|
|
283
|
+
const onDisk = JSON.parse(fs.readFileSync(getWorkspaceFilePath(), 'utf-8'));
|
|
284
|
+
// Exactly one url key — the record is attributed, not duplicated across
|
|
285
|
+
// backends. The remaining top-level fields are the transitional mirror
|
|
286
|
+
// (see the back-compat describe below), which old clients read.
|
|
287
|
+
expect(Object.keys(onDisk).filter((k) => k.startsWith('http'))).toEqual([
|
|
288
|
+
STAGING,
|
|
289
|
+
]);
|
|
290
|
+
expect(onDisk[STAGING]).toEqual(legacy);
|
|
291
|
+
});
|
|
292
|
+
it('does not serve a migrated legacy record to a different backend', () => {
|
|
293
|
+
writeLegacy();
|
|
294
|
+
expect(loadWorkspace(WORKTREE)).toBeNull();
|
|
295
|
+
});
|
|
296
|
+
it('preserves the identity fields through migration', () => {
|
|
297
|
+
writeLegacy();
|
|
298
|
+
expect(loadIdentityCache(STAGING)).toEqual(legacy);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
// internal — transitional top-level mirror
|
|
303
|
+
// ---------------------------------------------------------------------------
|
|
304
|
+
//
|
|
305
|
+
// ~/.tq is machine-global but every checkout runs its own plugins/*/dist, and
|
|
306
|
+
// a worktree on a feature branch does not get this code until it merges main.
|
|
307
|
+
// An OLD reader that finds no `.workspace_id` falls through to
|
|
308
|
+
// ensureWorkspace(), whose old saveWorkspace() rewrites the file FLAT and
|
|
309
|
+
// wipes every other backend. The mirror keeps those readers resolving so they
|
|
310
|
+
// never reach that write.
|
|
311
|
+
/** Exactly what a pre-internal loadWorkspace() did. */
|
|
312
|
+
function readAsOldClient() {
|
|
313
|
+
const raw = fs.readFileSync(getWorkspaceFilePath(), 'utf-8');
|
|
314
|
+
const data = JSON.parse(raw);
|
|
315
|
+
return typeof data.workspace_id === 'string' ? data.workspace_id : null;
|
|
316
|
+
}
|
|
317
|
+
describe('back-compat mirror', () => {
|
|
318
|
+
it('an old client still resolves the configured backend after a keyed write', () => {
|
|
319
|
+
saveWorkspace('ws-staging', STAGING);
|
|
320
|
+
expect(readAsOldClient()).toBe('ws-staging');
|
|
321
|
+
});
|
|
322
|
+
it('mirrors the CONFIGURED backend, not whichever was written last', () => {
|
|
323
|
+
// No config.json in the temp home, so the configured backend is staging.
|
|
324
|
+
saveWorkspace('ws-staging', STAGING);
|
|
325
|
+
saveWorkspace('ws-local', WORKTREE);
|
|
326
|
+
expect(readAsOldClient()).toBe('ws-staging');
|
|
327
|
+
});
|
|
328
|
+
it('mirrors the full identity, not just the id', () => {
|
|
329
|
+
saveIdentityCache({
|
|
330
|
+
workspace_id: 'ws-1',
|
|
331
|
+
user_id: 'u-1',
|
|
332
|
+
user_email: 'a@b.com',
|
|
333
|
+
user_name: 'A',
|
|
334
|
+
role: 'owner',
|
|
335
|
+
}, STAGING);
|
|
336
|
+
const raw = JSON.parse(fs.readFileSync(getWorkspaceFilePath(), 'utf-8'));
|
|
337
|
+
expect(raw.user_email).toBe('a@b.com');
|
|
338
|
+
expect(raw.role).toBe('owner');
|
|
339
|
+
});
|
|
340
|
+
it('keeps the url-keyed entries alongside the mirror', () => {
|
|
341
|
+
saveWorkspace('ws-staging', STAGING);
|
|
342
|
+
saveWorkspace('ws-local', WORKTREE);
|
|
343
|
+
const raw = JSON.parse(fs.readFileSync(getWorkspaceFilePath(), 'utf-8'));
|
|
344
|
+
expect(raw[STAGING].workspace_id).toBe('ws-staging');
|
|
345
|
+
expect(raw[WORKTREE].workspace_id).toBe('ws-local');
|
|
346
|
+
});
|
|
347
|
+
it('writes NO mirror when the configured backend has no entry', () => {
|
|
348
|
+
saveWorkspace('ws-local', WORKTREE);
|
|
349
|
+
expect(readAsOldClient()).toBeNull();
|
|
350
|
+
});
|
|
351
|
+
it('does not treat a mirrored file as legacy on re-read (the collapse trap)', () => {
|
|
352
|
+
// The legacy test must be "no url keys", never "has workspace_id" — a
|
|
353
|
+
// current file has both, and reading it as legacy would collapse every
|
|
354
|
+
// backend into the configured one.
|
|
355
|
+
saveWorkspace('ws-staging', STAGING);
|
|
356
|
+
saveWorkspace('ws-local', WORKTREE);
|
|
357
|
+
expect(loadWorkspace(WORKTREE)).toBe('ws-local');
|
|
358
|
+
expect(loadWorkspace(STAGING)).toBe('ws-staging');
|
|
359
|
+
});
|
|
360
|
+
it('survives repeated read-write cycles without collapsing backends', () => {
|
|
361
|
+
saveWorkspace('ws-staging', STAGING);
|
|
362
|
+
saveWorkspace('ws-local', WORKTREE);
|
|
363
|
+
for (let i = 0; i < 3; i++) {
|
|
364
|
+
loadWorkspace(STAGING);
|
|
365
|
+
saveWorkspace(`ws-staging-${i}`, STAGING);
|
|
366
|
+
}
|
|
367
|
+
expect(loadWorkspace(WORKTREE)).toBe('ws-local');
|
|
368
|
+
});
|
|
369
|
+
it('the mirror never resurrects a cleared backend', () => {
|
|
370
|
+
saveWorkspace('ws-staging', STAGING);
|
|
371
|
+
clearWorkspace(STAGING);
|
|
372
|
+
expect(fs.existsSync(getWorkspaceFilePath())).toBe(false);
|
|
373
|
+
});
|
|
374
|
+
it('drops the mirror when the configured backend is cleared but others remain', () => {
|
|
375
|
+
saveWorkspace('ws-staging', STAGING);
|
|
376
|
+
saveWorkspace('ws-local', WORKTREE);
|
|
377
|
+
clearWorkspace(STAGING);
|
|
378
|
+
expect(readAsOldClient()).toBeNull();
|
|
379
|
+
expect(loadWorkspace(WORKTREE)).toBe('ws-local');
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
// ---------------------------------------------------------------------------
|
|
383
|
+
// Code-review regressions (internal F-001, F-002, F-004, F-005)
|
|
384
|
+
// ---------------------------------------------------------------------------
|
|
385
|
+
function writeTqFile(name, body) {
|
|
386
|
+
const tqDir = path.join(state.tmpDir, '.tq');
|
|
387
|
+
fs.mkdirSync(tqDir, { recursive: true });
|
|
388
|
+
fs.writeFileSync(path.join(tqDir, name), JSON.stringify(body));
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Run `fn` with the test-env flags lifted, so `loadConfig()` uses its REAL
|
|
392
|
+
* precedence. Both `config.json` (tier 2) and the stored token (tier 3) are
|
|
393
|
+
* deliberately skipped under vitest for determinism (`config.ts:187,216`), so
|
|
394
|
+
* without this the backend resolver always returns the staging default and
|
|
395
|
+
* the F-001 regression is unreachable from a test.
|
|
396
|
+
*/
|
|
397
|
+
async function withProductionConfigResolution(fn) {
|
|
398
|
+
const savedVitest = process.env.VITEST;
|
|
399
|
+
const savedNodeEnv = process.env.NODE_ENV;
|
|
400
|
+
delete process.env.VITEST;
|
|
401
|
+
delete process.env.NODE_ENV;
|
|
402
|
+
try {
|
|
403
|
+
vi.resetModules();
|
|
404
|
+
fn(await import('./workspace-store.js'));
|
|
405
|
+
}
|
|
406
|
+
finally {
|
|
407
|
+
if (savedVitest !== undefined)
|
|
408
|
+
process.env.VITEST = savedVitest;
|
|
409
|
+
if (savedNodeEnv !== undefined)
|
|
410
|
+
process.env.NODE_ENV = savedNodeEnv;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
describe('F-001 — the write key follows the backend callers actually use', () => {
|
|
414
|
+
it('keys an unkeyed save to config.json, not to a hardcoded staging', async () => {
|
|
415
|
+
writeTqFile('config.json', {
|
|
416
|
+
environment: 'custom',
|
|
417
|
+
apiUrl: WORKTREE,
|
|
418
|
+
authUrl: WORKTREE,
|
|
419
|
+
clientUrl: WORKTREE,
|
|
420
|
+
oauthClientId: '2',
|
|
421
|
+
});
|
|
422
|
+
await withProductionConfigResolution((mod) => {
|
|
423
|
+
mod.saveWorkspace('ws-local');
|
|
424
|
+
expect(mod.loadWorkspace(WORKTREE)).toBe('ws-local');
|
|
425
|
+
expect(mod.loadWorkspace(STAGING)).toBeNull();
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
it('keys to the STORED TOKEN backend when config.json is absent', async () => {
|
|
429
|
+
// The decisive tier. `getCurrentApiUrl()` (the old resolver) knows only
|
|
430
|
+
// TQ_BACKEND_URL and config.json, so with neither it returned undefined
|
|
431
|
+
// and the fallback guessed staging — filing a LOCAL id under the STAGING
|
|
432
|
+
// key, which is internal reappearing through its own fix.
|
|
433
|
+
writeTqFile('oauth-tokens.json', {
|
|
434
|
+
[WORKTREE]: {
|
|
435
|
+
accessToken: 'a',
|
|
436
|
+
refreshToken: 'r',
|
|
437
|
+
expiresAt: Date.now() + 3_600_000,
|
|
438
|
+
apiBaseUrl: WORKTREE,
|
|
439
|
+
},
|
|
440
|
+
});
|
|
441
|
+
await withProductionConfigResolution((mod) => {
|
|
442
|
+
mod.saveWorkspace('ws-from-worktree');
|
|
443
|
+
expect(mod.loadWorkspace(WORKTREE)).toBe('ws-from-worktree');
|
|
444
|
+
expect(mod.loadWorkspace(STAGING)).toBeNull();
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
describe('F-002 — refreshMirror re-points the mirror after an env switch', () => {
|
|
449
|
+
it('leaves an old client reading the NEW configured backend', async () => {
|
|
450
|
+
const cfg = (apiUrl) => ({
|
|
451
|
+
environment: 'custom',
|
|
452
|
+
apiUrl,
|
|
453
|
+
authUrl: apiUrl,
|
|
454
|
+
clientUrl: apiUrl,
|
|
455
|
+
oauthClientId: '2',
|
|
456
|
+
});
|
|
457
|
+
writeTqFile('config.json', cfg(WORKTREE));
|
|
458
|
+
await withProductionConfigResolution((mod) => {
|
|
459
|
+
mod.saveWorkspace('ws-local', WORKTREE);
|
|
460
|
+
mod.saveWorkspace('ws-staging', STAGING);
|
|
461
|
+
expect(readAsOldClient()).toBe('ws-local');
|
|
462
|
+
});
|
|
463
|
+
// `tq:env staging` — rewrites config.json and touches nothing else.
|
|
464
|
+
writeTqFile('config.json', cfg(STAGING));
|
|
465
|
+
await withProductionConfigResolution((mod) => {
|
|
466
|
+
// Stale: the mirror still points at the backend we switched AWAY from,
|
|
467
|
+
// so an old client would pin the wrong workspace. Before the file was
|
|
468
|
+
// keyed, tq:env deleted it outright and they fell back to unpinned.
|
|
469
|
+
expect(readAsOldClient()).toBe('ws-local');
|
|
470
|
+
mod.refreshMirror();
|
|
471
|
+
expect(readAsOldClient()).toBe('ws-staging');
|
|
472
|
+
// ...and no keyed entry was disturbed.
|
|
473
|
+
expect(mod.loadWorkspace(WORKTREE)).toBe('ws-local');
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
it('is a no-op when no file exists', () => {
|
|
477
|
+
expect(() => refreshMirror()).not.toThrow();
|
|
478
|
+
expect(fs.existsSync(getWorkspaceFilePath())).toBe(false);
|
|
479
|
+
});
|
|
480
|
+
});
|
|
481
|
+
describe('F-004 — the mirror never promotes a url-shaped field to an entry', () => {
|
|
482
|
+
it('ignores a url-shaped field nested inside an entry', () => {
|
|
483
|
+
writeTqFile('workspace.json', {
|
|
484
|
+
[STAGING]: {
|
|
485
|
+
workspace_id: 'ws-staging',
|
|
486
|
+
[WORKTREE]: { workspace_id: 'ws-EVIL' },
|
|
487
|
+
},
|
|
488
|
+
});
|
|
489
|
+
saveWorkspace('ws-staging-2', STAGING);
|
|
490
|
+
expect(loadWorkspace(WORKTREE)).toBeNull();
|
|
491
|
+
const raw = JSON.parse(fs.readFileSync(getWorkspaceFilePath(), 'utf-8'));
|
|
492
|
+
expect(raw[WORKTREE]).toBeUndefined();
|
|
493
|
+
});
|
|
494
|
+
it('mirrors only the five identity fields', () => {
|
|
495
|
+
writeTqFile('workspace.json', {
|
|
496
|
+
[STAGING]: { workspace_id: 'ws-1', junk: 'nope' },
|
|
497
|
+
});
|
|
498
|
+
saveWorkspace('ws-2', STAGING);
|
|
499
|
+
const raw = JSON.parse(fs.readFileSync(getWorkspaceFilePath(), 'utf-8'));
|
|
500
|
+
expect(raw.junk).toBeUndefined();
|
|
501
|
+
expect(raw.workspace_id).toBe('ws-2');
|
|
502
|
+
});
|
|
503
|
+
});
|
|
504
|
+
describe('F-005 — write and read agree on what is a valid key', () => {
|
|
505
|
+
it('does not silently lose a pin given a scheme-less backend url', () => {
|
|
506
|
+
// Previously written to disk under a key every read then discarded — a
|
|
507
|
+
// permanent, silent loss with no error anywhere.
|
|
508
|
+
saveWorkspace('ws-x', 'localhost:8080');
|
|
509
|
+
expect(loadWorkspace()).toBe('ws-x'); // landed on the configured backend
|
|
510
|
+
expect(loadWorkspace(STAGING)).toBe('ws-x');
|
|
511
|
+
});
|
|
512
|
+
it('treats an empty backend url as "unspecified"', () => {
|
|
513
|
+
saveWorkspace('ws-y', '');
|
|
514
|
+
expect(loadWorkspace(STAGING)).toBe('ws-y');
|
|
515
|
+
});
|
|
516
|
+
});
|
|
517
|
+
// ---------------------------------------------------------------------------
|
|
518
|
+
// internal — the cross-file key invariant
|
|
519
|
+
// ---------------------------------------------------------------------------
|
|
520
|
+
//
|
|
521
|
+
// Both file headers claim workspace.json and oauth-tokens.json share a key
|
|
522
|
+
// space. Nothing asserted it, and they diverged: saveTokens keyed on
|
|
523
|
+
// apiBaseUrl verbatim while this store stripped trailing slashes, so one
|
|
524
|
+
// authServerUrl could file the token and the identity under different keys —
|
|
525
|
+
// and loadTokens/clearTokens, which resolve through the stripped
|
|
526
|
+
// getCurrentApiUrl(), then missed the token entirely.
|
|
527
|
+
describe('workspace.json and oauth-tokens.json agree on the key', () => {
|
|
528
|
+
const BACKEND = 'http://localhost:9480';
|
|
529
|
+
async function saveBoth(url, wsId) {
|
|
530
|
+
const tokens = await import('./token-store.js');
|
|
531
|
+
tokens.saveTokens({
|
|
532
|
+
accessToken: 'a',
|
|
533
|
+
refreshToken: 'r',
|
|
534
|
+
expiresAt: Date.now() + 3_600_000,
|
|
535
|
+
apiBaseUrl: url,
|
|
536
|
+
});
|
|
537
|
+
saveWorkspace(wsId, url);
|
|
538
|
+
}
|
|
539
|
+
function keysOf(file) {
|
|
540
|
+
const p = path.join(state.tmpDir, '.tq', file);
|
|
541
|
+
if (!fs.existsSync(p))
|
|
542
|
+
return [];
|
|
543
|
+
return Object.keys(JSON.parse(fs.readFileSync(p, 'utf-8'))).filter((k) => k.startsWith('http'));
|
|
544
|
+
}
|
|
545
|
+
it('files both under the same key for one authServerUrl', async () => {
|
|
546
|
+
await saveBoth(BACKEND, 'ws-1');
|
|
547
|
+
expect(keysOf('oauth-tokens.json')).toEqual([BACKEND]);
|
|
548
|
+
expect(keysOf('workspace.json')).toEqual([BACKEND]);
|
|
549
|
+
});
|
|
550
|
+
it('agrees even when the url carries a trailing slash', async () => {
|
|
551
|
+
// The exact divergence: verbatim on one side, stripped on the other.
|
|
552
|
+
await saveBoth(`${BACKEND}/`, 'ws-1');
|
|
553
|
+
expect(keysOf('oauth-tokens.json')).toEqual(keysOf('workspace.json'));
|
|
554
|
+
expect(keysOf('workspace.json')).toEqual([BACKEND]);
|
|
555
|
+
});
|
|
556
|
+
it('a slashed and an unslashed write land on ONE entry, not two', async () => {
|
|
557
|
+
await saveBoth(BACKEND, 'ws-1');
|
|
558
|
+
await saveBoth(`${BACKEND}/`, 'ws-2');
|
|
559
|
+
expect(keysOf('oauth-tokens.json')).toHaveLength(1);
|
|
560
|
+
expect(keysOf('workspace.json')).toHaveLength(1);
|
|
561
|
+
expect(loadWorkspace(BACKEND)).toBe('ws-2');
|
|
562
|
+
});
|
|
563
|
+
it('heals a token key written before normalization existed', async () => {
|
|
564
|
+
const tqDir = path.join(state.tmpDir, '.tq');
|
|
565
|
+
fs.mkdirSync(tqDir, { recursive: true });
|
|
566
|
+
fs.writeFileSync(path.join(tqDir, 'oauth-tokens.json'), JSON.stringify({
|
|
567
|
+
[`${BACKEND}/`]: {
|
|
568
|
+
accessToken: 'a',
|
|
569
|
+
refreshToken: 'r',
|
|
570
|
+
expiresAt: Date.now() + 3_600_000,
|
|
571
|
+
apiBaseUrl: `${BACKEND}/`,
|
|
572
|
+
},
|
|
573
|
+
}));
|
|
574
|
+
const tokens = await import('./token-store.js');
|
|
575
|
+
// Reading through the map normalizes it, so the entry becomes reachable
|
|
576
|
+
// by the canonical key every consumer actually looks up.
|
|
577
|
+
expect(tokens.loadTokensForEnv('local')).toBeNull(); // different backend
|
|
578
|
+
tokens.saveTokens({
|
|
579
|
+
accessToken: 'b',
|
|
580
|
+
refreshToken: 'r',
|
|
581
|
+
expiresAt: Date.now() + 3_600_000,
|
|
582
|
+
apiBaseUrl: BACKEND,
|
|
583
|
+
});
|
|
584
|
+
expect(keysOf('oauth-tokens.json')).toEqual([BACKEND]);
|
|
585
|
+
});
|
|
586
|
+
});
|
|
169
587
|
//# sourceMappingURL=workspace-store.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-store.test.js","sourceRoot":"","sources":["../src/workspace-store.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workspace-store.test.js","sourceRoot":"","sources":["../src/workspace-store.test.ts"],"names":[],"mappings":"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"}
|