Skip to content

Commit c4b23a7

Browse files
committed
feat: Add SIWE tracking test suite
1 parent 7668b65 commit c4b23a7

File tree

9 files changed

+2004
-2020
lines changed

9 files changed

+2004
-2020
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import { describe, it, expect, beforeAll, afterAll, afterEach } from "vitest";
2+
import { setupServer } from "msw/node";
3+
import { http, HttpResponse } from "msw";
4+
import { trackLogin, trackLoginError } from "./siwe.js";
5+
import type { ThirdwebClient } from "../../client/client.js";
6+
7+
const server = setupServer(
8+
http.post("https://c.thirdweb.com/event", () => {
9+
return HttpResponse.json({});
10+
}),
11+
);
12+
13+
describe("SIWE tracking", () => {
14+
beforeAll(() => server.listen());
15+
afterEach(() => server.resetHandlers());
16+
afterAll(() => server.close());
17+
18+
const mockClient: ThirdwebClient = {
19+
clientId: "test-client-id",
20+
secretKey: undefined,
21+
};
22+
23+
it("should track successful logins", async () => {
24+
let requestBody: any;
25+
server.use(
26+
http.post("https://c.thirdweb.com/event", async (handler) => {
27+
requestBody = await handler.request.json();
28+
return HttpResponse.json({});
29+
}),
30+
);
31+
32+
await trackLogin({
33+
client: mockClient,
34+
walletAddress: "0x1234567890123456789012345678901234567890",
35+
walletType: "metamask",
36+
chainId: 1,
37+
});
38+
39+
expect(requestBody).toEqual({
40+
source: "sdk",
41+
action: "login:attempt",
42+
clientId: "test-client-id",
43+
walletAddress: "0x1234567890123456789012345678901234567890",
44+
walletType: "metamask",
45+
chainId: 1,
46+
errorCode: undefined,
47+
});
48+
});
49+
50+
it("should track login errors", async () => {
51+
let requestBody: any;
52+
server.use(
53+
http.post("https://c.thirdweb.com/event", async (handler) => {
54+
requestBody = await handler.request.json();
55+
return HttpResponse.json({});
56+
}),
57+
);
58+
59+
await trackLoginError({
60+
client: mockClient,
61+
walletAddress: "0x1234567890123456789012345678901234567890",
62+
walletType: "metamask",
63+
chainId: 1,
64+
error: {
65+
message: "Signature verification failed",
66+
code: "SIGNATURE_VERIFICATION_FAILED",
67+
},
68+
});
69+
70+
expect(requestBody).toEqual({
71+
source: "sdk",
72+
action: "login:attempt",
73+
clientId: "test-client-id",
74+
walletAddress: "0x1234567890123456789012345678901234567890",
75+
walletType: "metamask",
76+
chainId: 1,
77+
errorCode:
78+
'{"message":"Signature verification failed","code":"SIGNATURE_VERIFICATION_FAILED"}',
79+
});
80+
});
81+
82+
it("should send a POST request with correct headers", async () => {
83+
let requestHeaders: any;
84+
server.use(
85+
http.post("https://c.thirdweb.com/event", (handler) => {
86+
requestHeaders = handler.request.headers;
87+
return HttpResponse.json({});
88+
}),
89+
);
90+
91+
await trackLogin({
92+
client: mockClient,
93+
ecosystem: {
94+
id: "ecosystem.test-ecosystem-id",
95+
partnerId: "test-partner-id",
96+
},
97+
walletAddress: "0x1234567890123456789012345678901234567890",
98+
walletType: "metamask",
99+
chainId: 1,
100+
});
101+
102+
expect(requestHeaders.get("x-client-id")).toEqual("test-client-id");
103+
expect(requestHeaders.get("x-ecosystem-id")).toEqual(
104+
"ecosystem.test-ecosystem-id",
105+
);
106+
expect(requestHeaders.get("x-ecosystem-partner-id")).toEqual(
107+
"test-partner-id",
108+
);
109+
});
110+
});

packages/thirdweb/src/analytics/track/siwe.ts

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,66 +4,66 @@ import { stringify } from "../../utils/json.js";
44
import { track } from "./index.js";
55

66
type SiweEvent = {
7-
client: ThirdwebClient;
8-
ecosystem?: Ecosystem;
9-
walletAddress?: string;
10-
walletType?: string;
11-
chainId?: number;
12-
error?: {
13-
message: string;
14-
code: string;
15-
};
7+
client: ThirdwebClient;
8+
ecosystem?: Ecosystem;
9+
walletAddress?: string;
10+
walletType?: string;
11+
chainId?: number;
12+
error?: {
13+
message: string;
14+
code: string;
15+
};
1616
};
1717

1818
type SiweSuccessEvent = SiweEvent & {
19-
error?: undefined;
19+
error?: undefined;
2020
};
2121

2222
/**
2323
* @internal
2424
*/
25-
export function trackLogin(event: SiweSuccessEvent) {
26-
trackSiweEvent({
27-
...event,
28-
type: "login:success",
29-
});
25+
export async function trackLogin(event: SiweSuccessEvent) {
26+
return trackSiweEvent({
27+
...event,
28+
action: "login:attempt",
29+
});
3030
}
3131

3232
type SiweErrorEvent = SiweEvent & {
33-
error: {
34-
message: string;
35-
code: string;
36-
};
33+
error: {
34+
message: string;
35+
code: string;
36+
};
3737
};
3838

3939
/**
4040
* @internal
4141
*/
42-
export function trackLoginError(event: SiweErrorEvent) {
43-
trackSiweEvent({
44-
...event,
45-
type: "login:error",
46-
});
42+
export async function trackLoginError(event: SiweErrorEvent) {
43+
return trackSiweEvent({
44+
...event,
45+
action: "login:attempt",
46+
});
4747
}
4848

4949
/**
5050
* @internal
5151
*/
52-
function trackSiweEvent(
53-
event: SiweEvent & {
54-
type: "login:success" | "login:error";
55-
},
52+
async function trackSiweEvent(
53+
event: SiweEvent & {
54+
action: "login:attempt";
55+
},
5656
) {
57-
track({
58-
client: event.client,
59-
ecosystem: event.ecosystem,
60-
data: {
61-
action: event.type,
62-
clientId: event.client.clientId,
63-
chainId: event.chainId,
64-
walletAddress: event.walletAddress,
65-
walletType: event.walletType,
66-
errorCode: stringify(event.error),
67-
},
68-
});
57+
return track({
58+
client: event.client,
59+
ecosystem: event.ecosystem,
60+
data: {
61+
action: event.action,
62+
clientId: event.client.clientId,
63+
chainId: event.chainId,
64+
walletAddress: event.walletAddress,
65+
walletType: event.walletType,
66+
errorCode: stringify(event.error),
67+
},
68+
});
6969
}

0 commit comments

Comments
 (0)