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,168 @@
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 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 - useAuth with resetPassword options (e2e)', () => {
11
+ const User = (0, shared_1.createResetPasswordUserEntity)();
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
+ let model;
19
+ let user;
20
+ let client;
21
+ let app;
22
+ beforeEach(async () => {
23
+ user = { email: 'user@test.co', password: 'user', isVerified: true };
24
+ client = { email: 'client@test.co', password: 'client' };
25
+ const bcryptService = new src_1.BcryptService();
26
+ const fixtures = async (_) => {
27
+ model = await (0, utils_1.getModelFromEntity)(User);
28
+ await model.insertMany([
29
+ { ...user, password: await bcryptService.hashPassword(user.password) },
30
+ { ...client, password: await bcryptService.hashPassword(client.password) },
31
+ ]);
32
+ };
33
+ app = await (0, shared_1.initModule)({
34
+ useAuth: {
35
+ userEntity: User,
36
+ resetPassword: {
37
+ emailField: 'email',
38
+ expirationInMinutes: 1,
39
+ resetPasswordCallback: async ({ resetPasswordToken }, { updateUserByEmail }) => {
40
+ await updateUserByEmail({ $set: { resetPasswordToken } });
41
+ },
42
+ changePasswordAbilityPredicate: (user) => user.isVerified && !!user.resetPasswordToken,
43
+ changePasswordCallback: async (user, { updateOneDocument }) => {
44
+ await updateOneDocument(User, { _id: user.id }, { $unset: { resetPasswordToken: 1 } });
45
+ },
46
+ },
47
+ },
48
+ }, fixtures);
49
+ });
50
+ describe('POST /auth/reset-password', () => {
51
+ it('should throw a bad request exception if email is missing if no validation options are provided', async () => {
52
+ const { body, status } = await e2e_setup_1.server.post('/auth/reset-password', {});
53
+ expect(status).toBe(400);
54
+ expect(body).toEqual({
55
+ error: 'Bad Request',
56
+ message: 'Invalid or missing argument',
57
+ statusCode: 400,
58
+ });
59
+ });
60
+ it('should not throw a bad request exception if email is invalid if no validation options are provided', async () => {
61
+ const { body, status } = await e2e_setup_1.server.post('/auth/reset-password', { email: 'unit.test.co' });
62
+ expect(status).toBe(204);
63
+ expect(body).toEqual({});
64
+ });
65
+ it('should not throw an exception if email is not found', async () => {
66
+ const { body, status } = await e2e_setup_1.server.post('/auth/reset-password', { email: 'invalid@test.co' });
67
+ expect(status).toBe(204);
68
+ expect(body).toEqual({});
69
+ });
70
+ describe('resetPasswordCallback', () => {
71
+ it('should set resetPasswordToken if email is valid', async () => {
72
+ const { email } = user;
73
+ const { resetPasswordToken: resetPasswordTokenBeforeUpdate } = (await model.findOne({ email }).lean().exec());
74
+ const { status } = await e2e_setup_1.server.post('/auth/reset-password', { email });
75
+ const { resetPasswordToken: resetPasswordTokenAfterUpdate } = (await model.findOne({ email }).lean().exec());
76
+ expect(status).toBe(204);
77
+ expect(resetPasswordTokenBeforeUpdate).toStrictEqual(undefined);
78
+ expect(resetPasswordTokenAfterUpdate).toStrictEqual(expect.any(String));
79
+ });
80
+ });
81
+ });
82
+ describe('PATCH /auth/change-password', () => {
83
+ it('should throw a bad request exception if resetPasswordToken is missing', async () => {
84
+ const { body, status } = await e2e_setup_1.server.patch('/auth/change-password', { newPassword: 'test' });
85
+ expect(status).toBe(400);
86
+ expect(body).toEqual({
87
+ error: 'Bad Request',
88
+ message: 'Invalid or missing argument',
89
+ statusCode: 400,
90
+ });
91
+ });
92
+ it('should throw a bad request exception if newPassword is missing', async () => {
93
+ const { email } = user;
94
+ await e2e_setup_1.server.post('/auth/reset-password', { email });
95
+ const { resetPasswordToken: resetPasswordTokenAfterUpdate } = (await model.findOne({ email }).lean().exec());
96
+ const resetPasswordToken = resetPasswordTokenAfterUpdate;
97
+ const { body, status } = await e2e_setup_1.server.patch('/auth/change-password', { resetPasswordToken });
98
+ expect(status).toBe(400);
99
+ expect(body).toEqual({
100
+ error: 'Bad Request',
101
+ message: 'Invalid or missing argument',
102
+ statusCode: 400,
103
+ });
104
+ });
105
+ it('should throw an unauthorized exception if resetPasswordToken is invalid', async () => {
106
+ const { body, status } = await e2e_setup_1.server.patch('/auth/change-password', { resetPasswordToken: 'test', newPassword: 'newPassword' });
107
+ expect(status).toBe(400);
108
+ expect(body).toEqual({
109
+ error: 'Bad Request',
110
+ message: 'Invalid reset password token. Please redo the reset password process.',
111
+ statusCode: 400,
112
+ });
113
+ });
114
+ it('should throw an unauthorized exception if resetPasswordToken is expired', async () => {
115
+ const jwtService = app.get(jwt_1.JwtService);
116
+ const expiredResetPasswordToken = jwtService.sign({ email: user.email }, { expiresIn: 1 });
117
+ await (0, utils_1.wait)(500);
118
+ const { body, status } = await e2e_setup_1.server.patch('/auth/change-password', { resetPasswordToken: expiredResetPasswordToken, newPassword: 'newPassword' });
119
+ expect(status).toBe(401);
120
+ expect(body).toEqual({
121
+ error: 'Unauthorized',
122
+ message: 'Time to reset password has expired. Please redo the reset password process.',
123
+ statusCode: 401,
124
+ });
125
+ });
126
+ describe('changePasswordAbilityPredicate', () => {
127
+ let resetPasswordToken;
128
+ beforeEach(async () => {
129
+ await e2e_setup_1.server.post('/auth/reset-password', { email: client.email });
130
+ const { resetPasswordToken: token } = (await model.findOne({ email: client.email }).lean().exec());
131
+ resetPasswordToken = token;
132
+ });
133
+ it('should throw a forbidden exception if user is not allowed to change password', async () => {
134
+ expect(resetPasswordToken).toStrictEqual(expect.any(String));
135
+ const { body, status } = await e2e_setup_1.server.patch('/auth/change-password', { resetPasswordToken, newPassword: 'newPassword' });
136
+ expect(status).toBe(403);
137
+ expect(body).toEqual({
138
+ error: 'Forbidden',
139
+ message: 'You are not allowed to change your password.',
140
+ statusCode: 403,
141
+ });
142
+ });
143
+ });
144
+ describe('changePasswordCallback', () => {
145
+ let resetPasswordToken;
146
+ beforeEach(async () => {
147
+ await e2e_setup_1.server.post('/auth/reset-password', { email: user.email });
148
+ const { resetPasswordToken: token } = (await model.findOne({ email: user.email }).lean().exec());
149
+ resetPasswordToken = token;
150
+ });
151
+ it('should change password and unset resetPasswordToken if resetPasswordToken is valid', async () => {
152
+ expect(resetPasswordToken).toStrictEqual(expect.any(String));
153
+ const newPassword = 'newPassword';
154
+ const bcryptService = app.get(src_1.BcryptService);
155
+ const { password: passwordBeforeUpdate } = (await model.findOne({ email: user.email }).lean().exec());
156
+ const { status } = await e2e_setup_1.server.patch('/auth/change-password', { resetPasswordToken, newPassword });
157
+ const { password: passwordAfterUpdate, resetPasswordToken: tokenAfterUpdate } = (await model.findOne({ email: user.email }).lean().exec());
158
+ const isPreviousPassword = await bcryptService.comparePassword(user.password, passwordBeforeUpdate);
159
+ expect(isPreviousPassword).toBe(true);
160
+ const isNewPassword = await bcryptService.comparePassword(newPassword, passwordAfterUpdate);
161
+ expect(isNewPassword).toBe(true);
162
+ expect(status).toBe(204);
163
+ expect(tokenAfterUpdate).toStrictEqual(undefined);
164
+ });
165
+ });
166
+ });
167
+ });
168
+ //# sourceMappingURL=auth-api-reset-password.e2e-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-api-reset-password.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-root/auth-api-reset-password.e2e-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import 'dotenv/config';
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const mongoose_1 = require("mongoose");
4
+ const src_1 = require("../../src");
5
+ const e2e_setup_1 = require("../e2e.setup");
6
+ require("dotenv/config");
7
+ const shared_1 = require("../shared");
8
+ describe('DynamicApiModule forRoot - Initialization (e2e)', () => {
9
+ const uri = process.env.MONGO_DB_URL;
10
+ beforeEach(() => {
11
+ src_1.DynamicApiModule.state['resetState']();
12
+ });
13
+ afterEach(async () => {
14
+ await (0, e2e_setup_1.closeTestingApp)(mongoose_1.default.connections);
15
+ });
16
+ it('should initialize dynamic api module state with default options', async () => {
17
+ const app = await (0, shared_1.initModule)({});
18
+ expect(app).toBeDefined();
19
+ expect(src_1.DynamicApiModule.state.get()).toStrictEqual({
20
+ uri,
21
+ initialized: true,
22
+ isGlobalCacheEnabled: true,
23
+ connectionName: 'dynamic-api-connection',
24
+ cacheExcludedPaths: [],
25
+ credentials: null,
26
+ isAuthEnabled: false,
27
+ jwtExpirationTime: undefined,
28
+ jwtRefreshTokenExpiresIn: undefined,
29
+ jwtRefreshSecret: undefined,
30
+ jwtRefreshUseCookie: undefined,
31
+ jwtSecret: undefined,
32
+ routesConfig: {
33
+ defaults: [
34
+ 'GetMany',
35
+ 'GetOne',
36
+ 'CreateMany',
37
+ 'CreateOne',
38
+ 'UpdateMany',
39
+ 'UpdateOne',
40
+ 'ReplaceOne',
41
+ 'DuplicateMany',
42
+ 'DuplicateOne',
43
+ 'DeleteMany',
44
+ 'DeleteOne',
45
+ ],
46
+ excluded: [],
47
+ },
48
+ gatewayOptions: undefined,
49
+ });
50
+ });
51
+ it('should initialize dynamic api module state with custom options', async () => {
52
+ const app = await (0, shared_1.initModule)({
53
+ useGlobalCache: false,
54
+ cacheOptions: {
55
+ excludePaths: ['/fake-path'],
56
+ },
57
+ routesConfig: {
58
+ defaults: ['GetMany', 'GetOne', 'CreateOne', 'UpdateOne', 'DeleteOne'],
59
+ excluded: ['CreateMany', 'UpdateMany', 'DeleteMany'],
60
+ },
61
+ });
62
+ expect(app).toBeDefined();
63
+ expect(src_1.DynamicApiModule.state.get()).toStrictEqual({
64
+ uri,
65
+ initialized: true,
66
+ isGlobalCacheEnabled: false,
67
+ connectionName: 'dynamic-api-connection',
68
+ cacheExcludedPaths: ['/fake-path'],
69
+ credentials: null,
70
+ isAuthEnabled: false,
71
+ jwtExpirationTime: undefined,
72
+ jwtRefreshTokenExpiresIn: undefined,
73
+ jwtRefreshSecret: undefined,
74
+ jwtRefreshUseCookie: undefined,
75
+ jwtSecret: undefined,
76
+ routesConfig: {
77
+ defaults: ['GetMany', 'GetOne', 'CreateOne', 'UpdateOne', 'DeleteOne'],
78
+ excluded: ['CreateMany', 'UpdateMany', 'DeleteMany'],
79
+ },
80
+ gatewayOptions: undefined,
81
+ });
82
+ });
83
+ });
84
+ //# sourceMappingURL=initialization.e2e-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialization.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-root/initialization.e2e-spec.ts"],"names":[],"mappings":";;AAAA,uCAAgC;AAChC,mCAA6C;AAC7C,4CAA+C;AAC/C,yBAAuB;AACvB,sCAAuC;AAEvC,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAErC,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,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAU,EAAC,EAAE,CAAC,CAAC;QAEjC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,sBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,aAAa,CAAC;YACjD,GAAG;YACH,WAAW,EAAE,IAAI;YACjB,oBAAoB,EAAE,IAAI;YAC1B,cAAc,EAAE,wBAAwB;YACxC,kBAAkB,EAAE,EAAE;YACtB,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,KAAK;YACpB,iBAAiB,EAAE,SAAS;YAC5B,wBAAwB,EAAE,SAAS;YACnC,gBAAgB,EAAE,SAAS;YAC3B,mBAAmB,EAAE,SAAS;YAC9B,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE;gBACZ,QAAQ,EAAE;oBACR,SAAS;oBACT,QAAQ;oBACR,YAAY;oBACZ,WAAW;oBACX,YAAY;oBACZ,WAAW;oBACX,YAAY;oBACZ,eAAe;oBACf,cAAc;oBACd,YAAY;oBACZ,WAAW;iBACZ;gBACD,QAAQ,EAAE,EAAE;aACb;YACD,cAAc,EAAE,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAU,EAAC;YAC3B,cAAc,EAAE,KAAK;YACrB,YAAY,EAAE;gBACZ,YAAY,EAAE,CAAC,YAAY,CAAC;aAC7B;YACD,YAAY,EAAE;gBACZ,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;gBACtE,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC;aACrD;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,sBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,aAAa,CAAC;YACjD,GAAG;YACH,WAAW,EAAE,IAAI;YACjB,oBAAoB,EAAE,KAAK;YAC3B,cAAc,EAAE,wBAAwB;YACxC,kBAAkB,EAAE,CAAC,YAAY,CAAC;YAClC,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,KAAK;YACpB,iBAAiB,EAAE,SAAS;YAC5B,wBAAwB,EAAE,SAAS;YACnC,gBAAgB,EAAE,SAAS;YAC3B,mBAAmB,EAAE,SAAS;YAC9B,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE;gBACZ,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;gBACtE,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC;aACrD;YACD,cAAc,EAAE,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ import 'dotenv/config';
@@ -0,0 +1,313 @@
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 Authentication Basic (e2e)', () => {
12
+ const uri = process.env.MONGO_DB_URL;
13
+ beforeEach(() => {
14
+ src_1.DynamicApiModule.state['resetState']();
15
+ });
16
+ afterEach(async () => {
17
+ await (0, e2e_setup_1.closeTestingApp)(mongoose_1.default.connections);
18
+ });
19
+ it('should enable websockets globally', async () => {
20
+ await (0, shared_1.initModule)({
21
+ webSocket: true,
22
+ }, undefined, async (app) => {
23
+ app.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(app));
24
+ }, true);
25
+ expect(src_1.DynamicApiModule.state.get('gatewayOptions')).toStrictEqual({});
26
+ await e2e_setup_1.server.emit('test', { message: 'Hello' });
27
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
28
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith({ message: 'Hello' });
29
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
30
+ });
31
+ describe('Authentication EVENTS', () => {
32
+ describe('useAuth when only userEntity is provided', () => {
33
+ let app;
34
+ beforeEach(async () => {
35
+ app = await (0, shared_1.initModule)({
36
+ useAuth: {
37
+ userEntity: (0, shared_1.createBasicUserEntity)(),
38
+ webSocket: true,
39
+ },
40
+ }, undefined, async (app) => {
41
+ app.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(app));
42
+ });
43
+ });
44
+ describe('EVENT auth-register', () => {
45
+ it('should throw a ws exception if email is missing', async () => {
46
+ await e2e_setup_1.server.emit('auth-register', { username: 'unit-test', password: 'test-2' });
47
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
48
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
49
+ message: ['email property is required'],
50
+ });
51
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
52
+ });
53
+ it('should throw a ws exception if password is missing', async () => {
54
+ await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', pass: 'test-2' });
55
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
56
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
57
+ message: ['password property is required'],
58
+ });
59
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
60
+ });
61
+ it('should create a new user and return access token', async () => {
62
+ await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'test' });
63
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
64
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
65
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith({ accessToken: expect.any(String), refreshToken: expect.any(String) });
66
+ });
67
+ });
68
+ describe('EVENT auth-login', () => {
69
+ it('should throw a ws exception if email is missing', async () => {
70
+ await e2e_setup_1.server.emit('auth-login', { password: 'test-2' });
71
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
72
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
73
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
74
+ message: 'Unauthorized',
75
+ });
76
+ });
77
+ it('should throw a ws exception if password is missing', async () => {
78
+ await e2e_setup_1.server.emit('auth-login', { email: 'unit@test.co' });
79
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
80
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
81
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
82
+ message: 'Unauthorized',
83
+ });
84
+ });
85
+ it('should return access token', async () => {
86
+ await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'test' });
87
+ await e2e_setup_1.server.emit('auth-login', { email: 'unit@test.co', password: 'test' });
88
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
89
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(2);
90
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenNthCalledWith(2, { accessToken: expect.any(String), refreshToken: expect.any(String) });
91
+ });
92
+ });
93
+ describe('EVENT auth-get-account', () => {
94
+ it('should throw a ws exception if access token is missing', async () => {
95
+ await e2e_setup_1.server.emit('auth-get-account');
96
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
97
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
98
+ message: 'Unauthorized',
99
+ });
100
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
101
+ });
102
+ it('should return user account', async () => {
103
+ const { accessToken } = await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'test' });
104
+ await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken });
105
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
106
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(2);
107
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenNthCalledWith(1, { accessToken: expect.any(String), refreshToken: expect.any(String) });
108
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenNthCalledWith(2, { email: 'unit@test.co', id: expect.any(String) });
109
+ });
110
+ });
111
+ describe('EVENT auth-refresh-token', () => {
112
+ it('should throw a ws exception if refresh token is missing', async () => {
113
+ await e2e_setup_1.server.emit('auth-refresh-token');
114
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
115
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({ message: 'Unauthorized' });
116
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
117
+ });
118
+ it('should return new tokens using refresh token', async () => {
119
+ const { refreshToken } = await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'test' });
120
+ e2e_setup_1.handleSocketResponse.mockReset();
121
+ await e2e_setup_1.server.emit('auth-refresh-token', undefined, { refreshToken });
122
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
123
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
124
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith({ accessToken: expect.any(String), refreshToken: expect.any(String) });
125
+ });
126
+ });
127
+ it('should throw a ws exception when receiving reset password event if reset password options are not configured', async () => {
128
+ await e2e_setup_1.server.emit('auth-reset-password', { email: 'toto@test.co' });
129
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
130
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
131
+ message: 'This feature is not available',
132
+ });
133
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
134
+ });
135
+ it('should throw a ws exception when receiving change password event if reset password options are not configured', async () => {
136
+ await e2e_setup_1.server.emit('auth-change-password', { newPassword: 'test' });
137
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
138
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
139
+ message: 'This feature is not available',
140
+ });
141
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
142
+ });
143
+ });
144
+ describe('useAuth with jwt options', () => {
145
+ let jwtService;
146
+ let accessToken;
147
+ let app;
148
+ beforeEach(async () => {
149
+ app = await (0, shared_1.initModule)({
150
+ useAuth: {
151
+ userEntity: (0, shared_1.createBasicUserEntity)(),
152
+ webSocket: true,
153
+ jwt: {
154
+ secret: 'test-secret',
155
+ expiresIn: '3s',
156
+ },
157
+ },
158
+ }, undefined, async (_) => {
159
+ _.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(_));
160
+ });
161
+ jwtService = app.get(jwt_1.JwtService);
162
+ const { accessToken: token } = await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'test' });
163
+ accessToken = token;
164
+ });
165
+ it('should initialize state and authentication EVENTS with jwt options', async () => {
166
+ expect(app).toBeDefined();
167
+ expect(src_1.DynamicApiModule.state.get()).toStrictEqual({
168
+ uri,
169
+ initialized: true,
170
+ isGlobalCacheEnabled: true,
171
+ connectionName: 'dynamic-api-connection',
172
+ cacheExcludedPaths: [],
173
+ credentials: {
174
+ loginField: 'email',
175
+ passwordField: 'password',
176
+ },
177
+ isAuthEnabled: true,
178
+ jwtExpirationTime: '3s',
179
+ jwtRefreshTokenExpiresIn: '7d',
180
+ jwtRefreshSecret: undefined,
181
+ jwtRefreshUseCookie: false,
182
+ jwtSecret: 'test-secret',
183
+ routesConfig: {
184
+ defaults: [
185
+ 'GetMany',
186
+ 'GetOne',
187
+ 'CreateMany',
188
+ 'CreateOne',
189
+ 'UpdateMany',
190
+ 'UpdateOne',
191
+ 'ReplaceOne',
192
+ 'DuplicateMany',
193
+ 'DuplicateOne',
194
+ 'DeleteMany',
195
+ 'DeleteOne',
196
+ ],
197
+ excluded: [],
198
+ },
199
+ gatewayOptions: undefined,
200
+ });
201
+ });
202
+ it('should throw a ws exception if access token is expired', async () => {
203
+ e2e_setup_1.handleSocketResponse.mockReset();
204
+ await (0, utils_1.wait)(4000);
205
+ await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken });
206
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
207
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
208
+ message: 'Unauthorized',
209
+ });
210
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
211
+ });
212
+ it('should throw a ws exception if secret is invalid', async () => {
213
+ e2e_setup_1.handleSocketResponse.mockReset();
214
+ const invalidToken = jwtService.sign({ email: 'u', password: 'p' }, { secret: 'invalid-secret' });
215
+ await e2e_setup_1.server.emit('auth-get-account', undefined, { accessToken: invalidToken });
216
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
217
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
218
+ message: 'Unauthorized',
219
+ });
220
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
221
+ });
222
+ });
223
+ describe('useAuth with validation options', () => {
224
+ let app;
225
+ beforeEach(async () => {
226
+ app = await (0, shared_1.initModule)({
227
+ useAuth: {
228
+ userEntity: (0, shared_1.createValidatedUserEntity)(),
229
+ validationPipeOptions: {
230
+ whitelist: true,
231
+ forbidNonWhitelisted: true,
232
+ transform: true,
233
+ },
234
+ },
235
+ webSocket: true,
236
+ }, undefined, async (_) => {
237
+ _.useWebSocketAdapter(new socket_adapter_1.SocketAdapter(_));
238
+ });
239
+ e2e_setup_1.handleSocketResponse.mockReset();
240
+ });
241
+ describe('EVENT auth-register', () => {
242
+ it('should throw a ws exception if payload contains non whitelisted property', async () => {
243
+ await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'Test-2', role: 'ADMIN' });
244
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
245
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
246
+ message: ['property role should not exist'],
247
+ });
248
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
249
+ });
250
+ it('should throw a ws exception if validation fails', async () => {
251
+ await e2e_setup_1.server.emit('auth-register', { email: 'unit.test.co', password: 'test-2' });
252
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
253
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
254
+ message: [
255
+ 'email must be an email',
256
+ 'password is not strong enough',
257
+ ],
258
+ });
259
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
260
+ });
261
+ it('should create a new user and emit access token if the validation was successful', async () => {
262
+ await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'Test-2' });
263
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
264
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
265
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith({
266
+ accessToken: expect.any(String),
267
+ refreshToken: expect.any(String),
268
+ });
269
+ });
270
+ });
271
+ describe('EVENT auth-login', () => {
272
+ beforeEach(async () => {
273
+ await e2e_setup_1.server.emit('auth-register', { email: 'unit@test.co', password: 'Test-2' });
274
+ e2e_setup_1.handleSocketResponse.mockReset();
275
+ });
276
+ it('should throw a ws exception if payload contains non whitelisted property', async () => {
277
+ await e2e_setup_1.server.emit('auth-login', { email: 'unit@test.co', password: 'Test-2', role: 'ADMIN' });
278
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
279
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
280
+ message: ['property role should not exist'],
281
+ });
282
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
283
+ });
284
+ it('should throw a ws exception if email is missing', async () => {
285
+ await e2e_setup_1.server.emit('auth-login', { password: 'Test-2' });
286
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
287
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
288
+ message: ['email must be an email'],
289
+ });
290
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
291
+ });
292
+ it('should throw a ws exception if password is missing', async () => {
293
+ await e2e_setup_1.server.emit('auth-login', { email: 'unit@test.co' });
294
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledTimes(1);
295
+ expect(e2e_setup_1.handleSocketException).toHaveBeenCalledWith({
296
+ message: ['password is not strong enough'],
297
+ });
298
+ expect(e2e_setup_1.handleSocketResponse).not.toHaveBeenCalled();
299
+ });
300
+ it('should emit access token if the validation was successful', async () => {
301
+ await e2e_setup_1.server.emit('auth-login', { email: 'unit@test.co', password: 'Test-2' });
302
+ expect(e2e_setup_1.handleSocketException).not.toHaveBeenCalled();
303
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledTimes(1);
304
+ expect(e2e_setup_1.handleSocketResponse).toHaveBeenCalledWith({
305
+ accessToken: expect.any(String),
306
+ refreshToken: expect.any(String),
307
+ });
308
+ });
309
+ });
310
+ });
311
+ });
312
+ });
313
+ //# sourceMappingURL=websockets-auth-basic.e2e-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websockets-auth-basic.e2e-spec.js","sourceRoot":"","sources":["../../../libs/dynamic-api/test/for-root/websockets-auth-basic.e2e-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import 'dotenv/config';