Skip to content

Commit 4be9c48

Browse files
committed
test: added testing for coverage
1 parent 88d47dc commit 4be9c48

7 files changed

Lines changed: 678 additions & 86 deletions

File tree

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import { beforeEach, describe, expect, it, vi } from 'vitest';
2+
3+
const createAuthMessagingServiceMock = vi.fn();
4+
const createAwsEmailTransportMock = vi.fn();
5+
const createAwsSmsTransportMock = vi.fn();
6+
const createTwilioSmsTransportMock = vi.fn();
7+
8+
vi.unmock('../../../src/config/directMessaging.js');
9+
10+
vi.mock('@seamless-auth/messaging', () => {
11+
class MessagingConfigurationError extends Error {}
12+
13+
return {
14+
MessagingConfigurationError,
15+
createAuthMessagingService: createAuthMessagingServiceMock,
16+
};
17+
});
18+
19+
vi.mock('@seamless-auth/messaging-aws', () => ({
20+
createAwsEmailTransport: createAwsEmailTransportMock,
21+
createAwsSmsTransport: createAwsSmsTransportMock,
22+
}));
23+
24+
vi.mock('@seamless-auth/messaging-twilio', () => ({
25+
createTwilioSmsTransport: createTwilioSmsTransportMock,
26+
}));
27+
28+
describe('directMessaging config', () => {
29+
beforeEach(() => {
30+
vi.resetModules();
31+
vi.clearAllMocks();
32+
33+
delete process.env.MESSAGING_AWS_REGION;
34+
delete process.env.AWS_REGION;
35+
delete process.env.REGION;
36+
delete process.env.MESSAGING_EMAIL_FROM;
37+
delete process.env.SES_EMAIL;
38+
delete process.env.MESSAGING_SMS_PROVIDER;
39+
delete process.env.SMS_PROVIDER;
40+
delete process.env.MESSAGING_TWILIO_ACCOUNT_SID;
41+
delete process.env.TWILIO_ACCOUNT_SID;
42+
delete process.env.MESSAGING_TWILIO_AUTH_TOKEN;
43+
delete process.env.TWILIO_AUTH_TOKEN;
44+
delete process.env.MESSAGING_SMS_FROM;
45+
delete process.env.TWILIO_PHONE_NUMBER;
46+
47+
createAwsEmailTransportMock.mockReturnValue({ name: 'aws-email' });
48+
createAwsSmsTransportMock.mockReturnValue({ name: 'aws-sms' });
49+
createTwilioSmsTransportMock.mockReturnValue({ name: 'twilio-sms' });
50+
createAuthMessagingServiceMock.mockReturnValue({ name: 'messaging-service' });
51+
});
52+
53+
it('builds direct messaging with AWS defaults', async () => {
54+
process.env.AWS_REGION = 'us-east-1';
55+
process.env.SES_EMAIL = 'noreply@example.com';
56+
57+
const { createDirectAuthMessagingService } = await import('../../../src/config/directMessaging.js');
58+
59+
const result = createDirectAuthMessagingService('Test App');
60+
61+
expect(createAwsEmailTransportMock).toHaveBeenCalledWith({
62+
region: 'us-east-1',
63+
fromEmail: 'noreply@example.com',
64+
});
65+
expect(createAwsSmsTransportMock).toHaveBeenCalledWith({
66+
region: 'us-east-1',
67+
senderId: undefined,
68+
});
69+
expect(createAuthMessagingServiceMock).toHaveBeenCalledWith({
70+
appName: 'Test App',
71+
email: { name: 'aws-email' },
72+
sms: { name: 'aws-sms' },
73+
});
74+
expect(result).toEqual({ name: 'messaging-service' });
75+
});
76+
77+
it('builds Twilio SMS transport when configured', async () => {
78+
process.env.MESSAGING_AWS_REGION = 'us-west-2';
79+
process.env.MESSAGING_EMAIL_FROM = 'alerts@example.com';
80+
process.env.MESSAGING_SMS_PROVIDER = 'twilio';
81+
process.env.MESSAGING_TWILIO_ACCOUNT_SID = 'sid';
82+
process.env.MESSAGING_TWILIO_AUTH_TOKEN = 'token';
83+
process.env.MESSAGING_SMS_FROM = '+15555550123';
84+
85+
const { createDirectAuthMessagingService } = await import('../../../src/config/directMessaging.js');
86+
87+
createDirectAuthMessagingService('Test App');
88+
89+
expect(createAwsEmailTransportMock).toHaveBeenCalledWith({
90+
region: 'us-west-2',
91+
fromEmail: 'alerts@example.com',
92+
});
93+
expect(createTwilioSmsTransportMock).toHaveBeenCalledWith({
94+
accountSid: 'sid',
95+
authToken: 'token',
96+
fromNumber: '+15555550123',
97+
});
98+
expect(createAwsSmsTransportMock).not.toHaveBeenCalled();
99+
});
100+
101+
it('throws for an unsupported SMS provider', async () => {
102+
process.env.MESSAGING_AWS_REGION = 'us-east-1';
103+
process.env.MESSAGING_EMAIL_FROM = 'noreply@example.com';
104+
process.env.MESSAGING_SMS_PROVIDER = 'postal-pigeon';
105+
106+
const { createDirectAuthMessagingService } = await import('../../../src/config/directMessaging.js');
107+
108+
expect(() => createDirectAuthMessagingService('Test App')).toThrow(
109+
'Unsupported MESSAGING_SMS_PROVIDER "postal-pigeon"',
110+
);
111+
});
112+
});

tests/unit/controllers/authentication.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,26 @@ describe('refreshSession', () => {
8686
expect(res.json).toHaveBeenCalledWith({ error: 'Not allowed' });
8787
});
8888

89+
it('rejects refresh tokens that do not resolve to a session', async () => {
90+
const { refreshSession, AuthEventService, findRefreshSessionByToken } =
91+
await loadAuthenticationModule();
92+
const { req, res } = mockReqRes('Bearer raw-refresh-token');
93+
94+
(findRefreshSessionByToken as any).mockResolvedValue({
95+
session: null,
96+
legacyFallbackCandidates: 2,
97+
usedLegacyFallback: true,
98+
});
99+
(AuthEventService.serviceTokenInvalid as any).mockResolvedValue(undefined);
100+
101+
await refreshSession(req, res);
102+
103+
expect(findRefreshSessionByToken).toHaveBeenCalledWith('raw-refresh-token', expect.any(Date));
104+
expect(AuthEventService.serviceTokenInvalid).toHaveBeenCalledWith(req);
105+
expect(res.status).toHaveBeenCalledWith(401);
106+
expect(res.json).toHaveBeenCalledWith({ error: 'invalid_refresh_token' });
107+
});
108+
89109
it('rotates the session using the raw bearer refresh token in server mode', async () => {
90110
const {
91111
refreshSession,

0 commit comments

Comments
 (0)