@eratu/common 1.0.21 → 1.0.22
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.
- package/package.json +1 -1
- package/build/__tests__/enum/roles.test.d.ts +0 -1
- package/build/__tests__/enum/roles.test.js +0 -31
- package/build/__tests__/errors/bad-request-error.test.d.ts +0 -1
- package/build/__tests__/errors/bad-request-error.test.js +0 -30
- package/build/__tests__/errors/database-connection-error.test.d.ts +0 -1
- package/build/__tests__/errors/database-connection-error.test.js +0 -28
- package/build/__tests__/errors/forbidden-error.test.d.ts +0 -1
- package/build/__tests__/errors/forbidden-error.test.js +0 -39
- package/build/__tests__/errors/not-authorized-error.test.d.ts +0 -1
- package/build/__tests__/errors/not-authorized-error.test.js +0 -39
- package/build/__tests__/errors/not-found-error.test.d.ts +0 -1
- package/build/__tests__/errors/not-found-error.test.js +0 -39
- package/build/__tests__/errors/request-validation-error.test.d.ts +0 -1
- package/build/__tests__/errors/request-validation-error.test.js +0 -99
- package/build/__tests__/events/base-listener.test.d.ts +0 -1
- package/build/__tests__/events/base-listener.test.js +0 -223
- package/build/__tests__/events/base-publisher.test.d.ts +0 -1
- package/build/__tests__/events/base-publisher.test.js +0 -85
- package/build/__tests__/events/streams.test.d.ts +0 -1
- package/build/__tests__/events/streams.test.js +0 -18
- package/build/__tests__/events/subjects.test.d.ts +0 -1
- package/build/__tests__/events/subjects.test.js +0 -79
- package/build/__tests__/middlewares/allow-roles.test.d.ts +0 -1
- package/build/__tests__/middlewares/allow-roles.test.js +0 -112
- package/build/__tests__/middlewares/current-user.test.d.ts +0 -1
- package/build/__tests__/middlewares/current-user.test.js +0 -261
- package/build/__tests__/middlewares/error-handler.test.d.ts +0 -1
- package/build/__tests__/middlewares/error-handler.test.js +0 -102
- package/build/__tests__/middlewares/require-auth.test.d.ts +0 -1
- package/build/__tests__/middlewares/require-auth.test.js +0 -57
- package/build/__tests__/middlewares/validation.test.d.ts +0 -1
- package/build/__tests__/middlewares/validation.test.js +0 -198
- package/build/__tests__/nats-wrapper.test.d.ts +0 -1
- package/build/__tests__/nats-wrapper.test.js +0 -159
- package/build/__tests__/redis-wrapper.test.d.ts +0 -1
- package/build/__tests__/redis-wrapper.test.js +0 -159
- package/build/enum/image.d.ts +0 -14
- package/build/enum/image.js +0 -18
- package/build/enum/roles.d.ts +0 -6
- package/build/enum/roles.js +0 -10
- package/build/errors/bad-request-error.d.ts +0 -9
- package/build/errors/bad-request-error.js +0 -16
- package/build/errors/conflict-error.d.ts +0 -9
- package/build/errors/conflict-error.js +0 -16
- package/build/errors/custom-error.d.ts +0 -8
- package/build/errors/custom-error.js +0 -10
- package/build/errors/database-connection-error.d.ts +0 -9
- package/build/errors/database-connection-error.js +0 -16
- package/build/errors/forbidden-error.d.ts +0 -9
- package/build/errors/forbidden-error.js +0 -16
- package/build/errors/internal-error.d.ts +0 -9
- package/build/errors/internal-error.js +0 -16
- package/build/errors/not-authorized-error.d.ts +0 -8
- package/build/errors/not-authorized-error.js +0 -15
- package/build/errors/not-found-error.d.ts +0 -9
- package/build/errors/not-found-error.js +0 -16
- package/build/errors/request-validation-error.d.ts +0 -14
- package/build/errors/request-validation-error.js +0 -22
- package/build/events/event-types/auth/admin-deleted-event.d.ts +0 -11
- package/build/events/event-types/auth/admin-deleted-event.js +0 -2
- package/build/events/event-types/auth/admin-signed-up-event.d.ts +0 -13
- package/build/events/event-types/auth/admin-signed-up-event.js +0 -2
- package/build/events/event-types/auth/admin-updated-event.d.ts +0 -14
- package/build/events/event-types/auth/admin-updated-event.js +0 -2
- package/build/events/event-types/auth/author-deleted-event.d.ts +0 -11
- package/build/events/event-types/auth/author-deleted-event.js +0 -2
- package/build/events/event-types/auth/author-signed-in-event.d.ts +0 -12
- package/build/events/event-types/auth/author-signed-in-event.js +0 -2
- package/build/events/event-types/auth/author-signed-out-event.d.ts +0 -11
- package/build/events/event-types/auth/author-signed-out-event.js +0 -2
- package/build/events/event-types/auth/author-signed-up-event.d.ts +0 -13
- package/build/events/event-types/auth/author-signed-up-event.js +0 -2
- package/build/events/event-types/auth/author-updated-event.d.ts +0 -14
- package/build/events/event-types/auth/author-updated-event.js +0 -2
- package/build/events/event-types/auth/author-verified-event.d.ts +0 -14
- package/build/events/event-types/auth/author-verified-event.js +0 -2
- package/build/events/event-types/auth/reader-deleted-event.d.ts +0 -11
- package/build/events/event-types/auth/reader-deleted-event.js +0 -2
- package/build/events/event-types/auth/reader-signed-in-event.d.ts +0 -13
- package/build/events/event-types/auth/reader-signed-in-event.js +0 -2
- package/build/events/event-types/auth/reader-signed-out-event.d.ts +0 -11
- package/build/events/event-types/auth/reader-signed-out-event.js +0 -2
- package/build/events/event-types/auth/reader-signed-up-event.d.ts +0 -13
- package/build/events/event-types/auth/reader-signed-up-event.js +0 -2
- package/build/events/event-types/auth/reader-updated-event.d.ts +0 -14
- package/build/events/event-types/auth/reader-updated-event.js +0 -2
- package/build/events/event-types/auth/reader-verified-event.d.ts +0 -14
- package/build/events/event-types/auth/reader-verified-event.js +0 -2
- package/build/events/event-types/books/book-created-event.d.ts +0 -34
- package/build/events/event-types/books/book-created-event.js +0 -2
- package/build/events/event-types/books/book-deleted-event.d.ts +0 -10
- package/build/events/event-types/books/book-deleted-event.js +0 -2
- package/build/events/event-types/books/book-updated-event.d.ts +0 -35
- package/build/events/event-types/books/book-updated-event.js +0 -2
- package/build/events/event-types/books/chapter-created-event.d.ts +0 -16
- package/build/events/event-types/books/chapter-created-event.js +0 -2
- package/build/events/event-types/books/chapter-deleted-event.d.ts +0 -10
- package/build/events/event-types/books/chapter-deleted-event.js +0 -2
- package/build/events/event-types/books/chapter-updated-event.d.ts +0 -17
- package/build/events/event-types/books/chapter-updated-event.js +0 -2
- package/build/events/event-types/books/genre-created-event.d.ts +0 -13
- package/build/events/event-types/books/genre-created-event.js +0 -2
- package/build/events/event-types/books/genre-deleted-event.d.ts +0 -9
- package/build/events/event-types/books/genre-deleted-event.js +0 -2
- package/build/events/event-types/books/genre-updated-event.d.ts +0 -13
- package/build/events/event-types/books/genre-updated-event.js +0 -2
- package/build/events/event-types/books/subgenre-created-event.d.ts +0 -14
- package/build/events/event-types/books/subgenre-created-event.js +0 -2
- package/build/events/event-types/books/subgenre-deleted-event.d.ts +0 -9
- package/build/events/event-types/books/subgenre-deleted-event.js +0 -2
- package/build/events/event-types/books/subgenre-updated-event.d.ts +0 -14
- package/build/events/event-types/books/subgenre-updated-event.js +0 -2
- package/build/events/event-types/books/tag-created-event.d.ts +0 -12
- package/build/events/event-types/books/tag-created-event.js +0 -2
- package/build/events/event-types/books/tag-deleted-event.d.ts +0 -9
- package/build/events/event-types/books/tag-deleted-event.js +0 -2
- package/build/events/event-types/books/tag-updated-event.d.ts +0 -12
- package/build/events/event-types/books/tag-updated-event.js +0 -2
- package/build/events/event-types/books/trigger-created-event.d.ts +0 -12
- package/build/events/event-types/books/trigger-created-event.js +0 -2
- package/build/events/event-types/books/trigger-deleted-event.d.ts +0 -9
- package/build/events/event-types/books/trigger-deleted-event.js +0 -2
- package/build/events/event-types/books/trigger-updated-event.d.ts +0 -12
- package/build/events/event-types/books/trigger-updated-event.js +0 -2
- package/build/events/event-types/books/trope-created-event.d.ts +0 -12
- package/build/events/event-types/books/trope-created-event.js +0 -2
- package/build/events/event-types/books/trope-deleted-event.d.ts +0 -9
- package/build/events/event-types/books/trope-deleted-event.js +0 -2
- package/build/events/event-types/books/trope-updated-event.d.ts +0 -12
- package/build/events/event-types/books/trope-updated-event.js +0 -2
- package/build/events/event-types/media/avatar-uploaded-event.d.ts +0 -14
- package/build/events/event-types/media/avatar-uploaded-event.js +0 -2
- package/build/events/event-types/orders/order-created-event.d.ts +0 -12
- package/build/events/event-types/orders/order-created-event.js +0 -2
- package/build/events/listeners/base-listener.d.ts +0 -23
- package/build/events/listeners/base-listener.js +0 -97
- package/build/events/publishers/base-publisher.d.ts +0 -14
- package/build/events/publishers/base-publisher.js +0 -27
- package/build/events/streams.d.ts +0 -6
- package/build/events/streams.js +0 -10
- package/build/events/subjects.d.ts +0 -41
- package/build/events/subjects.js +0 -52
- package/build/index.d.ts +0 -60
- package/build/index.js +0 -89
- package/build/middlewares/allow-roles.d.ts +0 -3
- package/build/middlewares/allow-roles.js +0 -18
- package/build/middlewares/current-user.d.ts +0 -40
- package/build/middlewares/current-user.js +0 -88
- package/build/middlewares/error-handler.d.ts +0 -2
- package/build/middlewares/error-handler.js +0 -14
- package/build/middlewares/require-auth.d.ts +0 -2
- package/build/middlewares/require-auth.js +0 -11
- package/build/middlewares/validation.d.ts +0 -3
- package/build/middlewares/validation.js +0 -57
- package/build/nats-wrapper.d.ts +0 -17
- package/build/nats-wrapper.js +0 -92
- package/build/redis-wrapper.d.ts +0 -20
- package/build/redis-wrapper.js +0 -77
- package/build/test/setup.d.ts +0 -8
- package/build/test/setup.js +0 -45
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const streams_1 = require("../../events/streams");
|
|
4
|
-
describe('Streams Enum', () => {
|
|
5
|
-
it('should have OrderServiceStream with value "orders"', () => {
|
|
6
|
-
expect(streams_1.Streams.OrderServiceStream).toBe('orders');
|
|
7
|
-
});
|
|
8
|
-
it('should have BookServiceStream with value "books"', () => {
|
|
9
|
-
expect(streams_1.Streams.BookServiceStream).toBe('books');
|
|
10
|
-
});
|
|
11
|
-
it('should have AuthServiceStream with value "auth"', () => {
|
|
12
|
-
expect(streams_1.Streams.AuthServiceStream).toBe('auth');
|
|
13
|
-
});
|
|
14
|
-
it('should have exactly 5 streams', () => {
|
|
15
|
-
const streams = Object.values(streams_1.Streams);
|
|
16
|
-
expect(streams.length).toBe(4);
|
|
17
|
-
});
|
|
18
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const subjects_1 = require("../../events/subjects");
|
|
4
|
-
describe('Subjects Enum', () => {
|
|
5
|
-
describe('Author subjects', () => {
|
|
6
|
-
it('should have AuthorUpdated with value "author:updated"', () => {
|
|
7
|
-
expect(subjects_1.Subjects.AuthorUpdated).toBe('author:updated');
|
|
8
|
-
});
|
|
9
|
-
it('should have AuthorDeleted with value "author:deleted"', () => {
|
|
10
|
-
expect(subjects_1.Subjects.AuthorDeleted).toBe('author:deleted');
|
|
11
|
-
});
|
|
12
|
-
it('should have AuthorSignedUp with value "author:signed-up"', () => {
|
|
13
|
-
expect(subjects_1.Subjects.AuthorSignedUp).toBe('author:signed-up');
|
|
14
|
-
});
|
|
15
|
-
it('should have AuthorSignedIn with value "author:signed-in"', () => {
|
|
16
|
-
expect(subjects_1.Subjects.AuthorSignedIn).toBe('author:signed-in');
|
|
17
|
-
});
|
|
18
|
-
it('should have AuthorSignedOut with value "author:signed-out"', () => {
|
|
19
|
-
expect(subjects_1.Subjects.AuthorSignedOut).toBe('author:signed-out');
|
|
20
|
-
});
|
|
21
|
-
it('should have AuthorVerified with value "author:verified"', () => {
|
|
22
|
-
expect(subjects_1.Subjects.AuthorVerified).toBe('author:verified');
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
describe('Reader subjects', () => {
|
|
26
|
-
it('should have ReaderSignedUp with value "reader:signed-up"', () => {
|
|
27
|
-
expect(subjects_1.Subjects.ReaderSignedUp).toBe('reader:signed-up');
|
|
28
|
-
});
|
|
29
|
-
it('should have ReaderSignedIn with value "reader:signed-in"', () => {
|
|
30
|
-
expect(subjects_1.Subjects.ReaderSignedIn).toBe('reader:signed-in');
|
|
31
|
-
});
|
|
32
|
-
it('should have ReaderSignedOut with value "reader:signed-out"', () => {
|
|
33
|
-
expect(subjects_1.Subjects.ReaderSignedOut).toBe('reader:signed-out');
|
|
34
|
-
});
|
|
35
|
-
it('should have ReaderUpdated with value "reader:updated"', () => {
|
|
36
|
-
expect(subjects_1.Subjects.ReaderUpdated).toBe('reader:updated');
|
|
37
|
-
});
|
|
38
|
-
it('should have ReaderDeleted with value "reader:deleted"', () => {
|
|
39
|
-
expect(subjects_1.Subjects.ReaderDeleted).toBe('reader:deleted');
|
|
40
|
-
});
|
|
41
|
-
it('should have ReaderVerified with value "reader:verified"', () => {
|
|
42
|
-
expect(subjects_1.Subjects.ReaderVerified).toBe('reader:verified');
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
describe('Book subjects', () => {
|
|
46
|
-
it('should have BookCreated with value "book:created"', () => {
|
|
47
|
-
expect(subjects_1.Subjects.BookCreated).toBe('book:created');
|
|
48
|
-
});
|
|
49
|
-
it('should have BookUpdated with value "book:updated"', () => {
|
|
50
|
-
expect(subjects_1.Subjects.BookUpdated).toBe('book:updated');
|
|
51
|
-
});
|
|
52
|
-
it('should have BookDeleted with value "book:deleted"', () => {
|
|
53
|
-
expect(subjects_1.Subjects.BookDeleted).toBe('book:deleted');
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
describe('Chapter subjects', () => {
|
|
57
|
-
it('should have ChapterCreated with value "chapter:created"', () => {
|
|
58
|
-
expect(subjects_1.Subjects.ChapterCreated).toBe('chapter:created');
|
|
59
|
-
});
|
|
60
|
-
it('should have ChapterUpdated with value "chapter:updated"', () => {
|
|
61
|
-
expect(subjects_1.Subjects.ChapterUpdated).toBe('chapter:updated');
|
|
62
|
-
});
|
|
63
|
-
it('should have ChapterDeleted with value "chapter:deleted"', () => {
|
|
64
|
-
expect(subjects_1.Subjects.ChapterDeleted).toBe('chapter:deleted');
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
describe('Order subjects', () => {
|
|
68
|
-
it('should have OrderCreated with value "order:created"', () => {
|
|
69
|
-
expect(subjects_1.Subjects.OrderCreated).toBe('order:created');
|
|
70
|
-
});
|
|
71
|
-
it('should have OrderCancelled with value "order:cancelled"', () => {
|
|
72
|
-
expect(subjects_1.Subjects.OrderCancelled).toBe('order:cancelled');
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
it('should have exactly 23 subjects', () => {
|
|
76
|
-
const subjects = Object.values(subjects_1.Subjects);
|
|
77
|
-
expect(subjects.length).toBe(24);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const allow_roles_1 = require("../../middlewares/allow-roles");
|
|
4
|
-
const not_authorized_error_1 = require("../../errors/not-authorized-error");
|
|
5
|
-
const forbidden_error_1 = require("../../errors/forbidden-error");
|
|
6
|
-
const roles_1 = require("../../enum/roles");
|
|
7
|
-
describe('allowRoles Middleware', () => {
|
|
8
|
-
let mockReq;
|
|
9
|
-
let mockRes;
|
|
10
|
-
let mockNext;
|
|
11
|
-
beforeEach(() => {
|
|
12
|
-
mockReq = {};
|
|
13
|
-
mockRes = {};
|
|
14
|
-
mockNext = jest.fn();
|
|
15
|
-
});
|
|
16
|
-
it('should throw NotAuthorizedError when currentUser is undefined', () => {
|
|
17
|
-
mockReq.currentUser = undefined;
|
|
18
|
-
const middleware = (0, allow_roles_1.allowRoles)([roles_1.UserRoles.admin]);
|
|
19
|
-
expect(() => {
|
|
20
|
-
middleware(mockReq, mockRes, mockNext);
|
|
21
|
-
}).toThrow(not_authorized_error_1.NotAuthorizedError);
|
|
22
|
-
expect(mockNext).not.toHaveBeenCalled();
|
|
23
|
-
});
|
|
24
|
-
it('should throw ForbiddenError when user role is not in allowed roles', () => {
|
|
25
|
-
mockReq.currentUser = {
|
|
26
|
-
id: '507f1f77bcf86cd799439011',
|
|
27
|
-
email: 'test@test.com',
|
|
28
|
-
firstName: 'Test',
|
|
29
|
-
lastName: 'User',
|
|
30
|
-
role: roles_1.UserRoles.reader,
|
|
31
|
-
};
|
|
32
|
-
const middleware = (0, allow_roles_1.allowRoles)([roles_1.UserRoles.admin, roles_1.UserRoles.superAdmin]);
|
|
33
|
-
expect(() => {
|
|
34
|
-
middleware(mockReq, mockRes, mockNext);
|
|
35
|
-
}).toThrow(forbidden_error_1.ForbiddenError);
|
|
36
|
-
expect(mockNext).not.toHaveBeenCalled();
|
|
37
|
-
});
|
|
38
|
-
it('should call next() when user role is in allowed roles', () => {
|
|
39
|
-
mockReq.currentUser = {
|
|
40
|
-
id: '507f1f77bcf86cd799439011',
|
|
41
|
-
email: 'test@test.com',
|
|
42
|
-
firstName: 'Test',
|
|
43
|
-
lastName: 'User',
|
|
44
|
-
role: roles_1.UserRoles.admin,
|
|
45
|
-
};
|
|
46
|
-
const middleware = (0, allow_roles_1.allowRoles)([roles_1.UserRoles.admin, roles_1.UserRoles.superAdmin]);
|
|
47
|
-
middleware(mockReq, mockRes, mockNext);
|
|
48
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
49
|
-
});
|
|
50
|
-
it('should allow admin when only admin is in roles', () => {
|
|
51
|
-
mockReq.currentUser = {
|
|
52
|
-
id: '507f1f77bcf86cd799439011',
|
|
53
|
-
email: 'admin@test.com',
|
|
54
|
-
firstName: 'Admin',
|
|
55
|
-
lastName: 'User',
|
|
56
|
-
role: roles_1.UserRoles.admin,
|
|
57
|
-
};
|
|
58
|
-
const middleware = (0, allow_roles_1.allowRoles)([roles_1.UserRoles.admin]);
|
|
59
|
-
middleware(mockReq, mockRes, mockNext);
|
|
60
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
61
|
-
});
|
|
62
|
-
it('should allow superAdmin when superAdmin is in roles', () => {
|
|
63
|
-
mockReq.currentUser = {
|
|
64
|
-
id: '507f1f77bcf86cd799439011',
|
|
65
|
-
email: 'superadmin@test.com',
|
|
66
|
-
firstName: 'Super',
|
|
67
|
-
lastName: 'Admin',
|
|
68
|
-
role: roles_1.UserRoles.superAdmin,
|
|
69
|
-
};
|
|
70
|
-
const middleware = (0, allow_roles_1.allowRoles)([roles_1.UserRoles.superAdmin, roles_1.UserRoles.admin]);
|
|
71
|
-
middleware(mockReq, mockRes, mockNext);
|
|
72
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
73
|
-
});
|
|
74
|
-
it('should deny author when only admin roles allowed', () => {
|
|
75
|
-
mockReq.currentUser = {
|
|
76
|
-
id: '507f1f77bcf86cd799439011',
|
|
77
|
-
email: 'author@test.com',
|
|
78
|
-
firstName: 'Author',
|
|
79
|
-
lastName: 'User',
|
|
80
|
-
role: roles_1.UserRoles.author,
|
|
81
|
-
};
|
|
82
|
-
const middleware = (0, allow_roles_1.allowRoles)([roles_1.UserRoles.admin, roles_1.UserRoles.superAdmin]);
|
|
83
|
-
expect(() => {
|
|
84
|
-
middleware(mockReq, mockRes, mockNext);
|
|
85
|
-
}).toThrow(forbidden_error_1.ForbiddenError);
|
|
86
|
-
});
|
|
87
|
-
it('should work with single role in array', () => {
|
|
88
|
-
mockReq.currentUser = {
|
|
89
|
-
id: '507f1f77bcf86cd799439011',
|
|
90
|
-
email: 'reader@test.com',
|
|
91
|
-
firstName: 'Reader',
|
|
92
|
-
lastName: 'User',
|
|
93
|
-
role: roles_1.UserRoles.reader,
|
|
94
|
-
};
|
|
95
|
-
const middleware = (0, allow_roles_1.allowRoles)([roles_1.UserRoles.reader]);
|
|
96
|
-
middleware(mockReq, mockRes, mockNext);
|
|
97
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
98
|
-
});
|
|
99
|
-
it('should deny when empty roles array is provided', () => {
|
|
100
|
-
mockReq.currentUser = {
|
|
101
|
-
id: '507f1f77bcf86cd799439011',
|
|
102
|
-
email: 'test@test.com',
|
|
103
|
-
firstName: 'Test',
|
|
104
|
-
lastName: 'User',
|
|
105
|
-
role: roles_1.UserRoles.admin,
|
|
106
|
-
};
|
|
107
|
-
const middleware = (0, allow_roles_1.allowRoles)([]);
|
|
108
|
-
expect(() => {
|
|
109
|
-
middleware(mockReq, mockRes, mockNext);
|
|
110
|
-
}).toThrow(forbidden_error_1.ForbiddenError);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
16
|
-
const current_user_1 = require("../../middlewares/current-user");
|
|
17
|
-
const roles_1 = require("../../enum/roles");
|
|
18
|
-
const setup_1 = require("../../test/setup");
|
|
19
|
-
const node_cache_1 = __importDefault(require("node-cache"));
|
|
20
|
-
// Mock RedisWrapper
|
|
21
|
-
const mockRedisGet = jest.fn();
|
|
22
|
-
const mockRedisWrapper = {
|
|
23
|
-
get: mockRedisGet,
|
|
24
|
-
};
|
|
25
|
-
describe('currentUser function', () => {
|
|
26
|
-
let mockReq;
|
|
27
|
-
let mockRes;
|
|
28
|
-
let mockNext;
|
|
29
|
-
beforeEach(() => {
|
|
30
|
-
mockReq = {
|
|
31
|
-
headers: {},
|
|
32
|
-
};
|
|
33
|
-
mockRes = {};
|
|
34
|
-
mockNext = jest.fn();
|
|
35
|
-
jest.clearAllMocks();
|
|
36
|
-
});
|
|
37
|
-
it('should call next() when no authorization header is present', () => {
|
|
38
|
-
(0, current_user_1.currentUser)(mockReq, mockRes, mockNext);
|
|
39
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
40
|
-
expect(mockReq.currentUser).toBeUndefined();
|
|
41
|
-
});
|
|
42
|
-
it('should call next() when authorization header is empty', () => {
|
|
43
|
-
mockReq.headers = { authorization: '' };
|
|
44
|
-
(0, current_user_1.currentUser)(mockReq, mockRes, mockNext);
|
|
45
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
46
|
-
expect(mockReq.currentUser).toBeUndefined();
|
|
47
|
-
});
|
|
48
|
-
it('should call next() when Bearer token is missing', () => {
|
|
49
|
-
mockReq.headers = { authorization: 'Bearer ' };
|
|
50
|
-
(0, current_user_1.currentUser)(mockReq, mockRes, mockNext);
|
|
51
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
52
|
-
expect(mockReq.currentUser).toBeUndefined();
|
|
53
|
-
});
|
|
54
|
-
it('should set currentUser when valid token is provided', () => {
|
|
55
|
-
var _a, _b, _c, _d, _e;
|
|
56
|
-
const token = (0, setup_1.createTestToken)('user123', roles_1.UserRoles.reader, {
|
|
57
|
-
email: 'test@example.com',
|
|
58
|
-
firstName: 'John',
|
|
59
|
-
lastName: 'Doe',
|
|
60
|
-
});
|
|
61
|
-
mockReq.headers = { authorization: `Bearer ${token}` };
|
|
62
|
-
(0, current_user_1.currentUser)(mockReq, mockRes, mockNext);
|
|
63
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
64
|
-
expect(mockReq.currentUser).toBeDefined();
|
|
65
|
-
expect((_a = mockReq.currentUser) === null || _a === void 0 ? void 0 : _a.id).toBe('user123');
|
|
66
|
-
expect((_b = mockReq.currentUser) === null || _b === void 0 ? void 0 : _b.email).toBe('test@example.com');
|
|
67
|
-
expect((_c = mockReq.currentUser) === null || _c === void 0 ? void 0 : _c.firstName).toBe('John');
|
|
68
|
-
expect((_d = mockReq.currentUser) === null || _d === void 0 ? void 0 : _d.lastName).toBe('Doe');
|
|
69
|
-
expect((_e = mockReq.currentUser) === null || _e === void 0 ? void 0 : _e.role).toBe(roles_1.UserRoles.reader);
|
|
70
|
-
});
|
|
71
|
-
it('should call next() when token is invalid', () => {
|
|
72
|
-
mockReq.headers = { authorization: 'Bearer invalid-token' };
|
|
73
|
-
(0, current_user_1.currentUser)(mockReq, mockRes, mockNext);
|
|
74
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
75
|
-
expect(mockReq.currentUser).toBeUndefined();
|
|
76
|
-
});
|
|
77
|
-
it('should call next() when token is expired', () => {
|
|
78
|
-
const expiredToken = jsonwebtoken_1.default.sign({ email: 'test@test.com', firstName: 'Test', lastName: 'User', role: roles_1.UserRoles.reader }, process.env.JWT_KEY, { subject: 'user123', expiresIn: '-1h' });
|
|
79
|
-
mockReq.headers = { authorization: `Bearer ${expiredToken}` };
|
|
80
|
-
(0, current_user_1.currentUser)(mockReq, mockRes, mockNext);
|
|
81
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
82
|
-
expect(mockReq.currentUser).toBeUndefined();
|
|
83
|
-
});
|
|
84
|
-
it('should handle different user roles correctly', () => {
|
|
85
|
-
const roles = [roles_1.UserRoles.admin, roles_1.UserRoles.author, roles_1.UserRoles.reader, roles_1.UserRoles.superAdmin];
|
|
86
|
-
roles.forEach(role => {
|
|
87
|
-
var _a;
|
|
88
|
-
const req = { headers: {} };
|
|
89
|
-
const token = (0, setup_1.createTestToken)('user123', role);
|
|
90
|
-
req.headers = { authorization: `Bearer ${token}` };
|
|
91
|
-
(0, current_user_1.currentUser)(req, mockRes, mockNext);
|
|
92
|
-
expect((_a = req.currentUser) === null || _a === void 0 ? void 0 : _a.role).toBe(role);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
describe('CurrentUserMiddleware class', () => {
|
|
97
|
-
let mockReq;
|
|
98
|
-
let mockRes;
|
|
99
|
-
let mockNext;
|
|
100
|
-
let localCache;
|
|
101
|
-
beforeEach(() => {
|
|
102
|
-
mockReq = {
|
|
103
|
-
headers: {},
|
|
104
|
-
};
|
|
105
|
-
mockRes = {};
|
|
106
|
-
mockNext = jest.fn();
|
|
107
|
-
localCache = new node_cache_1.default();
|
|
108
|
-
jest.clearAllMocks();
|
|
109
|
-
});
|
|
110
|
-
afterEach(() => {
|
|
111
|
-
localCache.close();
|
|
112
|
-
});
|
|
113
|
-
it('should call next() when no authorization header is present', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
114
|
-
const middleware = new current_user_1.CurrentUserMiddleware();
|
|
115
|
-
const handler = middleware.getMiddleware();
|
|
116
|
-
yield handler(mockReq, mockRes, mockNext);
|
|
117
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
118
|
-
expect(mockReq.currentUser).toBeUndefined();
|
|
119
|
-
}));
|
|
120
|
-
it('should call next() without setting currentUser when token has no jti', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
121
|
-
const middleware = new current_user_1.CurrentUserMiddleware();
|
|
122
|
-
const handler = middleware.getMiddleware();
|
|
123
|
-
// Create token without jti
|
|
124
|
-
const token = (0, setup_1.createTestToken)('user123', roles_1.UserRoles.reader);
|
|
125
|
-
mockReq.headers = { authorization: `Bearer ${token}` };
|
|
126
|
-
yield handler(mockReq, mockRes, mockNext);
|
|
127
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
128
|
-
expect(mockReq.currentUser).toBeUndefined();
|
|
129
|
-
}));
|
|
130
|
-
it('should set currentUser when valid token with jti is provided and not revoked', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
131
|
-
var _a;
|
|
132
|
-
mockRedisGet.mockResolvedValueOnce(null);
|
|
133
|
-
const middleware = new current_user_1.CurrentUserMiddleware({
|
|
134
|
-
redisClient: mockRedisWrapper,
|
|
135
|
-
localCache,
|
|
136
|
-
});
|
|
137
|
-
const handler = middleware.getMiddleware();
|
|
138
|
-
const token = (0, setup_1.createTestToken)('user123', roles_1.UserRoles.reader, {
|
|
139
|
-
email: 'test@example.com',
|
|
140
|
-
firstName: 'John',
|
|
141
|
-
lastName: 'Doe',
|
|
142
|
-
jti: 'test-jti-123',
|
|
143
|
-
});
|
|
144
|
-
mockReq.headers = { authorization: `Bearer ${token}` };
|
|
145
|
-
yield handler(mockReq, mockRes, mockNext);
|
|
146
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
147
|
-
expect(mockReq.currentUser).toBeDefined();
|
|
148
|
-
expect((_a = mockReq.currentUser) === null || _a === void 0 ? void 0 : _a.id).toBe('user123');
|
|
149
|
-
expect(mockRedisGet).toHaveBeenCalledWith('revoked:test-jti-123');
|
|
150
|
-
}));
|
|
151
|
-
it('should not set currentUser when token is revoked in Redis', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
152
|
-
mockRedisGet.mockResolvedValueOnce('revoked');
|
|
153
|
-
const middleware = new current_user_1.CurrentUserMiddleware({
|
|
154
|
-
redisClient: mockRedisWrapper,
|
|
155
|
-
localCache,
|
|
156
|
-
});
|
|
157
|
-
const handler = middleware.getMiddleware();
|
|
158
|
-
const token = (0, setup_1.createTestToken)('user123', roles_1.UserRoles.reader, {
|
|
159
|
-
jti: 'revoked-jti',
|
|
160
|
-
});
|
|
161
|
-
mockReq.headers = { authorization: `Bearer ${token}` };
|
|
162
|
-
yield handler(mockReq, mockRes, mockNext);
|
|
163
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
164
|
-
expect(mockReq.currentUser).toBeUndefined();
|
|
165
|
-
}));
|
|
166
|
-
it('should not set currentUser when jti is in local cache', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
167
|
-
localCache.set('cached-jti', true);
|
|
168
|
-
const middleware = new current_user_1.CurrentUserMiddleware({
|
|
169
|
-
redisClient: mockRedisWrapper,
|
|
170
|
-
localCache,
|
|
171
|
-
});
|
|
172
|
-
const handler = middleware.getMiddleware();
|
|
173
|
-
const token = (0, setup_1.createTestToken)('user123', roles_1.UserRoles.reader, {
|
|
174
|
-
jti: 'cached-jti',
|
|
175
|
-
});
|
|
176
|
-
mockReq.headers = { authorization: `Bearer ${token}` };
|
|
177
|
-
yield handler(mockReq, mockRes, mockNext);
|
|
178
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
179
|
-
expect(mockReq.currentUser).toBeUndefined();
|
|
180
|
-
expect(mockRedisGet).not.toHaveBeenCalled();
|
|
181
|
-
}));
|
|
182
|
-
it('should cache revoked tokens in local cache after Redis lookup', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
183
|
-
mockRedisGet.mockResolvedValueOnce('revoked');
|
|
184
|
-
const middleware = new current_user_1.CurrentUserMiddleware({
|
|
185
|
-
redisClient: mockRedisWrapper,
|
|
186
|
-
localCache,
|
|
187
|
-
});
|
|
188
|
-
const handler = middleware.getMiddleware();
|
|
189
|
-
const token = (0, setup_1.createTestToken)('user123', roles_1.UserRoles.reader, {
|
|
190
|
-
jti: 'cache-this-jti',
|
|
191
|
-
});
|
|
192
|
-
mockReq.headers = { authorization: `Bearer ${token}` };
|
|
193
|
-
yield handler(mockReq, mockRes, mockNext);
|
|
194
|
-
expect(localCache.get('cache-this-jti')).toBe(true);
|
|
195
|
-
}));
|
|
196
|
-
it('should call next() when JWT verification fails', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
197
|
-
const middleware = new current_user_1.CurrentUserMiddleware();
|
|
198
|
-
const handler = middleware.getMiddleware();
|
|
199
|
-
mockReq.headers = { authorization: 'Bearer invalid-token' };
|
|
200
|
-
// Spy on console.error to verify error logging
|
|
201
|
-
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
|
|
202
|
-
yield handler(mockReq, mockRes, mockNext);
|
|
203
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
204
|
-
expect(mockReq.currentUser).toBeUndefined();
|
|
205
|
-
expect(consoleErrorSpy).toHaveBeenCalled();
|
|
206
|
-
consoleErrorSpy.mockRestore();
|
|
207
|
-
}));
|
|
208
|
-
it('should work without redis client', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
209
|
-
const middleware = new current_user_1.CurrentUserMiddleware({ localCache });
|
|
210
|
-
const handler = middleware.getMiddleware();
|
|
211
|
-
const token = (0, setup_1.createTestToken)('user123', roles_1.UserRoles.reader, {
|
|
212
|
-
jti: 'test-jti',
|
|
213
|
-
});
|
|
214
|
-
mockReq.headers = { authorization: `Bearer ${token}` };
|
|
215
|
-
yield handler(mockReq, mockRes, mockNext);
|
|
216
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
217
|
-
expect(mockReq.currentUser).toBeDefined();
|
|
218
|
-
}));
|
|
219
|
-
it('should work without local cache', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
220
|
-
mockRedisGet.mockResolvedValueOnce(null);
|
|
221
|
-
const middleware = new current_user_1.CurrentUserMiddleware({
|
|
222
|
-
redisClient: mockRedisWrapper,
|
|
223
|
-
});
|
|
224
|
-
const handler = middleware.getMiddleware();
|
|
225
|
-
const token = (0, setup_1.createTestToken)('user123', roles_1.UserRoles.reader, {
|
|
226
|
-
jti: 'test-jti',
|
|
227
|
-
});
|
|
228
|
-
mockReq.headers = { authorization: `Bearer ${token}` };
|
|
229
|
-
yield handler(mockReq, mockRes, mockNext);
|
|
230
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
231
|
-
expect(mockReq.currentUser).toBeDefined();
|
|
232
|
-
}));
|
|
233
|
-
it('should work with no constructor params', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
234
|
-
const middleware = new current_user_1.CurrentUserMiddleware();
|
|
235
|
-
const handler = middleware.getMiddleware();
|
|
236
|
-
const token = (0, setup_1.createTestToken)('user123', roles_1.UserRoles.reader, {
|
|
237
|
-
jti: 'test-jti',
|
|
238
|
-
});
|
|
239
|
-
mockReq.headers = { authorization: `Bearer ${token}` };
|
|
240
|
-
yield handler(mockReq, mockRes, mockNext);
|
|
241
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
242
|
-
expect(mockReq.currentUser).toBeDefined();
|
|
243
|
-
}));
|
|
244
|
-
it('should handle revoked token without local cache (branch coverage for line 77)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
245
|
-
mockRedisGet.mockResolvedValueOnce('revoked');
|
|
246
|
-
// Create middleware with redis but WITHOUT local cache
|
|
247
|
-
const middleware = new current_user_1.CurrentUserMiddleware({
|
|
248
|
-
redisClient: mockRedisWrapper,
|
|
249
|
-
// localCache is intentionally omitted to test the null branch
|
|
250
|
-
});
|
|
251
|
-
const handler = middleware.getMiddleware();
|
|
252
|
-
const token = (0, setup_1.createTestToken)('user123', roles_1.UserRoles.reader, {
|
|
253
|
-
jti: 'revoked-no-cache-jti',
|
|
254
|
-
});
|
|
255
|
-
mockReq.headers = { authorization: `Bearer ${token}` };
|
|
256
|
-
yield handler(mockReq, mockRes, mockNext);
|
|
257
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
258
|
-
expect(mockReq.currentUser).toBeUndefined();
|
|
259
|
-
expect(mockRedisGet).toHaveBeenCalledWith('revoked:revoked-no-cache-jti');
|
|
260
|
-
}));
|
|
261
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const error_handler_1 = require("../../middlewares/error-handler");
|
|
4
|
-
const bad_request_error_1 = require("../../errors/bad-request-error");
|
|
5
|
-
const not_authorized_error_1 = require("../../errors/not-authorized-error");
|
|
6
|
-
const not_found_error_1 = require("../../errors/not-found-error");
|
|
7
|
-
const forbidden_error_1 = require("../../errors/forbidden-error");
|
|
8
|
-
const database_connection_error_1 = require("../../errors/database-connection-error");
|
|
9
|
-
const request_validation_error_1 = require("../../errors/request-validation-error");
|
|
10
|
-
describe('errorHandler Middleware', () => {
|
|
11
|
-
let mockReq;
|
|
12
|
-
let mockRes;
|
|
13
|
-
let mockNext;
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
mockReq = {};
|
|
16
|
-
mockRes = {
|
|
17
|
-
status: jest.fn().mockReturnThis(),
|
|
18
|
-
send: jest.fn(),
|
|
19
|
-
};
|
|
20
|
-
mockNext = jest.fn();
|
|
21
|
-
});
|
|
22
|
-
it('should handle BadRequestError correctly', () => {
|
|
23
|
-
const error = new bad_request_error_1.BadRequestError('Invalid email');
|
|
24
|
-
(0, error_handler_1.errorHandler)(error, mockReq, mockRes, mockNext);
|
|
25
|
-
expect(mockRes.status).toHaveBeenCalledWith(400);
|
|
26
|
-
expect(mockRes.send).toHaveBeenCalledWith({
|
|
27
|
-
errors: [{ message: 'Invalid email' }],
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
it('should handle NotAuthorizedError correctly', () => {
|
|
31
|
-
const error = new not_authorized_error_1.NotAuthorizedError();
|
|
32
|
-
(0, error_handler_1.errorHandler)(error, mockReq, mockRes, mockNext);
|
|
33
|
-
expect(mockRes.status).toHaveBeenCalledWith(401);
|
|
34
|
-
expect(mockRes.send).toHaveBeenCalledWith({
|
|
35
|
-
errors: [{ message: 'Not Authorized' }],
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
it('should handle NotFoundError correctly', () => {
|
|
39
|
-
const error = new not_found_error_1.NotFoundError('Resource not found');
|
|
40
|
-
(0, error_handler_1.errorHandler)(error, mockReq, mockRes, mockNext);
|
|
41
|
-
expect(mockRes.status).toHaveBeenCalledWith(404);
|
|
42
|
-
expect(mockRes.send).toHaveBeenCalledWith({
|
|
43
|
-
errors: [{ message: 'Resource not found' }],
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
it('should handle ForbiddenError correctly', () => {
|
|
47
|
-
const error = new forbidden_error_1.ForbiddenError();
|
|
48
|
-
(0, error_handler_1.errorHandler)(error, mockReq, mockRes, mockNext);
|
|
49
|
-
expect(mockRes.status).toHaveBeenCalledWith(403);
|
|
50
|
-
expect(mockRes.send).toHaveBeenCalledWith({
|
|
51
|
-
errors: [{ message: 'Forbidden' }],
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
it('should handle DatabaseConnectionError correctly', () => {
|
|
55
|
-
const error = new database_connection_error_1.DatabaseConnectionError();
|
|
56
|
-
(0, error_handler_1.errorHandler)(error, mockReq, mockRes, mockNext);
|
|
57
|
-
expect(mockRes.status).toHaveBeenCalledWith(500);
|
|
58
|
-
expect(mockRes.send).toHaveBeenCalledWith({
|
|
59
|
-
errors: [{ message: 'Error connecting to database' }],
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
it('should handle RequestValidationError correctly', () => {
|
|
63
|
-
const error = new request_validation_error_1.RequestValidationError([
|
|
64
|
-
{
|
|
65
|
-
type: 'field',
|
|
66
|
-
msg: 'Email is required',
|
|
67
|
-
path: 'email',
|
|
68
|
-
location: 'body',
|
|
69
|
-
value: '',
|
|
70
|
-
},
|
|
71
|
-
]);
|
|
72
|
-
(0, error_handler_1.errorHandler)(error, mockReq, mockRes, mockNext);
|
|
73
|
-
expect(mockRes.status).toHaveBeenCalledWith(400);
|
|
74
|
-
expect(mockRes.send).toHaveBeenCalledWith({
|
|
75
|
-
errors: [{ message: 'Email is required', field: 'email' }],
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
it('should handle generic Error with default message', () => {
|
|
79
|
-
const error = new Error('Some internal error');
|
|
80
|
-
(0, error_handler_1.errorHandler)(error, mockReq, mockRes, mockNext);
|
|
81
|
-
expect(mockRes.status).toHaveBeenCalledWith(400);
|
|
82
|
-
expect(mockRes.send).toHaveBeenCalledWith({
|
|
83
|
-
errors: [{ message: 'Something went wrong' }],
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
it('should handle TypeError with default message', () => {
|
|
87
|
-
const error = new TypeError('Cannot read property');
|
|
88
|
-
(0, error_handler_1.errorHandler)(error, mockReq, mockRes, mockNext);
|
|
89
|
-
expect(mockRes.status).toHaveBeenCalledWith(400);
|
|
90
|
-
expect(mockRes.send).toHaveBeenCalledWith({
|
|
91
|
-
errors: [{ message: 'Something went wrong' }],
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
it('should handle undefined error object', () => {
|
|
95
|
-
const error = undefined;
|
|
96
|
-
(0, error_handler_1.errorHandler)(error, mockReq, mockRes, mockNext);
|
|
97
|
-
expect(mockRes.status).toHaveBeenCalledWith(400);
|
|
98
|
-
expect(mockRes.send).toHaveBeenCalledWith({
|
|
99
|
-
errors: [{ message: 'Something went wrong' }],
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const require_auth_1 = require("../../middlewares/require-auth");
|
|
4
|
-
const not_authorized_error_1 = require("../../errors/not-authorized-error");
|
|
5
|
-
const roles_1 = require("../../enum/roles");
|
|
6
|
-
describe('requireAuth Middleware', () => {
|
|
7
|
-
let mockReq;
|
|
8
|
-
let mockRes;
|
|
9
|
-
let mockNext;
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
mockReq = {};
|
|
12
|
-
mockRes = {};
|
|
13
|
-
mockNext = jest.fn();
|
|
14
|
-
});
|
|
15
|
-
it('should throw NotAuthorizedError when currentUser is undefined', () => {
|
|
16
|
-
mockReq.currentUser = undefined;
|
|
17
|
-
expect(() => {
|
|
18
|
-
(0, require_auth_1.requireAuth)(mockReq, mockRes, mockNext);
|
|
19
|
-
}).toThrow(not_authorized_error_1.NotAuthorizedError);
|
|
20
|
-
expect(mockNext).not.toHaveBeenCalled();
|
|
21
|
-
});
|
|
22
|
-
it('should throw NotAuthorizedError when currentUser is null-ish', () => {
|
|
23
|
-
// @ts-expect-error - testing edge case
|
|
24
|
-
mockReq.currentUser = null;
|
|
25
|
-
expect(() => {
|
|
26
|
-
(0, require_auth_1.requireAuth)(mockReq, mockRes, mockNext);
|
|
27
|
-
}).toThrow(not_authorized_error_1.NotAuthorizedError);
|
|
28
|
-
expect(mockNext).not.toHaveBeenCalled();
|
|
29
|
-
});
|
|
30
|
-
it('should call next() when currentUser is present', () => {
|
|
31
|
-
mockReq.currentUser = {
|
|
32
|
-
id: '507f1f77bcf86cd799439011',
|
|
33
|
-
email: 'test@test.com',
|
|
34
|
-
firstName: 'Test',
|
|
35
|
-
lastName: 'User',
|
|
36
|
-
role: roles_1.UserRoles.reader,
|
|
37
|
-
};
|
|
38
|
-
(0, require_auth_1.requireAuth)(mockReq, mockRes, mockNext);
|
|
39
|
-
expect(mockNext).toHaveBeenCalledTimes(1);
|
|
40
|
-
expect(mockNext).toHaveBeenCalledWith();
|
|
41
|
-
});
|
|
42
|
-
it('should work with different user roles', () => {
|
|
43
|
-
const roles = [roles_1.UserRoles.admin, roles_1.UserRoles.author, roles_1.UserRoles.reader, roles_1.UserRoles.superAdmin];
|
|
44
|
-
roles.forEach(role => {
|
|
45
|
-
const next = jest.fn();
|
|
46
|
-
mockReq.currentUser = {
|
|
47
|
-
id: '507f1f77bcf86cd799439011',
|
|
48
|
-
email: 'test@test.com',
|
|
49
|
-
firstName: 'Test',
|
|
50
|
-
lastName: 'User',
|
|
51
|
-
role,
|
|
52
|
-
};
|
|
53
|
-
(0, require_auth_1.requireAuth)(mockReq, mockRes, next);
|
|
54
|
-
expect(next).toHaveBeenCalledTimes(1);
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|