dolphin-server-modules 1.5.1 → 1.5.3

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.
Files changed (46) hide show
  1. package/DOLPHIN_MASTER_GUIDE_NEPALI.md +369 -478
  2. package/dist/adapters/mongoose/index.test.d.ts +1 -0
  3. package/dist/adapters/mongoose/index.test.js +103 -0
  4. package/dist/adapters/mongoose/index.test.js.map +1 -0
  5. package/dist/auth/auth.test.d.ts +1 -0
  6. package/dist/auth/auth.test.js +291 -0
  7. package/dist/auth/auth.test.js.map +1 -0
  8. package/dist/authController/authController.test.d.ts +1 -0
  9. package/dist/authController/authController.test.js +361 -0
  10. package/dist/authController/authController.test.js.map +1 -0
  11. package/dist/controller/controller.test.d.ts +1 -0
  12. package/dist/controller/controller.test.js +39 -0
  13. package/dist/controller/controller.test.js.map +1 -0
  14. package/dist/curd/crud.js +78 -25
  15. package/dist/curd/crud.js.map +1 -1
  16. package/dist/curd/crud.test.d.ts +1 -0
  17. package/dist/curd/crud.test.js +163 -0
  18. package/dist/curd/crud.test.js.map +1 -0
  19. package/dist/djson/djson.d.ts +42 -0
  20. package/dist/djson/djson.js +318 -0
  21. package/dist/djson/djson.js.map +1 -0
  22. package/dist/index.d.ts +1 -5
  23. package/dist/index.js +1 -12
  24. package/dist/index.js.map +1 -1
  25. package/dist/middleware/zod.test.d.ts +1 -0
  26. package/dist/middleware/zod.test.js +76 -0
  27. package/dist/middleware/zod.test.js.map +1 -0
  28. package/dist/realtime/core.d.ts +27 -28
  29. package/dist/realtime/core.js +297 -65
  30. package/dist/realtime/core.js.map +1 -1
  31. package/dist/realtime/index.d.ts +1 -1
  32. package/dist/realtime/index.js +1 -1
  33. package/dist/realtime/index.js.map +1 -1
  34. package/dist/realtime/plugins.d.ts +17 -4
  35. package/dist/realtime/plugins.js +300 -14
  36. package/dist/realtime/plugins.js.map +1 -1
  37. package/dist/realtime/realtime.test.d.ts +1 -0
  38. package/dist/realtime/realtime.test.js +271 -0
  39. package/dist/realtime/realtime.test.js.map +1 -0
  40. package/package.json +4 -2
  41. package/dist/router/router.d.ts +0 -26
  42. package/dist/router/router.js +0 -71
  43. package/dist/router/router.js.map +0 -1
  44. package/dist/server/server.d.ts +0 -23
  45. package/dist/server/server.js +0 -219
  46. package/dist/server/server.js.map +0 -1
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("./index");
4
+ describe('Mongoose Adapter', () => {
5
+ let adapter;
6
+ let mockModel;
7
+ beforeEach(() => {
8
+ // Helper to create chainable mock for mongoose queries (generic)
9
+ const chainable = (result) => {
10
+ const chain = {
11
+ sort: jest.fn().mockReturnThis(),
12
+ skip: jest.fn().mockReturnThis(),
13
+ limit: jest.fn().mockReturnThis(),
14
+ select: jest.fn().mockReturnThis(),
15
+ lean: jest.fn().mockResolvedValue(result),
16
+ then: jest.fn().mockResolvedValue(result),
17
+ exec: jest.fn().mockResolvedValue(result),
18
+ };
19
+ return chain;
20
+ };
21
+ mockModel = {
22
+ create: jest.fn(),
23
+ find: jest.fn(() => chainable([])),
24
+ findOne: jest.fn(() => chainable(undefined)),
25
+ findById: jest.fn(() => chainable(undefined)),
26
+ findByIdAndUpdate: jest.fn(() => chainable(undefined)),
27
+ findByIdAndDelete: jest.fn(() => chainable(undefined)),
28
+ findOneAndUpdate: jest.fn(() => chainable(undefined)),
29
+ findOneAndDelete: jest.fn(() => chainable(undefined)),
30
+ updateMany: jest.fn(),
31
+ deleteMany: jest.fn(),
32
+ insertMany: jest.fn(),
33
+ deleteOne: jest.fn(),
34
+ countDocuments: jest.fn().mockResolvedValue(0),
35
+ };
36
+ adapter = (0, index_1.createMongooseAdapter)({
37
+ User: mockModel,
38
+ RefreshToken: mockModel,
39
+ models: { test: mockModel },
40
+ leanByDefault: true,
41
+ });
42
+ });
43
+ it('should map id to _id and $like in queries', async () => {
44
+ await adapter.read('test', {
45
+ id: '123',
46
+ name: { $like: 'john' }
47
+ });
48
+ expect(mockModel.find).toHaveBeenCalledWith(expect.objectContaining({
49
+ _id: '123',
50
+ name: { $regex: 'john', $options: 'i' }
51
+ }));
52
+ });
53
+ it('should map returned documents to standard shape (id instead of _id)', async () => {
54
+ const mockDoc = {
55
+ _id: 'some-id',
56
+ __v: 0,
57
+ name: 'Test User',
58
+ toObject: () => ({ _id: 'some-id', __v: 0, name: 'Test User' })
59
+ };
60
+ mockModel.create.mockResolvedValueOnce(mockDoc);
61
+ const result = await adapter.createUser({ name: 'Test User' });
62
+ expect(result).toEqual({
63
+ id: 'some-id',
64
+ name: 'Test User'
65
+ });
66
+ expect(result._id).toBeUndefined();
67
+ expect(result.__v).toBeUndefined();
68
+ });
69
+ it('should support readOne by id', async () => {
70
+ const mockDoc = { _id: '123', name: 'Test' };
71
+ mockModel.findOne.mockReturnValueOnce({
72
+ lean: jest.fn().mockResolvedValue(mockDoc)
73
+ });
74
+ const result = await adapter.readOne('test', '123');
75
+ expect(mockModel.findOne).toHaveBeenCalledWith({ _id: '123' });
76
+ expect(result).toEqual({ id: '123', name: 'Test' });
77
+ });
78
+ it('should support updateOne', async () => {
79
+ const mockUpdated = { _id: '123', name: 'Updated' };
80
+ mockModel.findOneAndUpdate.mockReturnValueOnce({
81
+ lean: jest.fn().mockResolvedValue(mockUpdated)
82
+ });
83
+ const result = await adapter.updateOne('test', '123', { name: 'Updated' });
84
+ expect(mockModel.findOneAndUpdate).toHaveBeenCalledWith({ _id: '123' }, expect.objectContaining({ name: 'Updated' }), expect.objectContaining({ new: true }));
85
+ expect(result.id).toBe('123');
86
+ });
87
+ it('should support advancedRead with sort, offset and limit', async () => {
88
+ await adapter.advancedRead('test', { status: 'active' }, {
89
+ sort: { createdAt: 'desc' },
90
+ offset: 10,
91
+ limit: 20
92
+ });
93
+ expect(mockModel.find).toHaveBeenCalledWith(expect.objectContaining({ status: 'active' }));
94
+ });
95
+ it('should attach model shortcuts correctly', () => {
96
+ expect(adapter.User).toBeDefined();
97
+ expect(adapter.test).toBeDefined();
98
+ expect(adapter.RefreshToken).toBeDefined();
99
+ expect(adapter.User.collection).toBe('User');
100
+ expect(adapter.test.collection).toBe('test');
101
+ });
102
+ });
103
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../adapters/mongoose/index.test.ts"],"names":[],"mappings":";;AAAA,mCAAgD;AAEhD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,OAAY,CAAC;IACjB,IAAI,SAAc,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE;QACd,iEAAiE;QACjE,MAAM,SAAS,GAAG,CAAU,MAAU,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG;gBACZ,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;gBAChC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;gBAChC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;gBACjC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;gBAClC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;gBACzC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;gBACzC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;aAC1C,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,SAAS,GAAG;YACV,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YACjB,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAClC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC5C,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC7C,iBAAiB,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtD,iBAAiB,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACtD,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACrD,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACrD,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;YACrB,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;YACrB,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;YACpB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;SAC/C,CAAC;QAEF,OAAO,GAAG,IAAA,6BAAqB,EAAC;YAC9B,IAAI,EAAE,SAAS;YACf,YAAY,EAAE,SAAS;YACvB,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC3B,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE;YACzB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;SACxB,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACzC,MAAM,CAAC,gBAAgB,CAAC;YACtB,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE;SACxC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,OAAO,GAAG;YACd,GAAG,EAAE,SAAS;YACd,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SAChE,CAAC;QAEF,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAE/D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC7C,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAC;YACpC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEpD,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACpD,SAAS,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;YAC7C,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC;SAC/C,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAE3E,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CACrD,EAAE,GAAG,EAAE,KAAK,EAAE,EACd,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAC5C,MAAM,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CACvC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;YACvD,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;YAC3B,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACzC,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QAE3C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ // test/auth/auth.test.ts
7
+ const auth_1 = require("./auth");
8
+ const node_crypto_1 = __importDefault(require("node:crypto"));
9
+ class MockAuthDB {
10
+ users = [];
11
+ tokens = [];
12
+ async createUser(data) {
13
+ const id = node_crypto_1.default.randomBytes(8).toString('hex');
14
+ const u = { id, ...data };
15
+ this.users.push(u);
16
+ return u;
17
+ }
18
+ async findUserByEmail(email) {
19
+ return this.users.find(u => u.email === email);
20
+ }
21
+ async findUserById(id) {
22
+ return this.users.find(u => u.id === id);
23
+ }
24
+ async updateUser(id, data) {
25
+ const idx = this.users.findIndex(u => u.id === id);
26
+ if (idx > -1)
27
+ this.users[idx] = { ...this.users[idx], ...data };
28
+ return this.users[idx];
29
+ }
30
+ async saveRefreshToken(data) {
31
+ this.tokens.push(data);
32
+ }
33
+ async findRefreshToken(token) {
34
+ return this.tokens.find(t => t.token === token) || null;
35
+ }
36
+ async deleteRefreshToken(token) {
37
+ this.tokens = this.tokens.filter(t => t.token !== token);
38
+ }
39
+ }
40
+ describe('Auth Module', () => {
41
+ let db;
42
+ let auth;
43
+ beforeEach(() => {
44
+ db = new MockAuthDB();
45
+ auth = (0, auth_1.createAuth)({
46
+ secret: 'test-secret',
47
+ cookieMaxAge: 1000 * 60 * 60,
48
+ issuer: 'TestApp'
49
+ });
50
+ });
51
+ describe('Registration', () => {
52
+ it('registers a new user successfully', async () => {
53
+ const user = await auth.register(db, {
54
+ email: 'test@example.com',
55
+ password: 'password123'
56
+ });
57
+ expect(user.email).toBe('test@example.com');
58
+ expect(user.role).toBe('user');
59
+ expect(user.id).toBeDefined();
60
+ });
61
+ it('throws error for missing fields', async () => {
62
+ await expect(auth.register(db, { email: '', password: '123' }))
63
+ .rejects.toThrow('Missing fields');
64
+ });
65
+ });
66
+ describe('Login', () => {
67
+ beforeEach(async () => {
68
+ await auth.register(db, {
69
+ email: 'test@example.com',
70
+ password: 'password123'
71
+ });
72
+ });
73
+ it('logs in successfully with correct credentials', async () => {
74
+ const result = await auth.login(db, {
75
+ email: 'test@example.com',
76
+ password: 'password123'
77
+ });
78
+ expect(result.accessToken).toBeDefined();
79
+ expect(result.user.email).toBe('test@example.com');
80
+ expect(result.user.role).toBe('user');
81
+ });
82
+ it('rejects invalid password', async () => {
83
+ await expect(auth.login(db, {
84
+ email: 'test@example.com',
85
+ password: 'wrong'
86
+ })).rejects.toThrow('Invalid credentials');
87
+ });
88
+ it('rejects non-existent email', async () => {
89
+ await expect(auth.login(db, {
90
+ email: 'nonexistent@example.com',
91
+ password: 'password123'
92
+ })).rejects.toThrow('Invalid credentials');
93
+ });
94
+ });
95
+ describe('Middleware', () => {
96
+ let token;
97
+ let userId;
98
+ beforeEach(async () => {
99
+ const user = await auth.register(db, {
100
+ email: 'middleware@example.com',
101
+ password: 'password123'
102
+ });
103
+ userId = user.id;
104
+ const loginResult = await auth.login(db, {
105
+ email: 'middleware@example.com',
106
+ password: 'password123'
107
+ });
108
+ token = loginResult.accessToken;
109
+ });
110
+ it('should allow access with valid token', async () => {
111
+ const req = {
112
+ headers: { authorization: `Bearer ${token}` },
113
+ user: null
114
+ };
115
+ const res = {
116
+ status: jest.fn().mockReturnThis(),
117
+ json: jest.fn()
118
+ };
119
+ let nextCalled = false;
120
+ const next = () => { nextCalled = true; };
121
+ const middleware = auth.middleware();
122
+ await middleware(req, res, next);
123
+ expect(nextCalled).toBe(true);
124
+ expect(req.user).toBeDefined();
125
+ expect(req.user.id).toBe(userId);
126
+ });
127
+ it('should reject request without token', async () => {
128
+ const req = {
129
+ headers: {},
130
+ user: null
131
+ };
132
+ const res = {
133
+ status: jest.fn().mockReturnThis(),
134
+ json: jest.fn()
135
+ };
136
+ const next = jest.fn();
137
+ const middleware = auth.middleware();
138
+ await middleware(req, res, next);
139
+ expect(next).not.toHaveBeenCalled();
140
+ expect(res.status).toHaveBeenCalledWith(401);
141
+ expect(res.json).toHaveBeenCalledWith({ message: 'Unauthorized' });
142
+ });
143
+ it('should reject request with invalid token', async () => {
144
+ const req = {
145
+ headers: { authorization: 'Bearer invalid-token' },
146
+ user: null
147
+ };
148
+ const res = {
149
+ status: jest.fn().mockReturnThis(),
150
+ json: jest.fn()
151
+ };
152
+ const next = jest.fn();
153
+ const middleware = auth.middleware();
154
+ await middleware(req, res, next);
155
+ expect(next).not.toHaveBeenCalled();
156
+ expect(res.status).toHaveBeenCalledWith(401);
157
+ expect(res.json).toHaveBeenCalledWith({ message: 'Unauthorized' });
158
+ });
159
+ it('should handle Dolphin style context (no res, no next)', async () => {
160
+ const req = {
161
+ headers: { authorization: `Bearer ${token}` },
162
+ user: null
163
+ };
164
+ // Dolphin style: no res, next is not a function
165
+ const res = undefined;
166
+ let nextCalled = false;
167
+ const next = () => { nextCalled = true; };
168
+ const middleware = auth.middleware();
169
+ await middleware(req, res, next);
170
+ expect(nextCalled).toBe(true);
171
+ expect(req.user).toBeDefined();
172
+ });
173
+ });
174
+ describe('2FA', () => {
175
+ let userId;
176
+ beforeEach(async () => {
177
+ const user = await auth.register(db, {
178
+ email: '2fa@example.com',
179
+ password: 'password123'
180
+ });
181
+ userId = user.id;
182
+ });
183
+ it('enables 2FA and returns QR code', async () => {
184
+ const { secret, uri } = await auth.enable2FA(db, userId);
185
+ expect(secret).toBeDefined();
186
+ expect(secret.length).toBeGreaterThan(10);
187
+ expect(uri).toMatch(/otpauth:\/\/totp\/TestApp:2fa(@|%40)example\.com/);
188
+ expect(uri).toContain(`secret=${secret}`);
189
+ });
190
+ it('allows enabling 2FA multiple times (returns existing secret)', async () => {
191
+ const first = await auth.enable2FA(db, userId);
192
+ const second = await auth.enable2FA(db, userId);
193
+ expect(second.secret).toBe(first.secret);
194
+ expect(second.uri).toBe(first.uri);
195
+ });
196
+ it('rejects invalid TOTP verification', async () => {
197
+ await auth.enable2FA(db, userId);
198
+ await expect(auth.verify2FA(db, userId, '000000'))
199
+ .rejects.toThrow('Invalid verification token');
200
+ });
201
+ });
202
+ describe('Refresh Token', () => {
203
+ let refreshToken;
204
+ beforeEach(async () => {
205
+ await auth.register(db, {
206
+ email: 'refresh@example.com',
207
+ password: 'password123'
208
+ });
209
+ await auth.login(db, {
210
+ email: 'refresh@example.com',
211
+ password: 'password123'
212
+ });
213
+ refreshToken = db.tokens[0].token;
214
+ });
215
+ it('refreshes token successfully', async () => {
216
+ const newSession = await auth.refresh(db, refreshToken);
217
+ expect(newSession.accessToken).toBeDefined();
218
+ expect(newSession.user.email).toBe('refresh@example.com');
219
+ });
220
+ it('detects token reuse', async () => {
221
+ await auth.refresh(db, refreshToken);
222
+ await expect(auth.refresh(db, refreshToken))
223
+ .rejects.toThrow('Token reuse detected');
224
+ });
225
+ it('rejects expired token', async () => {
226
+ const shortAuth = (0, auth_1.createAuth)({
227
+ secret: 'test-secret',
228
+ cookieMaxAge: 1
229
+ });
230
+ await shortAuth.register(db, {
231
+ email: 'expired@example.com',
232
+ password: 'password123'
233
+ });
234
+ await shortAuth.login(db, {
235
+ email: 'expired@example.com',
236
+ password: 'password123'
237
+ });
238
+ const user = db.users.find(u => u.email === 'expired@example.com');
239
+ const token = db.tokens.find(t => t.userId === user?.id)?.token;
240
+ await new Promise(resolve => setTimeout(resolve, 10));
241
+ await expect(shortAuth.refresh(db, token))
242
+ .rejects.toThrow('Invalid or expired refresh token');
243
+ });
244
+ });
245
+ describe('Logout', () => {
246
+ let refreshToken;
247
+ beforeEach(async () => {
248
+ await auth.register(db, {
249
+ email: 'logout@example.com',
250
+ password: 'password123'
251
+ });
252
+ await auth.login(db, {
253
+ email: 'logout@example.com',
254
+ password: 'password123'
255
+ });
256
+ refreshToken = db.tokens[0].token;
257
+ });
258
+ it('logs out successfully', async () => {
259
+ const result = await auth.logout(db, refreshToken);
260
+ expect(result.success).toBe(true);
261
+ const token = await db.findRefreshToken(refreshToken);
262
+ expect(token).toBeNull();
263
+ });
264
+ });
265
+ describe('Rate Limiting', () => {
266
+ it('limits login attempts', async () => {
267
+ await auth.register(db, {
268
+ email: 'ratelimit@example.com',
269
+ password: 'password123'
270
+ });
271
+ let rateLimited = false;
272
+ for (let i = 0; i < 7; i++) {
273
+ try {
274
+ await auth.login(db, {
275
+ email: 'ratelimit@example.com',
276
+ password: 'wrong'
277
+ });
278
+ }
279
+ catch (err) {
280
+ if (err.message === 'Rate limit exceeded') {
281
+ rateLimited = true;
282
+ expect(err.status).toBe(429);
283
+ break;
284
+ }
285
+ }
286
+ }
287
+ expect(rateLimited).toBe(true);
288
+ });
289
+ });
290
+ });
291
+ //# sourceMappingURL=auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../auth/auth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};