mongodb-dynamic-api 3.2.1 → 4.0.0

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 (195) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +34 -3
  3. package/package.json +5 -2
  4. package/src/adapters/socket-adapter.d.ts +3 -3
  5. package/src/adapters/socket-adapter.js.map +1 -1
  6. package/src/builders/route-decorators/auth-decorators.builder.d.ts +1 -1
  7. package/src/builders/route-decorators/route-decorators.builder.d.ts +1 -1
  8. package/src/builders/route-decorators/route-decorators.builder.js.map +1 -1
  9. package/src/decorators/validator-pipe.decorator.js.map +1 -1
  10. package/src/dynamic-api.module.js +4 -1
  11. package/src/dynamic-api.module.js.map +1 -1
  12. package/src/guards/jwt-socket.guard.js +1 -1
  13. package/src/guards/jwt-socket.guard.js.map +1 -1
  14. package/src/helpers/swagger-config.helper.js.map +1 -1
  15. package/src/interceptors/dynamic-api-cache.interceptor.d.ts +3 -2
  16. package/src/interceptors/dynamic-api-cache.interceptor.js +4 -0
  17. package/src/interceptors/dynamic-api-cache.interceptor.js.map +1 -1
  18. package/src/interfaces/dynamic-api-decorator-builder.interface.d.ts +1 -1
  19. package/src/interfaces/dynamic-api-global-state.interface.d.ts +3 -0
  20. package/src/interfaces/dynamic-api-swagger-options.type.d.ts +1 -1
  21. package/src/modules/auth/auth-broadcast.helper.d.ts +3 -0
  22. package/src/modules/auth/auth-broadcast.helper.js +11 -0
  23. package/src/modules/auth/auth-broadcast.helper.js.map +1 -0
  24. package/src/modules/auth/auth-events.constants.d.ts +13 -0
  25. package/src/modules/auth/auth-events.constants.js +28 -0
  26. package/src/modules/auth/auth-events.constants.js.map +1 -0
  27. package/src/modules/auth/auth.helper.d.ts +19 -5
  28. package/src/modules/auth/auth.helper.js +15 -8
  29. package/src/modules/auth/auth.helper.js.map +1 -1
  30. package/src/modules/auth/auth.module.d.ts +5 -2
  31. package/src/modules/auth/auth.module.js +45 -6
  32. package/src/modules/auth/auth.module.js.map +1 -1
  33. package/src/modules/auth/guards/index.d.ts +2 -0
  34. package/src/modules/auth/guards/index.js +2 -0
  35. package/src/modules/auth/guards/index.js.map +1 -1
  36. package/src/modules/auth/guards/jwt-refresh/jwt-refresh.guard.d.ts +4 -0
  37. package/src/modules/auth/guards/jwt-refresh/jwt-refresh.guard.js +18 -0
  38. package/src/modules/auth/guards/jwt-refresh/jwt-refresh.guard.js.map +1 -0
  39. package/src/modules/auth/guards/jwt-socket-auth/jwt-socket-auth.guard.js +1 -1
  40. package/src/modules/auth/guards/jwt-socket-auth/jwt-socket-auth.guard.js.map +1 -1
  41. package/src/modules/auth/guards/jwt-socket-refresh/jwt-socket-refresh.guard.d.ts +8 -0
  42. package/src/modules/auth/guards/jwt-socket-refresh/jwt-socket-refresh.guard.js +62 -0
  43. package/src/modules/auth/guards/jwt-socket-refresh/jwt-socket-refresh.guard.js.map +1 -0
  44. package/src/modules/auth/index.d.ts +2 -0
  45. package/src/modules/auth/index.js +2 -0
  46. package/src/modules/auth/index.js.map +1 -1
  47. package/src/modules/auth/interfaces/auth-controller.interface.d.ts +19 -4
  48. package/src/modules/auth/interfaces/auth-gateway.interface.d.ts +2 -0
  49. package/src/modules/auth/interfaces/auth-options.interface.d.ts +19 -2
  50. package/src/modules/auth/interfaces/auth-service.interface.d.ts +3 -0
  51. package/src/modules/auth/mixins/auth-controller.mixin.d.ts +2 -2
  52. package/src/modules/auth/mixins/auth-controller.mixin.js +112 -18
  53. package/src/modules/auth/mixins/auth-controller.mixin.js.map +1 -1
  54. package/src/modules/auth/mixins/auth-gateway.mixin.d.ts +2 -2
  55. package/src/modules/auth/mixins/auth-gateway.mixin.js +65 -31
  56. package/src/modules/auth/mixins/auth-gateway.mixin.js.map +1 -1
  57. package/src/modules/auth/services/base-auth.service.d.ts +9 -0
  58. package/src/modules/auth/services/base-auth.service.js +74 -15
  59. package/src/modules/auth/services/base-auth.service.js.map +1 -1
  60. package/src/modules/auth/strategies/index.d.ts +1 -0
  61. package/src/modules/auth/strategies/index.js +1 -0
  62. package/src/modules/auth/strategies/index.js.map +1 -1
  63. package/src/modules/auth/strategies/jwt-refresh.strategy.d.ts +14 -0
  64. package/src/modules/auth/strategies/jwt-refresh.strategy.js +45 -0
  65. package/src/modules/auth/strategies/jwt-refresh.strategy.js.map +1 -0
  66. package/src/modules/auth/strategies/jwt.strategy.d.ts +3 -1
  67. package/src/modules/auth/strategies/jwt.strategy.js.map +1 -1
  68. package/src/routes/aggregate/base-aggregate.service.js.map +1 -1
  69. package/src/routes/create-many/base-create-many.service.js.map +1 -1
  70. package/src/routes/create-one/base-create-one.service.js.map +1 -1
  71. package/src/routes/delete-many/base-delete-many.service.js.map +1 -1
  72. package/src/routes/delete-one/base-delete-one.service.js.map +1 -1
  73. package/src/routes/duplicate-many/base-duplicate-many.service.js +4 -3
  74. package/src/routes/duplicate-many/base-duplicate-many.service.js.map +1 -1
  75. package/src/routes/duplicate-one/base-duplicate-one.service.js +3 -2
  76. package/src/routes/duplicate-one/base-duplicate-one.service.js.map +1 -1
  77. package/src/routes/get-many/base-get-many.service.js.map +1 -1
  78. package/src/routes/get-one/base-get-one.service.js.map +1 -1
  79. package/src/routes/replace-one/base-replace-one.service.js +3 -2
  80. package/src/routes/replace-one/base-replace-one.service.js.map +1 -1
  81. package/src/routes/update-many/base-update-many.service.js.map +1 -1
  82. package/src/routes/update-one/base-update-one.service.js.map +1 -1
  83. package/src/services/base/base.service.d.ts +3 -3
  84. package/src/services/base/base.service.js +26 -8
  85. package/src/services/base/base.service.js.map +1 -1
  86. package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js +3 -0
  87. package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js.map +1 -1
  88. package/src/version.json +1 -1
  89. package/test/e2e.setup.d.ts +3 -2
  90. package/test/e2e.setup.js +5 -4
  91. package/test/e2e.setup.js.map +1 -1
  92. package/test/for-feature/base-entity.e2e-spec.js +316 -0
  93. package/test/for-feature/base-entity.e2e-spec.js.map +1 -0
  94. package/test/for-feature/http-broadcast.e2e-spec.js +187 -0
  95. package/test/for-feature/http-broadcast.e2e-spec.js.map +1 -0
  96. package/test/for-feature/soft-deletable-entity.e2e-spec.d.ts +1 -0
  97. package/test/for-feature/soft-deletable-entity.e2e-spec.js +335 -0
  98. package/test/for-feature/soft-deletable-entity.e2e-spec.js.map +1 -0
  99. package/test/for-feature/websockets.e2e-spec.d.ts +1 -0
  100. package/test/for-feature/websockets.e2e-spec.js +324 -0
  101. package/test/for-feature/websockets.e2e-spec.js.map +1 -0
  102. package/test/for-root/auth-api-basic.e2e-spec.d.ts +1 -0
  103. package/test/for-root/auth-api-basic.e2e-spec.js +338 -0
  104. package/test/for-root/auth-api-basic.e2e-spec.js.map +1 -0
  105. package/test/for-root/auth-api-broadcast.e2e-spec.d.ts +1 -0
  106. package/test/for-root/auth-api-broadcast.e2e-spec.js +82 -0
  107. package/test/for-root/auth-api-broadcast.e2e-spec.js.map +1 -0
  108. package/test/for-root/auth-api-login.e2e-spec.d.ts +1 -0
  109. package/test/for-root/auth-api-login.e2e-spec.js +103 -0
  110. package/test/for-root/auth-api-login.e2e-spec.js.map +1 -0
  111. package/test/for-root/auth-api-logout.e2e-spec.d.ts +1 -0
  112. package/test/for-root/auth-api-logout.e2e-spec.js +74 -0
  113. package/test/for-root/auth-api-logout.e2e-spec.js.map +1 -0
  114. package/test/for-root/auth-api-refresh-token-cookie.e2e-spec.d.ts +1 -0
  115. package/test/for-root/auth-api-refresh-token-cookie.e2e-spec.js +110 -0
  116. package/test/for-root/auth-api-refresh-token-cookie.e2e-spec.js.map +1 -0
  117. package/test/for-root/auth-api-refresh-token.e2e-spec.d.ts +1 -0
  118. package/test/for-root/auth-api-refresh-token.e2e-spec.js +153 -0
  119. package/test/for-root/auth-api-refresh-token.e2e-spec.js.map +1 -0
  120. package/test/for-root/auth-api-register.e2e-spec.d.ts +1 -0
  121. package/test/for-root/auth-api-register.e2e-spec.js +116 -0
  122. package/test/for-root/auth-api-register.e2e-spec.js.map +1 -0
  123. package/test/for-root/auth-api-reset-password.e2e-spec.d.ts +1 -0
  124. package/test/for-root/auth-api-reset-password.e2e-spec.js +168 -0
  125. package/test/for-root/auth-api-reset-password.e2e-spec.js.map +1 -0
  126. package/test/for-root/initialization.e2e-spec.d.ts +1 -0
  127. package/test/for-root/initialization.e2e-spec.js +84 -0
  128. package/test/for-root/initialization.e2e-spec.js.map +1 -0
  129. package/test/for-root/websockets-auth-basic.e2e-spec.d.ts +1 -0
  130. package/test/for-root/websockets-auth-basic.e2e-spec.js +313 -0
  131. package/test/for-root/websockets-auth-basic.e2e-spec.js.map +1 -0
  132. package/test/for-root/websockets-auth-broadcast.e2e-spec.d.ts +1 -0
  133. package/test/for-root/websockets-auth-broadcast.e2e-spec.js +86 -0
  134. package/test/for-root/websockets-auth-broadcast.e2e-spec.js.map +1 -0
  135. package/test/for-root/websockets-auth-login.e2e-spec.d.ts +1 -0
  136. package/test/for-root/websockets-auth-login.e2e-spec.js +107 -0
  137. package/test/for-root/websockets-auth-login.e2e-spec.js.map +1 -0
  138. package/test/for-root/websockets-auth-refresh-token.e2e-spec.d.ts +1 -0
  139. package/test/for-root/websockets-auth-refresh-token.e2e-spec.js +104 -0
  140. package/test/for-root/websockets-auth-refresh-token.e2e-spec.js.map +1 -0
  141. package/test/for-root/websockets-auth-register.e2e-spec.d.ts +1 -0
  142. package/test/for-root/websockets-auth-register.e2e-spec.js +131 -0
  143. package/test/for-root/websockets-auth-register.e2e-spec.js.map +1 -0
  144. package/test/for-root/websockets-auth-reset-password.e2e-spec.d.ts +1 -0
  145. package/test/for-root/websockets-auth-reset-password.e2e-spec.js +164 -0
  146. package/test/for-root/websockets-auth-reset-password.e2e-spec.js.map +1 -0
  147. package/test/shared/entities/basic-user.factory.d.ts +12 -0
  148. package/test/shared/entities/basic-user.factory.js +31 -0
  149. package/test/shared/entities/basic-user.factory.js.map +1 -0
  150. package/test/shared/entities/broadcast-user.factory.d.ts +13 -0
  151. package/test/shared/entities/broadcast-user.factory.js +35 -0
  152. package/test/shared/entities/broadcast-user.factory.js.map +1 -0
  153. package/test/shared/entities/index.d.ts +7 -0
  154. package/test/shared/entities/index.js +24 -0
  155. package/test/shared/entities/index.js.map +1 -0
  156. package/test/shared/entities/login-user.factory.d.ts +14 -0
  157. package/test/shared/entities/login-user.factory.js +39 -0
  158. package/test/shared/entities/login-user.factory.js.map +1 -0
  159. package/test/shared/entities/refresh-token-user.factory.d.ts +13 -0
  160. package/test/shared/entities/refresh-token-user.factory.js +35 -0
  161. package/test/shared/entities/refresh-token-user.factory.js.map +1 -0
  162. package/test/shared/entities/register-user.factory.d.ts +14 -0
  163. package/test/shared/entities/register-user.factory.js +39 -0
  164. package/test/shared/entities/register-user.factory.js.map +1 -0
  165. package/test/shared/entities/reset-password-user.factory.d.ts +14 -0
  166. package/test/shared/entities/reset-password-user.factory.js +39 -0
  167. package/test/shared/entities/reset-password-user.factory.js.map +1 -0
  168. package/test/shared/entities/validated-user.factory.d.ts +12 -0
  169. package/test/shared/entities/validated-user.factory.js +40 -0
  170. package/test/shared/entities/validated-user.factory.js.map +1 -0
  171. package/test/shared/fixtures/index.d.ts +2 -0
  172. package/test/shared/fixtures/index.js +19 -0
  173. package/test/shared/fixtures/index.js.map +1 -0
  174. package/test/shared/fixtures/login.fixtures.d.ts +16 -0
  175. package/test/shared/fixtures/login.fixtures.js +20 -0
  176. package/test/shared/fixtures/login.fixtures.js.map +1 -0
  177. package/test/shared/fixtures/register.fixtures.d.ts +10 -0
  178. package/test/shared/fixtures/register.fixtures.js +14 -0
  179. package/test/shared/fixtures/register.fixtures.js.map +1 -0
  180. package/test/shared/index.d.ts +4 -0
  181. package/test/shared/index.js +24 -0
  182. package/test/shared/index.js.map +1 -0
  183. package/test/shared/init-app.d.ts +3 -0
  184. package/test/shared/init-app.js +19 -0
  185. package/test/shared/init-app.js.map +1 -0
  186. package/test/shared/init-module.d.ts +4 -0
  187. package/test/shared/init-module.js +16 -0
  188. package/test/shared/init-module.js.map +1 -0
  189. package/tsconfig.tsbuildinfo +1 -1
  190. package/test/dynamic-api-for-feature.e2e-spec.js +0 -1100
  191. package/test/dynamic-api-for-feature.e2e-spec.js.map +0 -1
  192. package/test/dynamic-api-for-root.e2e-spec.js +0 -1573
  193. package/test/dynamic-api-for-root.e2e-spec.js.map +0 -1
  194. /package/test/{dynamic-api-for-feature.e2e-spec.d.ts → for-feature/base-entity.e2e-spec.d.ts} +0 -0
  195. /package/test/{dynamic-api-for-root.e2e-spec.d.ts → for-feature/http-broadcast.e2e-spec.d.ts} +0 -0
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const mongoose_1 = require("mongoose");
4
+ const src_1 = require("../../src");
5
+ const socket_adapter_1 = require("../../src/adapters/socket-adapter");
6
+ const e2e_setup_1 = require("../e2e.setup");
7
+ require("dotenv/config");
8
+ const shared_1 = require("../shared");
9
+ describe('DynamicApiModule forRoot - Websockets useAuth with broadcast options (e2e)', () => {
10
+ const UserEntity = (0, shared_1.createBroadcastUserEntity)();
11
+ let wsAccessToken;
12
+ beforeEach(() => {
13
+ src_1.DynamicApiModule.state['resetState']();
14
+ });
15
+ afterEach(async () => {
16
+ await (0, e2e_setup_1.closeTestingApp)(mongoose_1.default.connections);
17
+ });
18
+ beforeEach(async () => {
19
+ await (0, shared_1.initModule)({
20
+ useAuth: {
21
+ userEntity: UserEntity,
22
+ login: {
23
+ loginField: 'email',
24
+ passwordField: 'password',
25
+ broadcast: { enabled: true, fields: ['id', 'email'] },
26
+ },
27
+ register: {
28
+ broadcast: { enabled: true, fields: ['id', 'email'] },
29
+ },
30
+ getAccount: {
31
+ broadcast: { enabled: true, fields: ['id', 'email'] },
32
+ },
33
+ updateAccount: {
34
+ broadcast: { enabled: true, fields: ['id', 'email'] },
35
+ },
36
+ },
37
+ webSocket: true,
38
+ }, undefined, async (app) => {
39
+ app.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(app));
40
+ });
41
+ const { accessToken } = await e2e_setup_1.server.emit('auth-register', { email: 'broadcast-ws@test.co', password: 'ws-pass' });
42
+ wsAccessToken = accessToken;
43
+ jest.clearAllMocks();
44
+ });
45
+ it('[auth-login] should broadcast user data when login via WS with enabled broadcast', async () => {
46
+ await e2e_setup_1.server.emit('auth-login', { email: 'broadcast-ws@test.co', password: 'ws-pass' }, { expectBroadcast: true, broadcastEvent: 'auth-login-broadcast' });
47
+ expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledTimes(1);
48
+ expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledWith(expect.objectContaining({
49
+ event: 'auth-login-broadcast',
50
+ data: expect.arrayContaining([
51
+ expect.objectContaining({ email: 'broadcast-ws@test.co' }),
52
+ ]),
53
+ }));
54
+ });
55
+ it('[auth-register] should broadcast user data when register via WS with enabled broadcast', async () => {
56
+ await e2e_setup_1.server.emit('auth-register', { email: 'broadcast-ws2@test.co', password: 'ws-pass2' }, { expectBroadcast: true, broadcastEvent: 'auth-register-broadcast' });
57
+ expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledTimes(1);
58
+ expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledWith(expect.objectContaining({
59
+ event: 'auth-register-broadcast',
60
+ data: expect.arrayContaining([
61
+ expect.objectContaining({ email: 'broadcast-ws2@test.co' }),
62
+ ]),
63
+ }));
64
+ });
65
+ it('[auth-get-account] should broadcast account data when get account via WS with enabled broadcast', async () => {
66
+ await e2e_setup_1.server.emit('auth-get-account', {}, { accessToken: wsAccessToken, expectBroadcast: true, broadcastEvent: 'auth-get-account-broadcast' });
67
+ expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledTimes(1);
68
+ expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledWith(expect.objectContaining({
69
+ event: 'auth-get-account-broadcast',
70
+ data: expect.arrayContaining([
71
+ expect.objectContaining({ email: 'broadcast-ws@test.co' }),
72
+ ]),
73
+ }));
74
+ });
75
+ it('[auth-update-account] should broadcast updated account data when update account via WS with enabled broadcast', async () => {
76
+ await e2e_setup_1.server.emit('auth-update-account', { name: 'WS Broadcast User' }, { accessToken: wsAccessToken, expectBroadcast: true, broadcastEvent: 'auth-update-account-broadcast' });
77
+ expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledTimes(1);
78
+ expect(e2e_setup_1.handleSocketBroadcast).toHaveBeenCalledWith(expect.objectContaining({
79
+ event: 'auth-update-account-broadcast',
80
+ data: expect.arrayContaining([
81
+ expect.objectContaining({ email: 'broadcast-ws@test.co' }),
82
+ ]),
83
+ }));
84
+ });
85
+ });
86
+ //# sourceMappingURL=websockets-auth-broadcast.e2e-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websockets-auth-broadcast.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-root/websockets-auth-broadcast.e2e-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import 'dotenv/config';
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const common_1 = require("@nestjs/common");
4
+ const mongoose_1 = require("mongoose");
5
+ const src_1 = require("../../src");
6
+ const socket_adapter_1 = require("../../src/adapters/socket-adapter");
7
+ const e2e_setup_1 = require("../e2e.setup");
8
+ require("dotenv/config");
9
+ const utils_1 = require("../utils");
10
+ const shared_1 = require("../shared");
11
+ describe('DynamicApiModule forRoot - Websockets EVENT auth-login with login options (e2e)', () => {
12
+ const User = (0, shared_1.createLoginUserEntity)();
13
+ const admin = shared_1.LOGIN_ADMIN;
14
+ const user = shared_1.LOGIN_USER;
15
+ const client = shared_1.LOGIN_CLIENT;
16
+ beforeEach(() => {
17
+ src_1.DynamicApiModule.state['resetState']();
18
+ });
19
+ afterEach(async () => {
20
+ await (0, e2e_setup_1.closeTestingApp)(mongoose_1.default.connections);
21
+ });
22
+ beforeEach(async () => {
23
+ const bcryptService = new src_1.BcryptService();
24
+ const fixtures = async (_) => {
25
+ const model = await (0, utils_1.getModelFromEntity)(User);
26
+ await model.insertMany([
27
+ { ...admin, pass: await bcryptService.hashPassword(admin.pass) },
28
+ { ...user, pass: await bcryptService.hashPassword(user.pass) },
29
+ { ...client, pass: await bcryptService.hashPassword(client.pass) },
30
+ ]);
31
+ };
32
+ await (0, shared_1.initModule)({
33
+ useAuth: {
34
+ userEntity: User,
35
+ login: {
36
+ loginField: 'username',
37
+ passwordField: 'pass',
38
+ additionalFields: ['role', 'isVerified'],
39
+ abilityPredicate: (user) => user.role === 'admin' || user.role === 'user',
40
+ callback: async (user) => {
41
+ if (user.isVerified) {
42
+ return;
43
+ }
44
+ throw new common_1.UnauthorizedException(`Hello ${user.username}, you must verify your account first!`);
45
+ },
46
+ },
47
+ },
48
+ webSocket: true,
49
+ }, fixtures, async (_) => {
50
+ _.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(_));
51
+ });
52
+ });
53
+ describe('loginField', () => {
54
+ it('should throw a ws exception if loginField is missing', async () => {
55
+ await e2e_setup_1.server.emit('auth-login', { pass: 'test' });
56
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
57
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
58
+ message: 'Unauthorized',
59
+ });
60
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
61
+ });
62
+ });
63
+ describe('passwordField', () => {
64
+ it('should throw an unauthorized exception if passwordField is missing', async () => {
65
+ await e2e_setup_1.server.emit('auth-login', { username: 'unit' });
66
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
67
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
68
+ message: 'Unauthorized',
69
+ });
70
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
71
+ });
72
+ });
73
+ describe('abilityPredicate', () => {
74
+ it('should throw a ws exception if user role is not admin or user', async () => {
75
+ const { username, pass } = client;
76
+ await e2e_setup_1.server.emit('auth-login', { username, pass });
77
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
78
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
79
+ message: 'Access denied',
80
+ });
81
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
82
+ });
83
+ });
84
+ describe('callback', () => {
85
+ it('should throw a ws exception if user is not verified', async () => {
86
+ const { username, pass } = user;
87
+ await e2e_setup_1.server.emit('auth-login', { username, pass });
88
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
89
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
90
+ message: 'Hello user, you must verify your account first!',
91
+ });
92
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
93
+ });
94
+ });
95
+ describe('additionalFields', () => {
96
+ it('should return additional fields', async () => {
97
+ const { username, pass } = admin;
98
+ const { accessToken } = await e2e_setup_1.server.emit('auth-login', { username, pass });
99
+ e2e_setup_1.handleSocketResponse.mockReset();
100
+ await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken });
101
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
102
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
103
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith({ id: expect.any(String), username: 'admin', role: 'admin', isVerified: true });
104
+ });
105
+ });
106
+ });
107
+ //# sourceMappingURL=websockets-auth-login.e2e-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websockets-auth-login.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-root/websockets-auth-login.e2e-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import 'dotenv/config';
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jwt_1 = require("@nestjs/jwt");
4
+ const mongoose_1 = require("mongoose");
5
+ const src_1 = require("../../src");
6
+ const socket_adapter_1 = require("../../src/adapters/socket-adapter");
7
+ const e2e_setup_1 = require("../e2e.setup");
8
+ require("dotenv/config");
9
+ const utils_1 = require("../utils");
10
+ const shared_1 = require("../shared");
11
+ describe('DynamicApiModule forRoot - Websockets EVENT auth-refresh-token with refreshTokenExpiresIn (e2e)', () => {
12
+ beforeEach(() => {
13
+ src_1.DynamicApiModule.state['resetState']();
14
+ });
15
+ afterEach(async () => {
16
+ await (0, e2e_setup_1.closeTestingApp)(mongoose_1.default.connections);
17
+ });
18
+ describe('with jwt.refreshTokenExpiresIn configured', () => {
19
+ let app;
20
+ let jwtService;
21
+ let wsAccessToken;
22
+ let wsRefreshToken;
23
+ beforeEach(async () => {
24
+ app = await (0, shared_1.initModule)({
25
+ useAuth: {
26
+ userEntity: (0, shared_1.createBasicUserEntity)(),
27
+ webSocket: true,
28
+ jwt: {
29
+ secret: 'test-secret',
30
+ expiresIn: '2s',
31
+ refreshTokenExpiresIn: '10s',
32
+ },
33
+ },
34
+ }, undefined, async (_) => {
35
+ _.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(_));
36
+ });
37
+ jwtService = app.get(jwt_1.JwtService);
38
+ const { accessToken, refreshToken } = await e2e_setup_1.server.emit('auth-register', { email: 'ws-refresh@test.co', password: 'test' });
39
+ wsAccessToken = accessToken;
40
+ wsRefreshToken = refreshToken;
41
+ e2e_setup_1.handleSocketResponse.mockReset();
42
+ });
43
+ it('should return { accessToken, refreshToken } with refresh token having longer expiration', async () => {
44
+ await e2e_setup_1.server.emit('auth-refresh-token', undefined, { refreshToken: wsRefreshToken });
45
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
46
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
47
+ const [responseData] = e2e_setup_1.handleSocketResponse.mock.calls[0];
48
+ expect(responseData).toHaveProperty('accessToken');
49
+ expect(responseData).toHaveProperty('refreshToken');
50
+ const newRefreshDecoded = jwtService.decode(responseData.refreshToken);
51
+ const accessDecoded = jwtService.decode(wsAccessToken);
52
+ expect(newRefreshDecoded.exp - newRefreshDecoded.iat).toBeGreaterThan(accessDecoded.exp - accessDecoded.iat);
53
+ });
54
+ it('should still issue a valid new access token after the original access token has expired', async () => {
55
+ await (0, utils_1.wait)(3000);
56
+ await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken: wsAccessToken });
57
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({ message: 'Unauthorized' });
58
+ e2e_setup_1.handleSocketException.mockReset();
59
+ e2e_setup_1.handleSocketResponse.mockReset();
60
+ await e2e_setup_1.server.emit('auth-refresh-token', undefined, { refreshToken: wsRefreshToken });
61
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
62
+ const [refreshData] = e2e_setup_1.handleSocketResponse.mock.calls[0];
63
+ const newAccessToken = refreshData.accessToken;
64
+ e2e_setup_1.handleSocketResponse.mockReset();
65
+ await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken: newAccessToken });
66
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
67
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith(expect.objectContaining({ email: 'ws-refresh@test.co' }));
68
+ }, 10000);
69
+ });
70
+ describe('without jwt.refreshTokenExpiresIn (defaults to 7d)', () => {
71
+ let app;
72
+ let jwtService;
73
+ let wsAccessToken;
74
+ let wsRefreshToken;
75
+ beforeEach(async () => {
76
+ app = await (0, shared_1.initModule)({
77
+ useAuth: {
78
+ userEntity: (0, shared_1.createBasicUserEntity)(),
79
+ webSocket: true,
80
+ jwt: {
81
+ secret: 'test-secret',
82
+ expiresIn: '1h',
83
+ },
84
+ },
85
+ }, undefined, async (_) => {
86
+ _.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(_));
87
+ });
88
+ jwtService = app.get(jwt_1.JwtService);
89
+ const { accessToken, refreshToken } = await e2e_setup_1.server.emit('auth-register', { email: 'ws-fallback@test.co', password: 'test' });
90
+ wsAccessToken = accessToken;
91
+ wsRefreshToken = refreshToken;
92
+ e2e_setup_1.handleSocketResponse.mockReset();
93
+ });
94
+ it('should return a refresh token with longer expiration than the access token (defaults to 7d)', async () => {
95
+ await e2e_setup_1.server.emit('auth-refresh-token', undefined, { refreshToken: wsRefreshToken });
96
+ const [responseData] = e2e_setup_1.handleSocketResponse.mock.calls[0];
97
+ expect(responseData).toHaveProperty('refreshToken');
98
+ const newRefreshDecoded = jwtService.decode(responseData.refreshToken);
99
+ const accessDecoded = jwtService.decode(wsAccessToken);
100
+ expect(newRefreshDecoded.exp - newRefreshDecoded.iat).toBeGreaterThan(accessDecoded.exp - accessDecoded.iat);
101
+ });
102
+ });
103
+ });
104
+ //# sourceMappingURL=websockets-auth-refresh-token.e2e-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websockets-auth-refresh-token.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-root/websockets-auth-refresh-token.e2e-spec.ts"],"names":[],"mappings":";;AACA,qCAAyC;AACzC,uCAAgC;AAChC,mCAA6C;AAC7C,sEAAkE;AAClE,4CAKsB;AACtB,yBAAuB;AACvB,oCAAgC;AAChC,sCAA8D;AAE9D,QAAQ,CAAC,iGAAiG,EAAE,GAAG,EAAE;IAC/G,UAAU,CAAC,GAAG,EAAE;QACd,sBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,IAAA,2BAAe,EAAC,kBAAQ,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACzD,IAAI,GAAqB,CAAC;QAC1B,IAAI,UAAsB,CAAC;QAC3B,IAAI,aAAqB,CAAC;QAC1B,IAAI,cAAsB,CAAC;QAE3B,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,GAAG,GAAG,MAAM,IAAA,mBAAU,EACpB;gBACE,OAAO,EAAE;oBACP,UAAU,EAAE,IAAA,8BAAqB,GAAE;oBACnC,SAAS,EAAE,IAAI;oBACf,GAAG,EAAE;wBACH,MAAM,EAAE,aAAa;wBACrB,SAAS,EAAE,IAAI;wBACf,qBAAqB,EAAE,KAAK;qBAC7B;iBACF;aACF,EACD,SAAS,EACT,KAAK,EAAE,CAAmB,EAAE,EAAE;gBAC5B,CAAC,CAAC,mBAAmB,CAAC,IAAI,8BAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC,CACF,CAAC;YACF,UAAU,GAAG,GAAG,CAAC,GAAG,CAAa,gBAAU,CAAC,CAAC;YAE7C,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,kBAAM,CAAC,IAAI,CACrD,eAAe,EACf,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAClD,CAAC;YACF,aAAa,GAAG,WAAW,CAAC;YAC5B,cAAc,GAAG,YAAY,CAAC;YAC9B,gCAAoB,CAAC,SAAS,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;YACvG,MAAM,kBAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YAErF,MAAM,CAAC,iCAAqB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACrD,MAAM,CAAC,gCAAoB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAEtD,MAAM,CAAC,YAAY,CAAC,GAAG,gCAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YACnD,MAAM,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YAEpD,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAiC,CAAC;YACvG,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,aAAa,CAAiC,CAAC;YAEvF,MAAM,CAAC,iBAAiB,CAAC,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC/G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;YAEvG,MAAM,IAAA,YAAI,EAAC,IAAI,CAAC,CAAC;YAGjB,MAAM,kBAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;YACjF,MAAM,CAAC,iCAAqB,CAAC,CAAC,oBAAoB,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;YAChF,iCAAqB,CAAC,SAAS,EAAE,CAAC;YAClC,gCAAoB,CAAC,SAAS,EAAE,CAAC;YAGjC,MAAM,kBAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YACrF,MAAM,CAAC,iCAAqB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACrD,MAAM,CAAC,WAAW,CAAC,GAAG,gCAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,cAAc,GAAG,WAAW,CAAC,WAAW,CAAC;YAC/C,gCAAoB,CAAC,SAAS,EAAE,CAAC;YAGjC,MAAM,kBAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;YAClF,MAAM,CAAC,iCAAqB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACrD,MAAM,CAAC,gCAAoB,CAAC,CAAC,oBAAoB,CAC/C,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CACzD,CAAC;QACJ,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAClE,IAAI,GAAqB,CAAC;QAC1B,IAAI,UAAsB,CAAC;QAC3B,IAAI,aAAqB,CAAC;QAC1B,IAAI,cAAsB,CAAC;QAE3B,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,GAAG,GAAG,MAAM,IAAA,mBAAU,EACpB;gBACE,OAAO,EAAE;oBACP,UAAU,EAAE,IAAA,8BAAqB,GAAE;oBACnC,SAAS,EAAE,IAAI;oBACf,GAAG,EAAE;wBACH,MAAM,EAAE,aAAa;wBACrB,SAAS,EAAE,IAAI;qBAChB;iBACF;aACF,EACD,SAAS,EACT,KAAK,EAAE,CAAmB,EAAE,EAAE;gBAC5B,CAAC,CAAC,mBAAmB,CAAC,IAAI,8BAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC,CACF,CAAC;YACF,UAAU,GAAG,GAAG,CAAC,GAAG,CAAa,gBAAU,CAAC,CAAC;YAE7C,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,kBAAM,CAAC,IAAI,CACrD,eAAe,EACf,EAAE,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,CACnD,CAAC;YACF,aAAa,GAAG,WAAW,CAAC;YAC5B,cAAc,GAAG,YAAY,CAAC;YAC9B,gCAAoB,CAAC,SAAS,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;YAC3G,MAAM,kBAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YAErF,MAAM,CAAC,YAAY,CAAC,GAAG,gCAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YAEpD,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAiC,CAAC;YACvG,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,aAAa,CAAiC,CAAC;YAGvF,MAAM,CAAC,iBAAiB,CAAC,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC/G,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ import 'dotenv/config';
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const mongoose_1 = require("mongoose");
4
+ const src_1 = require("../../src");
5
+ const socket_adapter_1 = require("../../src/adapters/socket-adapter");
6
+ const e2e_setup_1 = require("../e2e.setup");
7
+ require("dotenv/config");
8
+ const utils_1 = require("../utils");
9
+ const shared_1 = require("../shared");
10
+ describe('DynamicApiModule forRoot - Websockets EVENT auth-register with register options (e2e)', () => {
11
+ const User = (0, shared_1.createRegisterUserEntity)();
12
+ const admin = shared_1.REGISTER_ADMIN;
13
+ const user = shared_1.REGISTER_USER;
14
+ beforeEach(() => {
15
+ src_1.DynamicApiModule.state['resetState']();
16
+ });
17
+ afterEach(async () => {
18
+ await (0, e2e_setup_1.closeTestingApp)(mongoose_1.default.connections);
19
+ });
20
+ beforeEach(async () => {
21
+ const bcryptService = new src_1.BcryptService();
22
+ const fixtures = async (_) => {
23
+ const model = await (0, utils_1.getModelFromEntity)(User);
24
+ await model.insertMany([
25
+ { ...admin, password: await bcryptService.hashPassword(admin.password) },
26
+ { ...user, password: await bcryptService.hashPassword(user.password) },
27
+ ]);
28
+ };
29
+ await (0, shared_1.initModule)({
30
+ useAuth: {
31
+ userEntity: User,
32
+ register: {
33
+ protected: true,
34
+ abilityPredicate: (user) => user.isVerified,
35
+ additionalFields: ['role'],
36
+ callback: async (user, { updateOneDocument }) => {
37
+ if (user.role !== 'admin') {
38
+ return;
39
+ }
40
+ await updateOneDocument(User, { _id: user.id }, { $set: { isVerified: true } });
41
+ },
42
+ },
43
+ login: {
44
+ additionalFields: ['role', 'isVerified'],
45
+ },
46
+ },
47
+ webSocket: true,
48
+ }, fixtures, async (_) => {
49
+ _.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(_));
50
+ });
51
+ });
52
+ describe('protected', () => {
53
+ it('should throw a ws exception if user is not logged in and protected is true', async () => {
54
+ await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'test' });
55
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
56
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
57
+ message: 'Unauthorized',
58
+ });
59
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
60
+ });
61
+ });
62
+ describe('abilityPredicate', () => {
63
+ it('should not create a new user if user is not verified', async () => {
64
+ const { email, password } = user;
65
+ const { accessToken } = await e2e_setup_1.server.emit('auth-login', { email, password });
66
+ e2e_setup_1.handleSocketResponse.mockReset();
67
+ await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'test' }, {
68
+ accessToken,
69
+ });
70
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
71
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
72
+ message: 'Access denied',
73
+ });
74
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
75
+ });
76
+ it('should create a new user and return access token if user is verified', async () => {
77
+ const { email, password } = admin;
78
+ const { accessToken } = await e2e_setup_1.server.emit('auth-login', { email, password });
79
+ e2e_setup_1.handleSocketResponse.mockReset();
80
+ await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'test' }, {
81
+ accessToken,
82
+ });
83
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
84
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
85
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith({ accessToken: expect.any(String), refreshToken: expect.any(String) });
86
+ });
87
+ });
88
+ describe('additionalFields', () => {
89
+ it('should allow to register a new user with additional fields', async () => {
90
+ const { email, password } = admin;
91
+ const { accessToken } = await e2e_setup_1.server.emit('auth-login', { email, password });
92
+ e2e_setup_1.handleSocketResponse.mockReset();
93
+ await e2e_setup_1.server.emit('auth-register', { email: 'client@test.co', password: 'client', role: 'client' }, {
94
+ accessToken,
95
+ });
96
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
97
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
98
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith({ accessToken: expect.any(String), refreshToken: expect.any(String) });
99
+ });
100
+ });
101
+ describe('callback', () => {
102
+ let adminAccessToken;
103
+ beforeEach(async () => {
104
+ const { email, password } = admin;
105
+ const { accessToken } = await e2e_setup_1.server.emit('auth-login', { email, password });
106
+ adminAccessToken = accessToken;
107
+ e2e_setup_1.handleSocketResponse.mockReset();
108
+ });
109
+ it('should not set isVerified to true if role is not admin', async () => {
110
+ const { accessToken: clientAccessToken } = await e2e_setup_1.server.emit('auth-register', { email: 'client@test.co', password: 'client', role: 'client' }, {
111
+ accessToken: adminAccessToken,
112
+ });
113
+ e2e_setup_1.handleSocketResponse.mockReset();
114
+ const body = await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken: clientAccessToken });
115
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
116
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
117
+ expect(body).toHaveProperty('isVerified', false);
118
+ });
119
+ it('should set isVerified to true if role is admin', async () => {
120
+ const { accessToken: admin2AccessToken } = await e2e_setup_1.server.emit('auth-register', { email: 'admin2@test.co', password: 'admin2', role: 'admin' }, {
121
+ accessToken: adminAccessToken,
122
+ });
123
+ e2e_setup_1.handleSocketResponse.mockReset();
124
+ const body = await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken: admin2AccessToken });
125
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
126
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
127
+ expect(body).toHaveProperty('isVerified', true);
128
+ });
129
+ });
130
+ });
131
+ //# sourceMappingURL=websockets-auth-register.e2e-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websockets-auth-register.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-root/websockets-auth-register.e2e-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import 'dotenv/config';