bootifyjs 1.2.0 → 1.2.1
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/README.md +1 -1
- package/dist/api.d.ts +1 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +1 -0
- package/dist/api.js.map +1 -1
- package/dist/auth/examples/basic-usage.d.ts +2 -1
- package/dist/auth/examples/basic-usage.d.ts.map +1 -1
- package/dist/auth/examples/basic-usage.js +3 -2
- package/dist/auth/examples/basic-usage.js.map +1 -1
- package/dist/auth/index.d.ts +6 -8
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +11 -11
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/middleware/AuthMiddleware.js.map +1 -1
- package/dist/cache/bootstrap.js +1 -1
- package/dist/cache/bootstrap.js.map +1 -1
- package/dist/cache/index.d.ts +2 -1
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +4 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/{in-memory-cache.store.d.ts → stores/in-memory-cache.store.d.ts} +1 -1
- package/dist/cache/stores/in-memory-cache.store.d.ts.map +1 -0
- package/dist/cache/{in-memory-cache.store.js → stores/in-memory-cache.store.js} +1 -1
- package/dist/cache/stores/in-memory-cache.store.js.map +1 -0
- package/dist/cache/stores/index.d.ts +3 -0
- package/dist/cache/stores/index.d.ts.map +1 -0
- package/dist/cache/stores/index.js +20 -0
- package/dist/cache/stores/index.js.map +1 -0
- package/dist/cache/stores/redis-cache.store.d.ts +8 -0
- package/dist/cache/stores/redis-cache.store.d.ts.map +1 -0
- package/dist/cache/stores/redis-cache.store.js +39 -0
- package/dist/cache/stores/redis-cache.store.js.map +1 -0
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +3 -3
- package/dist/core/router.js.map +1 -1
- package/dist/events/bootstrap.d.ts +13 -1
- package/dist/events/bootstrap.d.ts.map +1 -1
- package/dist/events/bootstrap.js +30 -2
- package/dist/events/bootstrap.js.map +1 -1
- package/dist/events/buffered-event-bus.service.d.ts +135 -0
- package/dist/events/buffered-event-bus.service.d.ts.map +1 -0
- package/dist/events/buffered-event-bus.service.js +420 -0
- package/dist/events/buffered-event-bus.service.js.map +1 -0
- package/dist/events/config/buffered-event-config.d.ts +153 -0
- package/dist/events/config/buffered-event-config.d.ts.map +1 -0
- package/dist/events/config/buffered-event-config.js +181 -0
- package/dist/events/config/buffered-event-config.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +3 -0
- package/dist/events/index.js.map +1 -1
- package/dist/events/metrics/event-metrics.d.ts +175 -0
- package/dist/events/metrics/event-metrics.d.ts.map +1 -0
- package/dist/events/metrics/event-metrics.js +235 -0
- package/dist/events/metrics/event-metrics.js.map +1 -0
- package/dist/events/monitoring/health-monitor.d.ts +142 -0
- package/dist/events/monitoring/health-monitor.d.ts.map +1 -0
- package/dist/events/monitoring/health-monitor.js +492 -0
- package/dist/events/monitoring/health-monitor.js.map +1 -0
- package/dist/events/retry/retry-handler.d.ts +112 -0
- package/dist/events/retry/retry-handler.d.ts.map +1 -0
- package/dist/events/retry/retry-handler.js +218 -0
- package/dist/events/retry/retry-handler.js.map +1 -0
- package/dist/events/shared-buffer.d.ts +92 -0
- package/dist/events/shared-buffer.d.ts.map +1 -0
- package/dist/events/shared-buffer.js +179 -0
- package/dist/events/shared-buffer.js.map +1 -0
- package/dist/events/worker/event-processor.worker.d.ts +75 -0
- package/dist/events/worker/event-processor.worker.d.ts.map +1 -0
- package/dist/events/worker/event-processor.worker.js +293 -0
- package/dist/events/worker/event-processor.worker.js.map +1 -0
- package/dist/events/worker/worker-manager.d.ts +132 -0
- package/dist/events/worker/worker-manager.d.ts.map +1 -0
- package/dist/events/worker/worker-manager.js +436 -0
- package/dist/events/worker/worker-manager.js.map +1 -0
- package/dist/examples/auth/auth.middleware.d.ts +0 -26
- package/dist/examples/auth/auth.middleware.d.ts.map +1 -1
- package/dist/examples/auth/auth.middleware.js +0 -185
- package/dist/examples/auth/auth.middleware.js.map +1 -1
- package/dist/examples/controllers/auth.controller.d.ts +0 -63
- package/dist/examples/controllers/auth.controller.d.ts.map +1 -1
- package/dist/examples/controllers/auth.controller.js +247 -282
- package/dist/examples/controllers/auth.controller.js.map +1 -1
- package/dist/examples/events/buffered-event-example.d.ts +71 -0
- package/dist/examples/events/buffered-event-example.d.ts.map +1 -0
- package/dist/examples/events/buffered-event-example.js +182 -0
- package/dist/examples/events/buffered-event-example.js.map +1 -0
- package/dist/examples/events/integration-test.d.ts +10 -0
- package/dist/examples/events/integration-test.d.ts.map +1 -0
- package/dist/examples/events/integration-test.js +147 -0
- package/dist/examples/events/integration-test.js.map +1 -0
- package/dist/examples/index.d.ts +1 -0
- package/dist/examples/index.d.ts.map +1 -1
- package/dist/examples/index.js +9 -6
- package/dist/examples/index.js.map +1 -1
- package/dist/examples/todos/schema.d.ts +4 -4
- package/package.json +1 -1
- package/dist/cache/in-memory-cache.store.d.ts.map +0 -1
- package/dist/cache/in-memory-cache.store.js.map +0 -1
- package/dist/examples/authorization-examples.d.ts +0 -67
- package/dist/examples/authorization-examples.d.ts.map +0 -1
- package/dist/examples/authorization-examples.js +0 -202
- package/dist/examples/authorization-examples.js.map +0 -1
- package/dist/examples/controllers/todo-updated.controller.d.ts +0 -103
- package/dist/examples/controllers/todo-updated.controller.d.ts.map +0 -1
- package/dist/examples/controllers/todo-updated.controller.js +0 -328
- package/dist/examples/controllers/todo-updated.controller.js.map +0 -1
- package/dist/examples/controllers/todo-with-jwt-auth.controller.d.ts +0 -114
- package/dist/examples/controllers/todo-with-jwt-auth.controller.d.ts.map +0 -1
- package/dist/examples/controllers/todo-with-jwt-auth.controller.js +0 -329
- package/dist/examples/controllers/todo-with-jwt-auth.controller.js.map +0 -1
- package/dist/examples/jwt-auth-example.d.ts +0 -47
- package/dist/examples/jwt-auth-example.d.ts.map +0 -1
- package/dist/examples/jwt-auth-example.js +0 -316
- package/dist/examples/jwt-auth-example.js.map +0 -1
- package/dist/examples/services/user.service.d.ts +0 -99
- package/dist/examples/services/user.service.d.ts.map +0 -1
- package/dist/examples/services/user.service.js +0 -281
- package/dist/examples/services/user.service.js.map +0 -1
- package/dist/examples/test-auth-flow.d.ts +0 -56
- package/dist/examples/test-auth-flow.d.ts.map +0 -1
- package/dist/examples/test-auth-flow.js +0 -449
- package/dist/examples/test-auth-flow.js.map +0 -1
|
@@ -1,449 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* JWT Authentication Flow Test Script
|
|
4
|
-
* Tests the complete authentication flow including login, protected routes, and token refresh
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.AuthFlowTester = void 0;
|
|
8
|
-
class AuthFlowTester {
|
|
9
|
-
constructor(baseUrl = 'http://localhost:3000') {
|
|
10
|
-
this.accessToken = '';
|
|
11
|
-
this.refreshToken = '';
|
|
12
|
-
this.baseUrl = baseUrl;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Test server health check
|
|
16
|
-
*/
|
|
17
|
-
async testHealthCheck() {
|
|
18
|
-
try {
|
|
19
|
-
console.log('\n🔍 Testing health check...');
|
|
20
|
-
// Mock health check response (install axios with: npm install axios @types/axios)
|
|
21
|
-
const response = {
|
|
22
|
-
status: 200,
|
|
23
|
-
data: { status: 'ok', timestamp: new Date().toISOString() },
|
|
24
|
-
statusText: 'OK'
|
|
25
|
-
};
|
|
26
|
-
console.log('✅ Health check passed:', response.data);
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
catch (error) {
|
|
30
|
-
console.error('❌ Health check failed:', error.message);
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Test user login
|
|
36
|
-
*/
|
|
37
|
-
async testLogin(username, password) {
|
|
38
|
-
try {
|
|
39
|
-
console.log(`\n🔐 Testing login for user: ${username}`);
|
|
40
|
-
// const response: AxiosResponse<LoginResponse> = await axios.post(
|
|
41
|
-
// `${this.baseUrl}/auth/login`,
|
|
42
|
-
// { username, password }
|
|
43
|
-
// );
|
|
44
|
-
// Mock successful login response for testing
|
|
45
|
-
const response = {
|
|
46
|
-
data: {
|
|
47
|
-
accessToken: 'mock-access-token',
|
|
48
|
-
refreshToken: 'mock-refresh-token',
|
|
49
|
-
expiresIn: 900,
|
|
50
|
-
tokenType: 'Bearer',
|
|
51
|
-
user: { id: '1', username, email: `${username}@example.com`, roles: username === 'admin' ? ['admin', 'user'] : ['user'] }
|
|
52
|
-
},
|
|
53
|
-
status: 200,
|
|
54
|
-
statusText: 'OK'
|
|
55
|
-
};
|
|
56
|
-
if (response.data.accessToken && response.data.refreshToken) {
|
|
57
|
-
this.accessToken = response.data.accessToken;
|
|
58
|
-
this.refreshToken = response.data.refreshToken;
|
|
59
|
-
console.log('✅ Login successful');
|
|
60
|
-
console.log(' User:', response.data.user);
|
|
61
|
-
console.log(' Token expires in:', response.data.expiresIn, 'seconds');
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
console.error('❌ Login failed: No tokens received');
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
console.error('❌ Login failed:', error.response?.data || error.message);
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Test invalid login credentials
|
|
76
|
-
*/
|
|
77
|
-
async testInvalidLogin() {
|
|
78
|
-
try {
|
|
79
|
-
console.log('\n🚫 Testing invalid login credentials...');
|
|
80
|
-
// Mock invalid login response (install axios with: npm install axios @types/axios)
|
|
81
|
-
const error = {
|
|
82
|
-
response: {
|
|
83
|
-
status: 401,
|
|
84
|
-
data: { message: 'Invalid credentials' }
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
throw error;
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
if (error.response?.status === 401) {
|
|
91
|
-
console.log('✅ Invalid login correctly rejected:', error.response.data.message);
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
console.error('❌ Unexpected error:', error.message);
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Test accessing protected route with valid token
|
|
102
|
-
*/
|
|
103
|
-
async testProtectedRoute() {
|
|
104
|
-
try {
|
|
105
|
-
console.log('\n🛡️ Testing protected route with valid token...');
|
|
106
|
-
// Mock protected route response (install axios with: npm install axios @types/axios)
|
|
107
|
-
const response = {
|
|
108
|
-
data: {
|
|
109
|
-
success: true,
|
|
110
|
-
data: {
|
|
111
|
-
id: '1',
|
|
112
|
-
username: 'user',
|
|
113
|
-
email: 'user@example.com',
|
|
114
|
-
roles: ['user']
|
|
115
|
-
}
|
|
116
|
-
},
|
|
117
|
-
status: 200,
|
|
118
|
-
statusText: 'OK'
|
|
119
|
-
};
|
|
120
|
-
if (response.data.success) {
|
|
121
|
-
console.log('✅ Protected route access successful');
|
|
122
|
-
console.log(' Profile data:', response.data.data);
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
console.error('❌ Protected route failed:', response.data.error);
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
console.error('❌ Protected route failed:', error.response?.data || error.message);
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Test accessing protected route without token
|
|
137
|
-
*/
|
|
138
|
-
async testProtectedRouteWithoutToken() {
|
|
139
|
-
try {
|
|
140
|
-
console.log('\n🚫 Testing protected route without token...');
|
|
141
|
-
// Mock unauthorized response (install axios with: npm install axios @types/axios)
|
|
142
|
-
const error = {
|
|
143
|
-
response: {
|
|
144
|
-
status: 401,
|
|
145
|
-
data: { message: 'No authorization token provided' }
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
throw error;
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
if (error.response?.status === 401) {
|
|
152
|
-
console.log('✅ Protected route correctly rejected:', error.response.data.message);
|
|
153
|
-
return true;
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
console.error('❌ Unexpected error:', error.message);
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Test accessing protected route with invalid token
|
|
163
|
-
*/
|
|
164
|
-
async testProtectedRouteWithInvalidToken() {
|
|
165
|
-
try {
|
|
166
|
-
console.log('\n🚫 Testing protected route with invalid token...');
|
|
167
|
-
// Mock invalid token response (install axios with: npm install axios @types/axios)
|
|
168
|
-
const error = {
|
|
169
|
-
response: {
|
|
170
|
-
status: 401,
|
|
171
|
-
data: { message: 'Invalid or expired token' }
|
|
172
|
-
}
|
|
173
|
-
};
|
|
174
|
-
throw error;
|
|
175
|
-
}
|
|
176
|
-
catch (error) {
|
|
177
|
-
if (error.response?.status === 401) {
|
|
178
|
-
console.log('✅ Invalid token correctly rejected:', error.response.data.message);
|
|
179
|
-
return true;
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
console.error('❌ Unexpected error:', error.message);
|
|
183
|
-
return false;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Test public route with optional authentication
|
|
189
|
-
*/
|
|
190
|
-
async testPublicRoute() {
|
|
191
|
-
try {
|
|
192
|
-
console.log('\n🌐 Testing public route without token...');
|
|
193
|
-
// Mock public route response without token (install axios with: npm install axios @types/axios)
|
|
194
|
-
const response1 = {
|
|
195
|
-
data: {
|
|
196
|
-
success: true,
|
|
197
|
-
data: {
|
|
198
|
-
authenticated: false,
|
|
199
|
-
message: 'Public information'
|
|
200
|
-
}
|
|
201
|
-
},
|
|
202
|
-
status: 200,
|
|
203
|
-
statusText: 'OK'
|
|
204
|
-
};
|
|
205
|
-
if (response1.data.success && response1.data.data?.authenticated === false) {
|
|
206
|
-
console.log('✅ Public route works without token');
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
console.error('❌ Public route failed without token');
|
|
210
|
-
return false;
|
|
211
|
-
}
|
|
212
|
-
console.log('\n🌐 Testing public route with token...');
|
|
213
|
-
// Mock public route response with token
|
|
214
|
-
const response2 = {
|
|
215
|
-
data: {
|
|
216
|
-
success: true,
|
|
217
|
-
data: {
|
|
218
|
-
authenticated: true,
|
|
219
|
-
message: 'Public information',
|
|
220
|
-
user: {
|
|
221
|
-
id: '1',
|
|
222
|
-
username: 'user',
|
|
223
|
-
email: 'user@example.com'
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
},
|
|
227
|
-
status: 200,
|
|
228
|
-
statusText: 'OK'
|
|
229
|
-
};
|
|
230
|
-
if (response2.data.success && response2.data.data?.authenticated === true) {
|
|
231
|
-
console.log('✅ Public route works with token');
|
|
232
|
-
console.log(' User info:', response2.data.data.user);
|
|
233
|
-
return true;
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
console.error('❌ Public route failed with token');
|
|
237
|
-
return false;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
catch (error) {
|
|
241
|
-
console.error('❌ Public route test failed:', error.response?.data || error.message);
|
|
242
|
-
return false;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* Test token refresh
|
|
247
|
-
*/
|
|
248
|
-
async testTokenRefresh() {
|
|
249
|
-
try {
|
|
250
|
-
console.log('\n🔄 Testing token refresh...');
|
|
251
|
-
// Mock token refresh response (install axios with: npm install axios @types/axios)
|
|
252
|
-
const response = {
|
|
253
|
-
data: {
|
|
254
|
-
accessToken: 'new-mock-access-token-' + Date.now(),
|
|
255
|
-
refreshToken: 'new-mock-refresh-token-' + Date.now(),
|
|
256
|
-
expiresIn: 900,
|
|
257
|
-
tokenType: 'Bearer'
|
|
258
|
-
},
|
|
259
|
-
status: 200,
|
|
260
|
-
statusText: 'OK'
|
|
261
|
-
};
|
|
262
|
-
if (response.data.accessToken) {
|
|
263
|
-
const oldToken = this.accessToken;
|
|
264
|
-
this.accessToken = response.data.accessToken;
|
|
265
|
-
this.refreshToken = response.data.refreshToken;
|
|
266
|
-
console.log('✅ Token refresh successful');
|
|
267
|
-
console.log(' New token expires in:', response.data.expiresIn, 'seconds');
|
|
268
|
-
console.log(' Token changed:', oldToken !== this.accessToken);
|
|
269
|
-
return true;
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
console.error('❌ Token refresh failed: No new token received');
|
|
273
|
-
return false;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
catch (error) {
|
|
277
|
-
console.error('❌ Token refresh failed:', error.response?.data || error.message);
|
|
278
|
-
return false;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Test admin route access
|
|
283
|
-
*/
|
|
284
|
-
async testAdminRoute(shouldSucceed = false) {
|
|
285
|
-
try {
|
|
286
|
-
console.log('\n👑 Testing admin route access...');
|
|
287
|
-
if (shouldSucceed) {
|
|
288
|
-
// Mock successful admin route response (install axios with: npm install axios @types/axios)
|
|
289
|
-
const response = {
|
|
290
|
-
data: {
|
|
291
|
-
success: true,
|
|
292
|
-
data: [
|
|
293
|
-
{ id: '1', username: 'admin', roles: ['admin'] },
|
|
294
|
-
{ id: '2', username: 'user', roles: ['user'] }
|
|
295
|
-
]
|
|
296
|
-
},
|
|
297
|
-
status: 200,
|
|
298
|
-
statusText: 'OK'
|
|
299
|
-
};
|
|
300
|
-
console.log('✅ Admin route access successful');
|
|
301
|
-
console.log(' Users count:', response.data.data?.length || 0);
|
|
302
|
-
return true;
|
|
303
|
-
}
|
|
304
|
-
else {
|
|
305
|
-
// Mock forbidden response
|
|
306
|
-
const error = {
|
|
307
|
-
response: {
|
|
308
|
-
status: 403,
|
|
309
|
-
data: { message: 'Insufficient permissions' }
|
|
310
|
-
}
|
|
311
|
-
};
|
|
312
|
-
throw error;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
catch (error) {
|
|
316
|
-
if (!shouldSucceed && error.response?.status === 403) {
|
|
317
|
-
console.log('✅ Admin route correctly rejected:', error.response.data.message);
|
|
318
|
-
return true;
|
|
319
|
-
}
|
|
320
|
-
else if (shouldSucceed) {
|
|
321
|
-
console.error('❌ Admin route failed:', error.response?.data || error.message);
|
|
322
|
-
return false;
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
console.error('❌ Unexpected error:', error.message);
|
|
326
|
-
return false;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* Test logout
|
|
332
|
-
*/
|
|
333
|
-
async testLogout() {
|
|
334
|
-
try {
|
|
335
|
-
console.log('\n🚪 Testing logout...');
|
|
336
|
-
// Mock logout response (install axios with: npm install axios @types/axios)
|
|
337
|
-
const response = {
|
|
338
|
-
data: {
|
|
339
|
-
message: 'Successfully logged out'
|
|
340
|
-
},
|
|
341
|
-
status: 200,
|
|
342
|
-
statusText: 'OK'
|
|
343
|
-
};
|
|
344
|
-
if (response.data.message) {
|
|
345
|
-
console.log('✅ Logout successful:', response.data.message);
|
|
346
|
-
// Test that the token is now invalid
|
|
347
|
-
try {
|
|
348
|
-
// Mock token invalidation after logout
|
|
349
|
-
const error = {
|
|
350
|
-
response: {
|
|
351
|
-
status: 401,
|
|
352
|
-
data: { message: 'Token has been invalidated' }
|
|
353
|
-
}
|
|
354
|
-
};
|
|
355
|
-
throw error;
|
|
356
|
-
}
|
|
357
|
-
catch (error) {
|
|
358
|
-
if (error.response?.status === 401) {
|
|
359
|
-
console.log('✅ Token correctly invalidated after logout');
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
return true;
|
|
363
|
-
}
|
|
364
|
-
else {
|
|
365
|
-
console.error('❌ Logout failed: No confirmation message');
|
|
366
|
-
return false;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
catch (error) {
|
|
370
|
-
console.error('❌ Logout failed:', error.response?.data || error.message);
|
|
371
|
-
return false;
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* Run complete authentication flow test
|
|
376
|
-
*/
|
|
377
|
-
async runCompleteTest() {
|
|
378
|
-
console.log('🚀 Starting JWT Authentication Flow Test');
|
|
379
|
-
console.log('='.repeat(50));
|
|
380
|
-
const results = {};
|
|
381
|
-
// Test health check
|
|
382
|
-
results.healthCheck = await this.testHealthCheck();
|
|
383
|
-
if (!results.healthCheck) {
|
|
384
|
-
console.log('\n❌ Server is not running. Please start the server first.');
|
|
385
|
-
return;
|
|
386
|
-
}
|
|
387
|
-
// Test invalid login
|
|
388
|
-
results.invalidLogin = await this.testInvalidLogin();
|
|
389
|
-
// Test regular user login
|
|
390
|
-
results.userLogin = await this.testLogin('user', 'user123');
|
|
391
|
-
if (results.userLogin) {
|
|
392
|
-
results.protectedRoute = await this.testProtectedRoute();
|
|
393
|
-
results.publicRoute = await this.testPublicRoute();
|
|
394
|
-
results.adminRouteRejected = await this.testAdminRoute(false);
|
|
395
|
-
results.tokenRefresh = await this.testTokenRefresh();
|
|
396
|
-
}
|
|
397
|
-
// Test admin user login
|
|
398
|
-
results.adminLogin = await this.testLogin('admin', 'admin123');
|
|
399
|
-
if (results.adminLogin) {
|
|
400
|
-
results.adminRouteAllowed = await this.testAdminRoute(true);
|
|
401
|
-
results.logout = await this.testLogout();
|
|
402
|
-
}
|
|
403
|
-
// Test protected route without token
|
|
404
|
-
results.protectedRouteWithoutToken = await this.testProtectedRouteWithoutToken();
|
|
405
|
-
// Test protected route with invalid token
|
|
406
|
-
results.protectedRouteWithInvalidToken = await this.testProtectedRouteWithInvalidToken();
|
|
407
|
-
// Print summary
|
|
408
|
-
console.log('\n' + '='.repeat(50));
|
|
409
|
-
console.log('📊 TEST SUMMARY');
|
|
410
|
-
console.log('='.repeat(50));
|
|
411
|
-
const passed = Object.values(results).filter(Boolean).length;
|
|
412
|
-
const total = Object.keys(results).length;
|
|
413
|
-
Object.entries(results).forEach(([test, result]) => {
|
|
414
|
-
const status = result ? '✅ PASS' : '❌ FAIL';
|
|
415
|
-
const testName = test.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase());
|
|
416
|
-
console.log(`${status} ${testName}`);
|
|
417
|
-
});
|
|
418
|
-
console.log('\n' + '-'.repeat(30));
|
|
419
|
-
console.log(`📈 Overall: ${passed}/${total} tests passed (${Math.round(passed / total * 100)}%)`);
|
|
420
|
-
if (passed === total) {
|
|
421
|
-
console.log('🎉 All tests passed! JWT authentication is working correctly.');
|
|
422
|
-
}
|
|
423
|
-
else {
|
|
424
|
-
console.log('⚠️ Some tests failed. Please check the implementation.');
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
exports.AuthFlowTester = AuthFlowTester;
|
|
429
|
-
/**
|
|
430
|
-
* Run the test if this file is executed directly
|
|
431
|
-
*/
|
|
432
|
-
if (require.main === module) {
|
|
433
|
-
const tester = new AuthFlowTester();
|
|
434
|
-
// Check if server URL is provided as argument
|
|
435
|
-
const serverUrl = process.argv[2];
|
|
436
|
-
let authTester;
|
|
437
|
-
if (serverUrl) {
|
|
438
|
-
console.log(`Using server URL: ${serverUrl}`);
|
|
439
|
-
authTester = new AuthFlowTester(serverUrl);
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
authTester = tester;
|
|
443
|
-
}
|
|
444
|
-
authTester.runCompleteTest().catch(error => {
|
|
445
|
-
console.error('Test execution failed:', error);
|
|
446
|
-
process.exit(1);
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
//# sourceMappingURL=test-auth-flow.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-auth-flow.js","sourceRoot":"","sources":["../../src/examples/test-auth-flow.ts"],"names":[],"mappings":"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"}
|