File size: 2,423 Bytes
fb4d8fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import fs from "node:fs";
import path from "node:path";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { isPathWithinBase } from "../../test/helpers/paths.js";
import { withTempHome } from "../../test/helpers/temp-home.js";

const runtime = {
  log: vi.fn(),
  error: vi.fn(),
  exit: vi.fn(),
};

describe("web logout", () => {
  beforeEach(() => {
    vi.clearAllMocks();
  });

  afterEach(() => {
    vi.restoreAllMocks();
  });

  it("deletes cached credentials when present", { timeout: 60_000 }, async () => {
    await withTempHome(async (home) => {
      const { logoutWeb } = await import("./session.js");
      const { resolveDefaultWebAuthDir } = await import("./auth-store.js");
      const authDir = resolveDefaultWebAuthDir();

      expect(isPathWithinBase(home, authDir)).toBe(true);

      fs.mkdirSync(authDir, { recursive: true });
      fs.writeFileSync(path.join(authDir, "creds.json"), "{}");
      const result = await logoutWeb({ runtime: runtime as never });

      expect(result).toBe(true);
      expect(fs.existsSync(authDir)).toBe(false);
    });
  });

  it("no-ops when nothing to delete", { timeout: 60_000 }, async () => {
    await withTempHome(async () => {
      const { logoutWeb } = await import("./session.js");
      const result = await logoutWeb({ runtime: runtime as never });
      expect(result).toBe(false);
      expect(runtime.log).toHaveBeenCalled();
    });
  });

  it("keeps shared oauth.json when using legacy auth dir", async () => {
    await withTempHome(async () => {
      const { logoutWeb } = await import("./session.js");

      const { resolveOAuthDir } = await import("../config/paths.js");
      const credsDir = resolveOAuthDir();

      fs.mkdirSync(credsDir, { recursive: true });
      fs.writeFileSync(path.join(credsDir, "creds.json"), "{}");
      fs.writeFileSync(path.join(credsDir, "oauth.json"), '{"token":true}');
      fs.writeFileSync(path.join(credsDir, "session-abc.json"), "{}");

      const result = await logoutWeb({
        authDir: credsDir,
        isLegacyAuthDir: true,
        runtime: runtime as never,
      });
      expect(result).toBe(true);
      expect(fs.existsSync(path.join(credsDir, "oauth.json"))).toBe(true);
      expect(fs.existsSync(path.join(credsDir, "creds.json"))).toBe(false);
      expect(fs.existsSync(path.join(credsDir, "session-abc.json"))).toBe(false);
    });
  });
});