@atlashub/smartstack-cli 1.4.0 → 1.5.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.
- package/.documentation/agents.html +8 -4
- package/.documentation/apex.html +8 -4
- package/.documentation/business-analyse.html +833 -406
- package/.documentation/commands.html +8 -4
- package/.documentation/css/styles.css +153 -15
- package/.documentation/efcore.html +8 -4
- package/.documentation/gitflow.html +795 -230
- package/.documentation/hooks.html +8 -4
- package/.documentation/index.html +13 -9
- package/.documentation/installation.html +23 -19
- package/.documentation/ralph-loop.html +530 -0
- package/.documentation/test-web.html +8 -4
- package/README.md +52 -10
- package/dist/index.js +813 -283
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/agents/efcore/conflicts.md +44 -17
- package/templates/agents/efcore/db-status.md +27 -6
- package/templates/agents/efcore/scan.md +43 -13
- package/templates/commands/ai-prompt.md +315 -315
- package/templates/commands/application/create.md +362 -362
- package/templates/commands/controller/create.md +216 -216
- package/templates/commands/controller.md +59 -0
- package/templates/commands/create/agent.md +138 -0
- package/templates/commands/create/command.md +166 -0
- package/templates/commands/create/hook.md +234 -0
- package/templates/commands/create/plugin.md +329 -0
- package/templates/commands/create/project.md +507 -0
- package/templates/commands/create/skill.md +199 -0
- package/templates/commands/create.md +220 -0
- package/templates/commands/documentation/module.md +202 -202
- package/templates/commands/efcore/_env-check.md +153 -153
- package/templates/commands/efcore/conflicts.md +109 -192
- package/templates/commands/efcore/db-status.md +101 -89
- package/templates/commands/efcore/migration.md +23 -11
- package/templates/commands/efcore/scan.md +115 -119
- package/templates/commands/efcore.md +54 -6
- package/templates/commands/feature-full.md +267 -267
- package/templates/commands/gitflow/11-finish.md +145 -11
- package/templates/commands/gitflow/13-sync.md +216 -216
- package/templates/commands/gitflow/14-rebase.md +251 -251
- package/templates/commands/gitflow/2-status.md +120 -10
- package/templates/commands/gitflow/3-commit.md +150 -0
- package/templates/commands/gitflow/7-pull-request.md +134 -5
- package/templates/commands/gitflow/9-merge.md +142 -1
- package/templates/commands/implement.md +663 -663
- package/templates/commands/init.md +562 -0
- package/templates/commands/mcp-integration.md +330 -0
- package/templates/commands/notification.md +129 -129
- package/templates/commands/validate.md +233 -0
- package/templates/commands/workflow.md +193 -193
- package/templates/skills/ai-prompt/SKILL.md +778 -778
- package/templates/skills/application/SKILL.md +563 -563
- package/templates/skills/application/templates-backend.md +450 -450
- package/templates/skills/application/templates-frontend.md +531 -531
- package/templates/skills/application/templates-i18n.md +520 -520
- package/templates/skills/application/templates-seed.md +647 -647
- package/templates/skills/controller/SKILL.md +240 -240
- package/templates/skills/controller/postman-templates.md +614 -614
- package/templates/skills/controller/templates.md +1468 -1468
- package/templates/skills/documentation/SKILL.md +133 -133
- package/templates/skills/documentation/templates.md +476 -476
- package/templates/skills/feature-full/SKILL.md +838 -838
- package/templates/skills/notification/SKILL.md +555 -555
- package/templates/skills/ui-components/SKILL.md +870 -870
- package/templates/skills/workflow/SKILL.md +582 -582
|
@@ -1,614 +1,614 @@
|
|
|
1
|
-
# Templates Postman SmartStack
|
|
2
|
-
|
|
3
|
-
> **Note:** Ces templates sont utilisés pour générer automatiquement les tests Postman
|
|
4
|
-
> après la création d'un controller.
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Structure Collection Postman
|
|
9
|
-
|
|
10
|
-
```json
|
|
11
|
-
{
|
|
12
|
-
"name": "{Module} API",
|
|
13
|
-
"item": [
|
|
14
|
-
// Tests GET list
|
|
15
|
-
// Tests GET single
|
|
16
|
-
// Tests POST create
|
|
17
|
-
// Tests PUT update
|
|
18
|
-
// Tests PATCH activate/deactivate
|
|
19
|
-
// Tests DELETE
|
|
20
|
-
]
|
|
21
|
-
}
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## Users de Test Disponibles
|
|
27
|
-
|
|
28
|
-
| User | Email | Password | Permissions |
|
|
29
|
-
|------|-------|----------|-------------|
|
|
30
|
-
| SuperAdmin | `superadmin@smartstack.test` | `SuperAdmin123!` | `*` (toutes) |
|
|
31
|
-
| PlatformAdmin | `platformadmin@smartstack.test` | `PlatformAdmin123!` | `platform.administration.*` |
|
|
32
|
-
| User | `user@smartstack.test` | `User123!` | Standard |
|
|
33
|
-
| ReadOnly | `readonly@smartstack.test` | `ReadOnly123!` | `*.read` uniquement |
|
|
34
|
-
| NoPerm | `noperm@smartstack.test` | `NoPerm123!` | Aucune |
|
|
35
|
-
| Inactive | `inactive@smartstack.test` | `Inactive123!` | Compte désactivé |
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Template Test GET List (200)
|
|
40
|
-
|
|
41
|
-
```json
|
|
42
|
-
{
|
|
43
|
-
"name": "GET {module} - With SuperAdmin Token (200)",
|
|
44
|
-
"event": [
|
|
45
|
-
{
|
|
46
|
-
"listen": "prerequest",
|
|
47
|
-
"script": {
|
|
48
|
-
"exec": [
|
|
49
|
-
"const baseUrl = pm.collectionVariables.get('baseUrl');",
|
|
50
|
-
"",
|
|
51
|
-
"pm.sendRequest({",
|
|
52
|
-
" url: baseUrl + '/api/auth/login',",
|
|
53
|
-
" method: 'POST',",
|
|
54
|
-
" header: { 'Content-Type': 'application/json' },",
|
|
55
|
-
" body: {",
|
|
56
|
-
" mode: 'raw',",
|
|
57
|
-
" raw: JSON.stringify({",
|
|
58
|
-
" email: 'superadmin@smartstack.test',",
|
|
59
|
-
" password: 'SuperAdmin123!'",
|
|
60
|
-
" })",
|
|
61
|
-
" }",
|
|
62
|
-
"}, function (err, res) {",
|
|
63
|
-
" if (err) {",
|
|
64
|
-
" console.error('Login failed:', err);",
|
|
65
|
-
" return;",
|
|
66
|
-
" }",
|
|
67
|
-
" const response = res.json();",
|
|
68
|
-
" pm.collectionVariables.set('accessToken', response.token);",
|
|
69
|
-
" pm.collectionVariables.set('currentUser', 'superadmin');",
|
|
70
|
-
"});"
|
|
71
|
-
],
|
|
72
|
-
"type": "text/javascript"
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"listen": "test",
|
|
77
|
-
"script": {
|
|
78
|
-
"exec": [
|
|
79
|
-
"pm.test('Status code is 200', function () {",
|
|
80
|
-
" pm.response.to.have.status(200);",
|
|
81
|
-
"});",
|
|
82
|
-
"",
|
|
83
|
-
"pm.test('Response has items array', function () {",
|
|
84
|
-
" const response = pm.response.json();",
|
|
85
|
-
" pm.expect(response).to.have.property('items');",
|
|
86
|
-
" pm.expect(response.items).to.be.an('array');",
|
|
87
|
-
"});",
|
|
88
|
-
"",
|
|
89
|
-
"pm.test('Response has pagination info', function () {",
|
|
90
|
-
" const response = pm.response.json();",
|
|
91
|
-
" pm.expect(response).to.have.property('totalCount');",
|
|
92
|
-
" pm.expect(response).to.have.property('page');",
|
|
93
|
-
" pm.expect(response).to.have.property('pageSize');",
|
|
94
|
-
"});"
|
|
95
|
-
],
|
|
96
|
-
"type": "text/javascript"
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
],
|
|
100
|
-
"request": {
|
|
101
|
-
"method": "GET",
|
|
102
|
-
"header": [
|
|
103
|
-
{
|
|
104
|
-
"key": "Authorization",
|
|
105
|
-
"value": "Bearer {{accessToken}}",
|
|
106
|
-
"type": "text"
|
|
107
|
-
}
|
|
108
|
-
],
|
|
109
|
-
"url": {
|
|
110
|
-
"raw": "{{baseUrl}}/api/{area}/{module}",
|
|
111
|
-
"host": ["{{baseUrl}}"],
|
|
112
|
-
"path": ["api", "{area}", "{module}"]
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## Template Test GET (403 - Permission Denied)
|
|
121
|
-
|
|
122
|
-
```json
|
|
123
|
-
{
|
|
124
|
-
"name": "GET {module} - With NoPerm Token (403)",
|
|
125
|
-
"event": [
|
|
126
|
-
{
|
|
127
|
-
"listen": "prerequest",
|
|
128
|
-
"script": {
|
|
129
|
-
"exec": [
|
|
130
|
-
"const baseUrl = pm.collectionVariables.get('baseUrl');",
|
|
131
|
-
"",
|
|
132
|
-
"pm.sendRequest({",
|
|
133
|
-
" url: baseUrl + '/api/auth/login',",
|
|
134
|
-
" method: 'POST',",
|
|
135
|
-
" header: { 'Content-Type': 'application/json' },",
|
|
136
|
-
" body: {",
|
|
137
|
-
" mode: 'raw',",
|
|
138
|
-
" raw: JSON.stringify({",
|
|
139
|
-
" email: 'noperm@smartstack.test',",
|
|
140
|
-
" password: 'NoPerm123!'",
|
|
141
|
-
" })",
|
|
142
|
-
" }",
|
|
143
|
-
"}, function (err, res) {",
|
|
144
|
-
" if (err) {",
|
|
145
|
-
" console.error('Login failed:', err);",
|
|
146
|
-
" return;",
|
|
147
|
-
" }",
|
|
148
|
-
" const response = res.json();",
|
|
149
|
-
" pm.collectionVariables.set('accessToken', response.token);",
|
|
150
|
-
" pm.collectionVariables.set('currentUser', 'noperm');",
|
|
151
|
-
"});"
|
|
152
|
-
],
|
|
153
|
-
"type": "text/javascript"
|
|
154
|
-
}
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
"listen": "test",
|
|
158
|
-
"script": {
|
|
159
|
-
"exec": [
|
|
160
|
-
"pm.test('Status code is 403 Forbidden', function () {",
|
|
161
|
-
" pm.response.to.have.status(403);",
|
|
162
|
-
"});",
|
|
163
|
-
"",
|
|
164
|
-
"pm.test('Response indicates permission denied', function () {",
|
|
165
|
-
" // 403 responses may have empty body or error message",
|
|
166
|
-
" pm.expect(pm.response.code).to.equal(403);",
|
|
167
|
-
"});"
|
|
168
|
-
],
|
|
169
|
-
"type": "text/javascript"
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
],
|
|
173
|
-
"request": {
|
|
174
|
-
"method": "GET",
|
|
175
|
-
"header": [
|
|
176
|
-
{
|
|
177
|
-
"key": "Authorization",
|
|
178
|
-
"value": "Bearer {{accessToken}}",
|
|
179
|
-
"type": "text"
|
|
180
|
-
}
|
|
181
|
-
],
|
|
182
|
-
"url": {
|
|
183
|
-
"raw": "{{baseUrl}}/api/{area}/{module}",
|
|
184
|
-
"host": ["{{baseUrl}}"],
|
|
185
|
-
"path": ["api", "{area}", "{module}"]
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
## Template Test GET (401 - No Auth)
|
|
194
|
-
|
|
195
|
-
```json
|
|
196
|
-
{
|
|
197
|
-
"name": "GET {module} - Without Token (401)",
|
|
198
|
-
"event": [
|
|
199
|
-
{
|
|
200
|
-
"listen": "test",
|
|
201
|
-
"script": {
|
|
202
|
-
"exec": [
|
|
203
|
-
"pm.test('Status code is 401 Unauthorized', function () {",
|
|
204
|
-
" pm.response.to.have.status(401);",
|
|
205
|
-
"});"
|
|
206
|
-
],
|
|
207
|
-
"type": "text/javascript"
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
],
|
|
211
|
-
"request": {
|
|
212
|
-
"method": "GET",
|
|
213
|
-
"header": [],
|
|
214
|
-
"url": {
|
|
215
|
-
"raw": "{{baseUrl}}/api/{area}/{module}",
|
|
216
|
-
"host": ["{{baseUrl}}"],
|
|
217
|
-
"path": ["api", "{area}", "{module}"]
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
---
|
|
224
|
-
|
|
225
|
-
## Template Test POST Create (201)
|
|
226
|
-
|
|
227
|
-
```json
|
|
228
|
-
{
|
|
229
|
-
"name": "POST {module} - With Admin Token (201)",
|
|
230
|
-
"event": [
|
|
231
|
-
{
|
|
232
|
-
"listen": "prerequest",
|
|
233
|
-
"script": {
|
|
234
|
-
"exec": [
|
|
235
|
-
"const baseUrl = pm.collectionVariables.get('baseUrl');",
|
|
236
|
-
"",
|
|
237
|
-
"pm.sendRequest({",
|
|
238
|
-
" url: baseUrl + '/api/auth/login',",
|
|
239
|
-
" method: 'POST',",
|
|
240
|
-
" header: { 'Content-Type': 'application/json' },",
|
|
241
|
-
" body: {",
|
|
242
|
-
" mode: 'raw',",
|
|
243
|
-
" raw: JSON.stringify({",
|
|
244
|
-
" email: 'superadmin@smartstack.test',",
|
|
245
|
-
" password: 'SuperAdmin123!'",
|
|
246
|
-
" })",
|
|
247
|
-
" }",
|
|
248
|
-
"}, function (err, res) {",
|
|
249
|
-
" if (err) return console.error('Login failed:', err);",
|
|
250
|
-
" const response = res.json();",
|
|
251
|
-
" pm.collectionVariables.set('accessToken', response.token);",
|
|
252
|
-
"});"
|
|
253
|
-
],
|
|
254
|
-
"type": "text/javascript"
|
|
255
|
-
}
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
"listen": "test",
|
|
259
|
-
"script": {
|
|
260
|
-
"exec": [
|
|
261
|
-
"pm.test('Status code is 201 Created', function () {",
|
|
262
|
-
" pm.response.to.have.status(201);",
|
|
263
|
-
"});",
|
|
264
|
-
"",
|
|
265
|
-
"pm.test('Response has created entity with ID', function () {",
|
|
266
|
-
" const response = pm.response.json();",
|
|
267
|
-
" pm.expect(response).to.have.property('id');",
|
|
268
|
-
" // Store for subsequent tests",
|
|
269
|
-
" pm.collectionVariables.set('test{Entity}Id', response.id);",
|
|
270
|
-
"});",
|
|
271
|
-
"",
|
|
272
|
-
"pm.test('Response has Location header', function () {",
|
|
273
|
-
" pm.expect(pm.response.headers.has('Location')).to.be.true;",
|
|
274
|
-
"});"
|
|
275
|
-
],
|
|
276
|
-
"type": "text/javascript"
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
],
|
|
280
|
-
"request": {
|
|
281
|
-
"method": "POST",
|
|
282
|
-
"header": [
|
|
283
|
-
{
|
|
284
|
-
"key": "Authorization",
|
|
285
|
-
"value": "Bearer {{accessToken}}",
|
|
286
|
-
"type": "text"
|
|
287
|
-
},
|
|
288
|
-
{
|
|
289
|
-
"key": "Content-Type",
|
|
290
|
-
"value": "application/json",
|
|
291
|
-
"type": "text"
|
|
292
|
-
}
|
|
293
|
-
],
|
|
294
|
-
"body": {
|
|
295
|
-
"mode": "raw",
|
|
296
|
-
"raw": "{\n \"name\": \"Test {Entity} {{$timestamp}}\",\n \"description\": \"Created via Postman test\"\n}"
|
|
297
|
-
},
|
|
298
|
-
"url": {
|
|
299
|
-
"raw": "{{baseUrl}}/api/{area}/{module}",
|
|
300
|
-
"host": ["{{baseUrl}}"],
|
|
301
|
-
"path": ["api", "{area}", "{module}"]
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
---
|
|
308
|
-
|
|
309
|
-
## Template Test POST (403 - ReadOnly)
|
|
310
|
-
|
|
311
|
-
```json
|
|
312
|
-
{
|
|
313
|
-
"name": "POST {module} - With ReadOnly Token (403)",
|
|
314
|
-
"event": [
|
|
315
|
-
{
|
|
316
|
-
"listen": "prerequest",
|
|
317
|
-
"script": {
|
|
318
|
-
"exec": [
|
|
319
|
-
"const baseUrl = pm.collectionVariables.get('baseUrl');",
|
|
320
|
-
"",
|
|
321
|
-
"pm.sendRequest({",
|
|
322
|
-
" url: baseUrl + '/api/auth/login',",
|
|
323
|
-
" method: 'POST',",
|
|
324
|
-
" header: { 'Content-Type': 'application/json' },",
|
|
325
|
-
" body: {",
|
|
326
|
-
" mode: 'raw',",
|
|
327
|
-
" raw: JSON.stringify({",
|
|
328
|
-
" email: 'readonly@smartstack.test',",
|
|
329
|
-
" password: 'ReadOnly123!'",
|
|
330
|
-
" })",
|
|
331
|
-
" }",
|
|
332
|
-
"}, function (err, res) {",
|
|
333
|
-
" if (err) return console.error('Login failed:', err);",
|
|
334
|
-
" const response = res.json();",
|
|
335
|
-
" pm.collectionVariables.set('accessToken', response.token);",
|
|
336
|
-
"});"
|
|
337
|
-
],
|
|
338
|
-
"type": "text/javascript"
|
|
339
|
-
}
|
|
340
|
-
},
|
|
341
|
-
{
|
|
342
|
-
"listen": "test",
|
|
343
|
-
"script": {
|
|
344
|
-
"exec": [
|
|
345
|
-
"pm.test('Status code is 403 Forbidden', function () {",
|
|
346
|
-
" pm.response.to.have.status(403);",
|
|
347
|
-
"});"
|
|
348
|
-
],
|
|
349
|
-
"type": "text/javascript"
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
],
|
|
353
|
-
"request": {
|
|
354
|
-
"method": "POST",
|
|
355
|
-
"header": [
|
|
356
|
-
{
|
|
357
|
-
"key": "Authorization",
|
|
358
|
-
"value": "Bearer {{accessToken}}",
|
|
359
|
-
"type": "text"
|
|
360
|
-
},
|
|
361
|
-
{
|
|
362
|
-
"key": "Content-Type",
|
|
363
|
-
"value": "application/json",
|
|
364
|
-
"type": "text"
|
|
365
|
-
}
|
|
366
|
-
],
|
|
367
|
-
"body": {
|
|
368
|
-
"mode": "raw",
|
|
369
|
-
"raw": "{\n \"name\": \"Should Fail\",\n \"description\": \"ReadOnly cannot create\"\n}"
|
|
370
|
-
},
|
|
371
|
-
"url": {
|
|
372
|
-
"raw": "{{baseUrl}}/api/{area}/{module}",
|
|
373
|
-
"host": ["{{baseUrl}}"],
|
|
374
|
-
"path": ["api", "{area}", "{module}"]
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
---
|
|
381
|
-
|
|
382
|
-
## Template Test DELETE (403)
|
|
383
|
-
|
|
384
|
-
```json
|
|
385
|
-
{
|
|
386
|
-
"name": "DELETE {module} - With ReadOnly Token (403)",
|
|
387
|
-
"event": [
|
|
388
|
-
{
|
|
389
|
-
"listen": "prerequest",
|
|
390
|
-
"script": {
|
|
391
|
-
"exec": [
|
|
392
|
-
"const baseUrl = pm.collectionVariables.get('baseUrl');",
|
|
393
|
-
"",
|
|
394
|
-
"pm.sendRequest({",
|
|
395
|
-
" url: baseUrl + '/api/auth/login',",
|
|
396
|
-
" method: 'POST',",
|
|
397
|
-
" header: { 'Content-Type': 'application/json' },",
|
|
398
|
-
" body: {",
|
|
399
|
-
" mode: 'raw',",
|
|
400
|
-
" raw: JSON.stringify({",
|
|
401
|
-
" email: 'readonly@smartstack.test',",
|
|
402
|
-
" password: 'ReadOnly123!'",
|
|
403
|
-
" })",
|
|
404
|
-
" }",
|
|
405
|
-
"}, function (err, res) {",
|
|
406
|
-
" if (err) return console.error('Login failed:', err);",
|
|
407
|
-
" const response = res.json();",
|
|
408
|
-
" pm.collectionVariables.set('accessToken', response.token);",
|
|
409
|
-
"});"
|
|
410
|
-
],
|
|
411
|
-
"type": "text/javascript"
|
|
412
|
-
}
|
|
413
|
-
},
|
|
414
|
-
{
|
|
415
|
-
"listen": "test",
|
|
416
|
-
"script": {
|
|
417
|
-
"exec": [
|
|
418
|
-
"pm.test('Status code is 403 Forbidden', function () {",
|
|
419
|
-
" pm.response.to.have.status(403);",
|
|
420
|
-
"});"
|
|
421
|
-
],
|
|
422
|
-
"type": "text/javascript"
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
],
|
|
426
|
-
"request": {
|
|
427
|
-
"method": "DELETE",
|
|
428
|
-
"header": [
|
|
429
|
-
{
|
|
430
|
-
"key": "Authorization",
|
|
431
|
-
"value": "Bearer {{accessToken}}",
|
|
432
|
-
"type": "text"
|
|
433
|
-
}
|
|
434
|
-
],
|
|
435
|
-
"url": {
|
|
436
|
-
"raw": "{{baseUrl}}/api/{area}/{module}/{{test{Entity}Id}}",
|
|
437
|
-
"host": ["{{baseUrl}}"],
|
|
438
|
-
"path": ["api", "{area}", "{module}", "{{test{Entity}Id}}"]
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
```
|
|
443
|
-
|
|
444
|
-
---
|
|
445
|
-
|
|
446
|
-
## Template Test Auth - Login Success
|
|
447
|
-
|
|
448
|
-
```json
|
|
449
|
-
{
|
|
450
|
-
"name": "Login - Valid Credentials (200)",
|
|
451
|
-
"event": [
|
|
452
|
-
{
|
|
453
|
-
"listen": "test",
|
|
454
|
-
"script": {
|
|
455
|
-
"exec": [
|
|
456
|
-
"pm.test('Status code is 200', function () {",
|
|
457
|
-
" pm.response.to.have.status(200);",
|
|
458
|
-
"});",
|
|
459
|
-
"",
|
|
460
|
-
"pm.test('Response has access token', function () {",
|
|
461
|
-
" const response = pm.response.json();",
|
|
462
|
-
" pm.expect(response).to.have.property('token');",
|
|
463
|
-
" pm.expect(response.token).to.be.a('string');",
|
|
464
|
-
"});",
|
|
465
|
-
"",
|
|
466
|
-
"pm.test('Response has user info', function () {",
|
|
467
|
-
" const response = pm.response.json();",
|
|
468
|
-
" pm.expect(response).to.have.property('user');",
|
|
469
|
-
" pm.expect(response.user).to.have.property('email');",
|
|
470
|
-
" pm.expect(response.user).to.have.property('roles');",
|
|
471
|
-
" pm.expect(response.user).to.have.property('permissions');",
|
|
472
|
-
"});"
|
|
473
|
-
],
|
|
474
|
-
"type": "text/javascript"
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
],
|
|
478
|
-
"request": {
|
|
479
|
-
"method": "POST",
|
|
480
|
-
"header": [
|
|
481
|
-
{
|
|
482
|
-
"key": "Content-Type",
|
|
483
|
-
"value": "application/json",
|
|
484
|
-
"type": "text"
|
|
485
|
-
}
|
|
486
|
-
],
|
|
487
|
-
"body": {
|
|
488
|
-
"mode": "raw",
|
|
489
|
-
"raw": "{\n \"email\": \"superadmin@smartstack.test\",\n \"password\": \"SuperAdmin123!\"\n}"
|
|
490
|
-
},
|
|
491
|
-
"url": {
|
|
492
|
-
"raw": "{{baseUrl}}/api/auth/login",
|
|
493
|
-
"host": ["{{baseUrl}}"],
|
|
494
|
-
"path": ["api", "auth", "login"]
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
---
|
|
501
|
-
|
|
502
|
-
## Template Test Auth - Login Failed (Locked Account)
|
|
503
|
-
|
|
504
|
-
```json
|
|
505
|
-
{
|
|
506
|
-
"name": "Login - Locked Account (401)",
|
|
507
|
-
"event": [
|
|
508
|
-
{
|
|
509
|
-
"listen": "test",
|
|
510
|
-
"script": {
|
|
511
|
-
"exec": [
|
|
512
|
-
"pm.test('Status code is 401 Unauthorized', function () {",
|
|
513
|
-
" pm.response.to.have.status(401);",
|
|
514
|
-
"});",
|
|
515
|
-
"",
|
|
516
|
-
"pm.test('Response indicates account locked', function () {",
|
|
517
|
-
" const response = pm.response.json();",
|
|
518
|
-
" pm.expect(response).to.have.property('code');",
|
|
519
|
-
" pm.expect(['ACCOUNT_LOCKED', 'ACCOUNT_LOCKED_BY_ADMIN']).to.include(response.code);",
|
|
520
|
-
"});"
|
|
521
|
-
],
|
|
522
|
-
"type": "text/javascript"
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
],
|
|
526
|
-
"request": {
|
|
527
|
-
"method": "POST",
|
|
528
|
-
"header": [
|
|
529
|
-
{
|
|
530
|
-
"key": "Content-Type",
|
|
531
|
-
"value": "application/json",
|
|
532
|
-
"type": "text"
|
|
533
|
-
}
|
|
534
|
-
],
|
|
535
|
-
"body": {
|
|
536
|
-
"mode": "raw",
|
|
537
|
-
"raw": "{\n \"email\": \"locked@smartstack.test\",\n \"password\": \"any-password\"\n}"
|
|
538
|
-
},
|
|
539
|
-
"url": {
|
|
540
|
-
"raw": "{{baseUrl}}/api/auth/login",
|
|
541
|
-
"host": ["{{baseUrl}}"],
|
|
542
|
-
"path": ["api", "auth", "login"]
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
---
|
|
549
|
-
|
|
550
|
-
## Template Test Auth - Invalid Token (401)
|
|
551
|
-
|
|
552
|
-
```json
|
|
553
|
-
{
|
|
554
|
-
"name": "Any Endpoint - Invalid Token (401)",
|
|
555
|
-
"event": [
|
|
556
|
-
{
|
|
557
|
-
"listen": "test",
|
|
558
|
-
"script": {
|
|
559
|
-
"exec": [
|
|
560
|
-
"pm.test('Status code is 401 Unauthorized', function () {",
|
|
561
|
-
" pm.response.to.have.status(401);",
|
|
562
|
-
"});"
|
|
563
|
-
],
|
|
564
|
-
"type": "text/javascript"
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
],
|
|
568
|
-
"request": {
|
|
569
|
-
"method": "GET",
|
|
570
|
-
"header": [
|
|
571
|
-
{
|
|
572
|
-
"key": "Authorization",
|
|
573
|
-
"value": "Bearer invalid.token.here",
|
|
574
|
-
"type": "text"
|
|
575
|
-
}
|
|
576
|
-
],
|
|
577
|
-
"url": {
|
|
578
|
-
"raw": "{{baseUrl}}/api/admin/users",
|
|
579
|
-
"host": ["{{baseUrl}}"],
|
|
580
|
-
"path": ["api", "admin", "users"]
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
```
|
|
585
|
-
|
|
586
|
-
---
|
|
587
|
-
|
|
588
|
-
## Génération Automatique
|
|
589
|
-
|
|
590
|
-
Pour générer les tests d'un nouveau controller, remplacer :
|
|
591
|
-
|
|
592
|
-
| Variable | Exemple |
|
|
593
|
-
|----------|---------|
|
|
594
|
-
| `{area}` | `support`, `admin`, `business` |
|
|
595
|
-
| `{module}` | `tickets`, `sla`, `users` |
|
|
596
|
-
| `{Entity}` | `Ticket`, `SlaDefinition`, `User` |
|
|
597
|
-
|
|
598
|
-
### Tests Minimum par Controller
|
|
599
|
-
|
|
600
|
-
1. GET list - SuperAdmin (200)
|
|
601
|
-
2. GET list - NoPerm (403)
|
|
602
|
-
3. GET list - No Token (401)
|
|
603
|
-
4. POST create - Admin (201)
|
|
604
|
-
5. POST create - ReadOnly (403)
|
|
605
|
-
6. DELETE - ReadOnly (403)
|
|
606
|
-
|
|
607
|
-
### Tests Optionnels
|
|
608
|
-
|
|
609
|
-
- GET by ID - (200)
|
|
610
|
-
- GET by ID - Not Found (404)
|
|
611
|
-
- PUT update - (200)
|
|
612
|
-
- PATCH activate/deactivate - (204)
|
|
613
|
-
- POST avec données invalides - (400)
|
|
614
|
-
- POST doublon - (409)
|
|
1
|
+
# Templates Postman SmartStack
|
|
2
|
+
|
|
3
|
+
> **Note:** Ces templates sont utilisés pour générer automatiquement les tests Postman
|
|
4
|
+
> après la création d'un controller.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Structure Collection Postman
|
|
9
|
+
|
|
10
|
+
```json
|
|
11
|
+
{
|
|
12
|
+
"name": "{Module} API",
|
|
13
|
+
"item": [
|
|
14
|
+
// Tests GET list
|
|
15
|
+
// Tests GET single
|
|
16
|
+
// Tests POST create
|
|
17
|
+
// Tests PUT update
|
|
18
|
+
// Tests PATCH activate/deactivate
|
|
19
|
+
// Tests DELETE
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Users de Test Disponibles
|
|
27
|
+
|
|
28
|
+
| User | Email | Password | Permissions |
|
|
29
|
+
|------|-------|----------|-------------|
|
|
30
|
+
| SuperAdmin | `superadmin@smartstack.test` | `SuperAdmin123!` | `*` (toutes) |
|
|
31
|
+
| PlatformAdmin | `platformadmin@smartstack.test` | `PlatformAdmin123!` | `platform.administration.*` |
|
|
32
|
+
| User | `user@smartstack.test` | `User123!` | Standard |
|
|
33
|
+
| ReadOnly | `readonly@smartstack.test` | `ReadOnly123!` | `*.read` uniquement |
|
|
34
|
+
| NoPerm | `noperm@smartstack.test` | `NoPerm123!` | Aucune |
|
|
35
|
+
| Inactive | `inactive@smartstack.test` | `Inactive123!` | Compte désactivé |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Template Test GET List (200)
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"name": "GET {module} - With SuperAdmin Token (200)",
|
|
44
|
+
"event": [
|
|
45
|
+
{
|
|
46
|
+
"listen": "prerequest",
|
|
47
|
+
"script": {
|
|
48
|
+
"exec": [
|
|
49
|
+
"const baseUrl = pm.collectionVariables.get('baseUrl');",
|
|
50
|
+
"",
|
|
51
|
+
"pm.sendRequest({",
|
|
52
|
+
" url: baseUrl + '/api/auth/login',",
|
|
53
|
+
" method: 'POST',",
|
|
54
|
+
" header: { 'Content-Type': 'application/json' },",
|
|
55
|
+
" body: {",
|
|
56
|
+
" mode: 'raw',",
|
|
57
|
+
" raw: JSON.stringify({",
|
|
58
|
+
" email: 'superadmin@smartstack.test',",
|
|
59
|
+
" password: 'SuperAdmin123!'",
|
|
60
|
+
" })",
|
|
61
|
+
" }",
|
|
62
|
+
"}, function (err, res) {",
|
|
63
|
+
" if (err) {",
|
|
64
|
+
" console.error('Login failed:', err);",
|
|
65
|
+
" return;",
|
|
66
|
+
" }",
|
|
67
|
+
" const response = res.json();",
|
|
68
|
+
" pm.collectionVariables.set('accessToken', response.token);",
|
|
69
|
+
" pm.collectionVariables.set('currentUser', 'superadmin');",
|
|
70
|
+
"});"
|
|
71
|
+
],
|
|
72
|
+
"type": "text/javascript"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"listen": "test",
|
|
77
|
+
"script": {
|
|
78
|
+
"exec": [
|
|
79
|
+
"pm.test('Status code is 200', function () {",
|
|
80
|
+
" pm.response.to.have.status(200);",
|
|
81
|
+
"});",
|
|
82
|
+
"",
|
|
83
|
+
"pm.test('Response has items array', function () {",
|
|
84
|
+
" const response = pm.response.json();",
|
|
85
|
+
" pm.expect(response).to.have.property('items');",
|
|
86
|
+
" pm.expect(response.items).to.be.an('array');",
|
|
87
|
+
"});",
|
|
88
|
+
"",
|
|
89
|
+
"pm.test('Response has pagination info', function () {",
|
|
90
|
+
" const response = pm.response.json();",
|
|
91
|
+
" pm.expect(response).to.have.property('totalCount');",
|
|
92
|
+
" pm.expect(response).to.have.property('page');",
|
|
93
|
+
" pm.expect(response).to.have.property('pageSize');",
|
|
94
|
+
"});"
|
|
95
|
+
],
|
|
96
|
+
"type": "text/javascript"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
"request": {
|
|
101
|
+
"method": "GET",
|
|
102
|
+
"header": [
|
|
103
|
+
{
|
|
104
|
+
"key": "Authorization",
|
|
105
|
+
"value": "Bearer {{accessToken}}",
|
|
106
|
+
"type": "text"
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"url": {
|
|
110
|
+
"raw": "{{baseUrl}}/api/{area}/{module}",
|
|
111
|
+
"host": ["{{baseUrl}}"],
|
|
112
|
+
"path": ["api", "{area}", "{module}"]
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Template Test GET (403 - Permission Denied)
|
|
121
|
+
|
|
122
|
+
```json
|
|
123
|
+
{
|
|
124
|
+
"name": "GET {module} - With NoPerm Token (403)",
|
|
125
|
+
"event": [
|
|
126
|
+
{
|
|
127
|
+
"listen": "prerequest",
|
|
128
|
+
"script": {
|
|
129
|
+
"exec": [
|
|
130
|
+
"const baseUrl = pm.collectionVariables.get('baseUrl');",
|
|
131
|
+
"",
|
|
132
|
+
"pm.sendRequest({",
|
|
133
|
+
" url: baseUrl + '/api/auth/login',",
|
|
134
|
+
" method: 'POST',",
|
|
135
|
+
" header: { 'Content-Type': 'application/json' },",
|
|
136
|
+
" body: {",
|
|
137
|
+
" mode: 'raw',",
|
|
138
|
+
" raw: JSON.stringify({",
|
|
139
|
+
" email: 'noperm@smartstack.test',",
|
|
140
|
+
" password: 'NoPerm123!'",
|
|
141
|
+
" })",
|
|
142
|
+
" }",
|
|
143
|
+
"}, function (err, res) {",
|
|
144
|
+
" if (err) {",
|
|
145
|
+
" console.error('Login failed:', err);",
|
|
146
|
+
" return;",
|
|
147
|
+
" }",
|
|
148
|
+
" const response = res.json();",
|
|
149
|
+
" pm.collectionVariables.set('accessToken', response.token);",
|
|
150
|
+
" pm.collectionVariables.set('currentUser', 'noperm');",
|
|
151
|
+
"});"
|
|
152
|
+
],
|
|
153
|
+
"type": "text/javascript"
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"listen": "test",
|
|
158
|
+
"script": {
|
|
159
|
+
"exec": [
|
|
160
|
+
"pm.test('Status code is 403 Forbidden', function () {",
|
|
161
|
+
" pm.response.to.have.status(403);",
|
|
162
|
+
"});",
|
|
163
|
+
"",
|
|
164
|
+
"pm.test('Response indicates permission denied', function () {",
|
|
165
|
+
" // 403 responses may have empty body or error message",
|
|
166
|
+
" pm.expect(pm.response.code).to.equal(403);",
|
|
167
|
+
"});"
|
|
168
|
+
],
|
|
169
|
+
"type": "text/javascript"
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
],
|
|
173
|
+
"request": {
|
|
174
|
+
"method": "GET",
|
|
175
|
+
"header": [
|
|
176
|
+
{
|
|
177
|
+
"key": "Authorization",
|
|
178
|
+
"value": "Bearer {{accessToken}}",
|
|
179
|
+
"type": "text"
|
|
180
|
+
}
|
|
181
|
+
],
|
|
182
|
+
"url": {
|
|
183
|
+
"raw": "{{baseUrl}}/api/{area}/{module}",
|
|
184
|
+
"host": ["{{baseUrl}}"],
|
|
185
|
+
"path": ["api", "{area}", "{module}"]
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Template Test GET (401 - No Auth)
|
|
194
|
+
|
|
195
|
+
```json
|
|
196
|
+
{
|
|
197
|
+
"name": "GET {module} - Without Token (401)",
|
|
198
|
+
"event": [
|
|
199
|
+
{
|
|
200
|
+
"listen": "test",
|
|
201
|
+
"script": {
|
|
202
|
+
"exec": [
|
|
203
|
+
"pm.test('Status code is 401 Unauthorized', function () {",
|
|
204
|
+
" pm.response.to.have.status(401);",
|
|
205
|
+
"});"
|
|
206
|
+
],
|
|
207
|
+
"type": "text/javascript"
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
],
|
|
211
|
+
"request": {
|
|
212
|
+
"method": "GET",
|
|
213
|
+
"header": [],
|
|
214
|
+
"url": {
|
|
215
|
+
"raw": "{{baseUrl}}/api/{area}/{module}",
|
|
216
|
+
"host": ["{{baseUrl}}"],
|
|
217
|
+
"path": ["api", "{area}", "{module}"]
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Template Test POST Create (201)
|
|
226
|
+
|
|
227
|
+
```json
|
|
228
|
+
{
|
|
229
|
+
"name": "POST {module} - With Admin Token (201)",
|
|
230
|
+
"event": [
|
|
231
|
+
{
|
|
232
|
+
"listen": "prerequest",
|
|
233
|
+
"script": {
|
|
234
|
+
"exec": [
|
|
235
|
+
"const baseUrl = pm.collectionVariables.get('baseUrl');",
|
|
236
|
+
"",
|
|
237
|
+
"pm.sendRequest({",
|
|
238
|
+
" url: baseUrl + '/api/auth/login',",
|
|
239
|
+
" method: 'POST',",
|
|
240
|
+
" header: { 'Content-Type': 'application/json' },",
|
|
241
|
+
" body: {",
|
|
242
|
+
" mode: 'raw',",
|
|
243
|
+
" raw: JSON.stringify({",
|
|
244
|
+
" email: 'superadmin@smartstack.test',",
|
|
245
|
+
" password: 'SuperAdmin123!'",
|
|
246
|
+
" })",
|
|
247
|
+
" }",
|
|
248
|
+
"}, function (err, res) {",
|
|
249
|
+
" if (err) return console.error('Login failed:', err);",
|
|
250
|
+
" const response = res.json();",
|
|
251
|
+
" pm.collectionVariables.set('accessToken', response.token);",
|
|
252
|
+
"});"
|
|
253
|
+
],
|
|
254
|
+
"type": "text/javascript"
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"listen": "test",
|
|
259
|
+
"script": {
|
|
260
|
+
"exec": [
|
|
261
|
+
"pm.test('Status code is 201 Created', function () {",
|
|
262
|
+
" pm.response.to.have.status(201);",
|
|
263
|
+
"});",
|
|
264
|
+
"",
|
|
265
|
+
"pm.test('Response has created entity with ID', function () {",
|
|
266
|
+
" const response = pm.response.json();",
|
|
267
|
+
" pm.expect(response).to.have.property('id');",
|
|
268
|
+
" // Store for subsequent tests",
|
|
269
|
+
" pm.collectionVariables.set('test{Entity}Id', response.id);",
|
|
270
|
+
"});",
|
|
271
|
+
"",
|
|
272
|
+
"pm.test('Response has Location header', function () {",
|
|
273
|
+
" pm.expect(pm.response.headers.has('Location')).to.be.true;",
|
|
274
|
+
"});"
|
|
275
|
+
],
|
|
276
|
+
"type": "text/javascript"
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
],
|
|
280
|
+
"request": {
|
|
281
|
+
"method": "POST",
|
|
282
|
+
"header": [
|
|
283
|
+
{
|
|
284
|
+
"key": "Authorization",
|
|
285
|
+
"value": "Bearer {{accessToken}}",
|
|
286
|
+
"type": "text"
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"key": "Content-Type",
|
|
290
|
+
"value": "application/json",
|
|
291
|
+
"type": "text"
|
|
292
|
+
}
|
|
293
|
+
],
|
|
294
|
+
"body": {
|
|
295
|
+
"mode": "raw",
|
|
296
|
+
"raw": "{\n \"name\": \"Test {Entity} {{$timestamp}}\",\n \"description\": \"Created via Postman test\"\n}"
|
|
297
|
+
},
|
|
298
|
+
"url": {
|
|
299
|
+
"raw": "{{baseUrl}}/api/{area}/{module}",
|
|
300
|
+
"host": ["{{baseUrl}}"],
|
|
301
|
+
"path": ["api", "{area}", "{module}"]
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Template Test POST (403 - ReadOnly)
|
|
310
|
+
|
|
311
|
+
```json
|
|
312
|
+
{
|
|
313
|
+
"name": "POST {module} - With ReadOnly Token (403)",
|
|
314
|
+
"event": [
|
|
315
|
+
{
|
|
316
|
+
"listen": "prerequest",
|
|
317
|
+
"script": {
|
|
318
|
+
"exec": [
|
|
319
|
+
"const baseUrl = pm.collectionVariables.get('baseUrl');",
|
|
320
|
+
"",
|
|
321
|
+
"pm.sendRequest({",
|
|
322
|
+
" url: baseUrl + '/api/auth/login',",
|
|
323
|
+
" method: 'POST',",
|
|
324
|
+
" header: { 'Content-Type': 'application/json' },",
|
|
325
|
+
" body: {",
|
|
326
|
+
" mode: 'raw',",
|
|
327
|
+
" raw: JSON.stringify({",
|
|
328
|
+
" email: 'readonly@smartstack.test',",
|
|
329
|
+
" password: 'ReadOnly123!'",
|
|
330
|
+
" })",
|
|
331
|
+
" }",
|
|
332
|
+
"}, function (err, res) {",
|
|
333
|
+
" if (err) return console.error('Login failed:', err);",
|
|
334
|
+
" const response = res.json();",
|
|
335
|
+
" pm.collectionVariables.set('accessToken', response.token);",
|
|
336
|
+
"});"
|
|
337
|
+
],
|
|
338
|
+
"type": "text/javascript"
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"listen": "test",
|
|
343
|
+
"script": {
|
|
344
|
+
"exec": [
|
|
345
|
+
"pm.test('Status code is 403 Forbidden', function () {",
|
|
346
|
+
" pm.response.to.have.status(403);",
|
|
347
|
+
"});"
|
|
348
|
+
],
|
|
349
|
+
"type": "text/javascript"
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
],
|
|
353
|
+
"request": {
|
|
354
|
+
"method": "POST",
|
|
355
|
+
"header": [
|
|
356
|
+
{
|
|
357
|
+
"key": "Authorization",
|
|
358
|
+
"value": "Bearer {{accessToken}}",
|
|
359
|
+
"type": "text"
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
"key": "Content-Type",
|
|
363
|
+
"value": "application/json",
|
|
364
|
+
"type": "text"
|
|
365
|
+
}
|
|
366
|
+
],
|
|
367
|
+
"body": {
|
|
368
|
+
"mode": "raw",
|
|
369
|
+
"raw": "{\n \"name\": \"Should Fail\",\n \"description\": \"ReadOnly cannot create\"\n}"
|
|
370
|
+
},
|
|
371
|
+
"url": {
|
|
372
|
+
"raw": "{{baseUrl}}/api/{area}/{module}",
|
|
373
|
+
"host": ["{{baseUrl}}"],
|
|
374
|
+
"path": ["api", "{area}", "{module}"]
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## Template Test DELETE (403)
|
|
383
|
+
|
|
384
|
+
```json
|
|
385
|
+
{
|
|
386
|
+
"name": "DELETE {module} - With ReadOnly Token (403)",
|
|
387
|
+
"event": [
|
|
388
|
+
{
|
|
389
|
+
"listen": "prerequest",
|
|
390
|
+
"script": {
|
|
391
|
+
"exec": [
|
|
392
|
+
"const baseUrl = pm.collectionVariables.get('baseUrl');",
|
|
393
|
+
"",
|
|
394
|
+
"pm.sendRequest({",
|
|
395
|
+
" url: baseUrl + '/api/auth/login',",
|
|
396
|
+
" method: 'POST',",
|
|
397
|
+
" header: { 'Content-Type': 'application/json' },",
|
|
398
|
+
" body: {",
|
|
399
|
+
" mode: 'raw',",
|
|
400
|
+
" raw: JSON.stringify({",
|
|
401
|
+
" email: 'readonly@smartstack.test',",
|
|
402
|
+
" password: 'ReadOnly123!'",
|
|
403
|
+
" })",
|
|
404
|
+
" }",
|
|
405
|
+
"}, function (err, res) {",
|
|
406
|
+
" if (err) return console.error('Login failed:', err);",
|
|
407
|
+
" const response = res.json();",
|
|
408
|
+
" pm.collectionVariables.set('accessToken', response.token);",
|
|
409
|
+
"});"
|
|
410
|
+
],
|
|
411
|
+
"type": "text/javascript"
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
"listen": "test",
|
|
416
|
+
"script": {
|
|
417
|
+
"exec": [
|
|
418
|
+
"pm.test('Status code is 403 Forbidden', function () {",
|
|
419
|
+
" pm.response.to.have.status(403);",
|
|
420
|
+
"});"
|
|
421
|
+
],
|
|
422
|
+
"type": "text/javascript"
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
],
|
|
426
|
+
"request": {
|
|
427
|
+
"method": "DELETE",
|
|
428
|
+
"header": [
|
|
429
|
+
{
|
|
430
|
+
"key": "Authorization",
|
|
431
|
+
"value": "Bearer {{accessToken}}",
|
|
432
|
+
"type": "text"
|
|
433
|
+
}
|
|
434
|
+
],
|
|
435
|
+
"url": {
|
|
436
|
+
"raw": "{{baseUrl}}/api/{area}/{module}/{{test{Entity}Id}}",
|
|
437
|
+
"host": ["{{baseUrl}}"],
|
|
438
|
+
"path": ["api", "{area}", "{module}", "{{test{Entity}Id}}"]
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
## Template Test Auth - Login Success
|
|
447
|
+
|
|
448
|
+
```json
|
|
449
|
+
{
|
|
450
|
+
"name": "Login - Valid Credentials (200)",
|
|
451
|
+
"event": [
|
|
452
|
+
{
|
|
453
|
+
"listen": "test",
|
|
454
|
+
"script": {
|
|
455
|
+
"exec": [
|
|
456
|
+
"pm.test('Status code is 200', function () {",
|
|
457
|
+
" pm.response.to.have.status(200);",
|
|
458
|
+
"});",
|
|
459
|
+
"",
|
|
460
|
+
"pm.test('Response has access token', function () {",
|
|
461
|
+
" const response = pm.response.json();",
|
|
462
|
+
" pm.expect(response).to.have.property('token');",
|
|
463
|
+
" pm.expect(response.token).to.be.a('string');",
|
|
464
|
+
"});",
|
|
465
|
+
"",
|
|
466
|
+
"pm.test('Response has user info', function () {",
|
|
467
|
+
" const response = pm.response.json();",
|
|
468
|
+
" pm.expect(response).to.have.property('user');",
|
|
469
|
+
" pm.expect(response.user).to.have.property('email');",
|
|
470
|
+
" pm.expect(response.user).to.have.property('roles');",
|
|
471
|
+
" pm.expect(response.user).to.have.property('permissions');",
|
|
472
|
+
"});"
|
|
473
|
+
],
|
|
474
|
+
"type": "text/javascript"
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
],
|
|
478
|
+
"request": {
|
|
479
|
+
"method": "POST",
|
|
480
|
+
"header": [
|
|
481
|
+
{
|
|
482
|
+
"key": "Content-Type",
|
|
483
|
+
"value": "application/json",
|
|
484
|
+
"type": "text"
|
|
485
|
+
}
|
|
486
|
+
],
|
|
487
|
+
"body": {
|
|
488
|
+
"mode": "raw",
|
|
489
|
+
"raw": "{\n \"email\": \"superadmin@smartstack.test\",\n \"password\": \"SuperAdmin123!\"\n}"
|
|
490
|
+
},
|
|
491
|
+
"url": {
|
|
492
|
+
"raw": "{{baseUrl}}/api/auth/login",
|
|
493
|
+
"host": ["{{baseUrl}}"],
|
|
494
|
+
"path": ["api", "auth", "login"]
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
---
|
|
501
|
+
|
|
502
|
+
## Template Test Auth - Login Failed (Locked Account)
|
|
503
|
+
|
|
504
|
+
```json
|
|
505
|
+
{
|
|
506
|
+
"name": "Login - Locked Account (401)",
|
|
507
|
+
"event": [
|
|
508
|
+
{
|
|
509
|
+
"listen": "test",
|
|
510
|
+
"script": {
|
|
511
|
+
"exec": [
|
|
512
|
+
"pm.test('Status code is 401 Unauthorized', function () {",
|
|
513
|
+
" pm.response.to.have.status(401);",
|
|
514
|
+
"});",
|
|
515
|
+
"",
|
|
516
|
+
"pm.test('Response indicates account locked', function () {",
|
|
517
|
+
" const response = pm.response.json();",
|
|
518
|
+
" pm.expect(response).to.have.property('code');",
|
|
519
|
+
" pm.expect(['ACCOUNT_LOCKED', 'ACCOUNT_LOCKED_BY_ADMIN']).to.include(response.code);",
|
|
520
|
+
"});"
|
|
521
|
+
],
|
|
522
|
+
"type": "text/javascript"
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
],
|
|
526
|
+
"request": {
|
|
527
|
+
"method": "POST",
|
|
528
|
+
"header": [
|
|
529
|
+
{
|
|
530
|
+
"key": "Content-Type",
|
|
531
|
+
"value": "application/json",
|
|
532
|
+
"type": "text"
|
|
533
|
+
}
|
|
534
|
+
],
|
|
535
|
+
"body": {
|
|
536
|
+
"mode": "raw",
|
|
537
|
+
"raw": "{\n \"email\": \"locked@smartstack.test\",\n \"password\": \"any-password\"\n}"
|
|
538
|
+
},
|
|
539
|
+
"url": {
|
|
540
|
+
"raw": "{{baseUrl}}/api/auth/login",
|
|
541
|
+
"host": ["{{baseUrl}}"],
|
|
542
|
+
"path": ["api", "auth", "login"]
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
---
|
|
549
|
+
|
|
550
|
+
## Template Test Auth - Invalid Token (401)
|
|
551
|
+
|
|
552
|
+
```json
|
|
553
|
+
{
|
|
554
|
+
"name": "Any Endpoint - Invalid Token (401)",
|
|
555
|
+
"event": [
|
|
556
|
+
{
|
|
557
|
+
"listen": "test",
|
|
558
|
+
"script": {
|
|
559
|
+
"exec": [
|
|
560
|
+
"pm.test('Status code is 401 Unauthorized', function () {",
|
|
561
|
+
" pm.response.to.have.status(401);",
|
|
562
|
+
"});"
|
|
563
|
+
],
|
|
564
|
+
"type": "text/javascript"
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
],
|
|
568
|
+
"request": {
|
|
569
|
+
"method": "GET",
|
|
570
|
+
"header": [
|
|
571
|
+
{
|
|
572
|
+
"key": "Authorization",
|
|
573
|
+
"value": "Bearer invalid.token.here",
|
|
574
|
+
"type": "text"
|
|
575
|
+
}
|
|
576
|
+
],
|
|
577
|
+
"url": {
|
|
578
|
+
"raw": "{{baseUrl}}/api/admin/users",
|
|
579
|
+
"host": ["{{baseUrl}}"],
|
|
580
|
+
"path": ["api", "admin", "users"]
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
## Génération Automatique
|
|
589
|
+
|
|
590
|
+
Pour générer les tests d'un nouveau controller, remplacer :
|
|
591
|
+
|
|
592
|
+
| Variable | Exemple |
|
|
593
|
+
|----------|---------|
|
|
594
|
+
| `{area}` | `support`, `admin`, `business` |
|
|
595
|
+
| `{module}` | `tickets`, `sla`, `users` |
|
|
596
|
+
| `{Entity}` | `Ticket`, `SlaDefinition`, `User` |
|
|
597
|
+
|
|
598
|
+
### Tests Minimum par Controller
|
|
599
|
+
|
|
600
|
+
1. GET list - SuperAdmin (200)
|
|
601
|
+
2. GET list - NoPerm (403)
|
|
602
|
+
3. GET list - No Token (401)
|
|
603
|
+
4. POST create - Admin (201)
|
|
604
|
+
5. POST create - ReadOnly (403)
|
|
605
|
+
6. DELETE - ReadOnly (403)
|
|
606
|
+
|
|
607
|
+
### Tests Optionnels
|
|
608
|
+
|
|
609
|
+
- GET by ID - (200)
|
|
610
|
+
- GET by ID - Not Found (404)
|
|
611
|
+
- PUT update - (200)
|
|
612
|
+
- PATCH activate/deactivate - (204)
|
|
613
|
+
- POST avec données invalides - (400)
|
|
614
|
+
- POST doublon - (409)
|