forked from FlowwStar/FlowStar
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwallet-lobstr.test.ts
More file actions
129 lines (102 loc) · 5.11 KB
/
Copy pathwallet-lobstr.test.ts
File metadata and controls
129 lines (102 loc) · 5.11 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import { describe, it, expect, vi, beforeEach } from "vitest";
// Reset modules between tests so module-level WC state (_lobstrWcClient / _lobstrWcSession)
// and window stubs don't bleed between cases.
beforeEach(() => {
vi.resetModules();
vi.unstubAllGlobals();
});
async function getLobstrAdapter() {
const mod = await import("../../components/providers/wallet-provider");
return mod.lobstrAdapter;
}
// ─── isAvailable ─────────────────────────────────────────────────────────────
describe("lobstrAdapter.isAvailable", () => {
it("returns true even without extension (WalletConnect fallback always present)", async () => {
vi.stubGlobal("window", {});
const adapter = await getLobstrAdapter();
expect(adapter.isAvailable()).toBe(true);
});
it("returns true when extension is present", async () => {
vi.stubGlobal("window", { lobstrSDK: {} });
const adapter = await getLobstrAdapter();
expect(adapter.isAvailable()).toBe(true);
});
});
// ─── connect — extension path ─────────────────────────────────────────────────
describe("lobstrAdapter.connect — extension", () => {
it("uses window.lobstrSDK.getPublicKey when extension is present", async () => {
const mockGetPublicKey = vi
.fn()
.mockResolvedValue({ publicKey: "GTEST_ADDRESS_123" });
vi.stubGlobal("window", { lobstrSDK: { getPublicKey: mockGetPublicKey } });
const adapter = await getLobstrAdapter();
const addr = await adapter.connect();
expect(addr).toBe("GTEST_ADDRESS_123");
expect(mockGetPublicKey).toHaveBeenCalledOnce();
});
it("throws when extension getPublicKey returns empty key", async () => {
const mockGetPublicKey = vi.fn().mockResolvedValue({ publicKey: "" });
vi.stubGlobal("window", { lobstrSDK: { getPublicKey: mockGetPublicKey } });
const adapter = await getLobstrAdapter();
await expect(adapter.connect()).rejects.toThrow(
"LOBSTR did not return a public key.",
);
});
});
// ─── connect — WalletConnect path ─────────────────────────────────────────────
describe("lobstrAdapter.connect — WalletConnect fallback", () => {
it("throws descriptive error when project ID env var is not set", async () => {
vi.stubGlobal("window", {}); // no extension
const saved = process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID;
delete process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID;
const adapter = await getLobstrAdapter();
await expect(adapter.connect()).rejects.toThrow(
"NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID",
);
if (saved !== undefined)
process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID = saved;
});
it("mentions cloud.walletconnect.com in the missing-project-ID error", async () => {
vi.stubGlobal("window", {});
const saved = process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID;
delete process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID;
const adapter = await getLobstrAdapter();
await expect(adapter.connect()).rejects.toThrow("cloud.walletconnect.com");
if (saved !== undefined)
process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID = saved;
});
});
// ─── signTransaction — extension path ────────────────────────────────────────
describe("lobstrAdapter.signTransaction — extension", () => {
it("calls extension signTransaction and returns signed XDR", async () => {
const mockSign = vi
.fn()
.mockResolvedValue({ signedXdr: "SIGNED_XDR_PAYLOAD" });
vi.stubGlobal("window", { lobstrSDK: { signTransaction: mockSign } });
const adapter = await getLobstrAdapter();
const passphrase = "Test SDF Network ; September 2015";
const result = await adapter.signTransaction("RAW_XDR", passphrase);
expect(result).toBe("SIGNED_XDR_PAYLOAD");
expect(mockSign).toHaveBeenCalledWith("RAW_XDR", {
networkPassphrase: passphrase,
});
});
it("throws when extension signTransaction returns empty signedXdr", async () => {
const mockSign = vi.fn().mockResolvedValue({ signedXdr: "" });
vi.stubGlobal("window", { lobstrSDK: { signTransaction: mockSign } });
const adapter = await getLobstrAdapter();
await expect(adapter.signTransaction("XDR", "passphrase")).rejects.toThrow(
"LOBSTR signing failed.",
);
});
});
// ─── signTransaction — WalletConnect path ────────────────────────────────────
describe("lobstrAdapter.signTransaction — WalletConnect fallback", () => {
it("throws when no WalletConnect session is active", async () => {
vi.stubGlobal("window", {}); // no extension
const adapter = await getLobstrAdapter();
await expect(adapter.signTransaction("XDR", "passphrase")).rejects.toThrow(
"No active LOBSTR WalletConnect session.",
);
});
});