401 lines
26 KiB
JSON
401 lines
26 KiB
JSON
{
|
|
"info": {
|
|
"_postman_id": "7b82f9d1-3e4a-4c28-b901-postman-coll-001",
|
|
"name": "AI Patient Onboarding API",
|
|
"description": "Production Postman Collection with Performance Testing, Latency Thresholds, Response Time Verification, Auth Security, and IDOR Checks.",
|
|
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
|
|
},
|
|
"item": [
|
|
{
|
|
"name": "00 - Health",
|
|
"item": [
|
|
{
|
|
"name": "Get Service Health Status",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/health",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"health"
|
|
]
|
|
},
|
|
"description": "Checks operational health."
|
|
},
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test('Status code is 200', function () { pm.response.to.have.status(200); });",
|
|
"\nconst clientMs = pm.response.responseTime;\nconst json = pm.response.json();\nconst maxAllowedMs = Number(pm.environment.get('text_complete_max_ms') || 10000);\n\npm.test(\"Response time is recorded\", function () {\n pm.expect(clientMs).to.be.a(\"number\");\n});\n\nlet serverMs = null;\nlet serverSec = null;\nlet overheadMs = null;\n\nif (json && json.response_time_ms !== undefined && json.response_time_ms !== null) {\n serverMs = Number(json.response_time_ms);\n serverSec = Number(json.response_time_sec);\n overheadMs = clientMs - serverMs;\n\n pm.test(\"Server response_time_ms is numeric\", function () {\n pm.expect(serverMs).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_sec is numeric\", function () {\n pm.expect(serverSec).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_ms and response_time_sec consistency (<0.1s diff)\", function () {\n const calculatedSec = serverMs / 1000;\n pm.expect(Math.abs(calculatedSec - serverSec)).to.be.below(0.1);\n });\n}\n\nlet performanceStatus;\nif (clientMs <= 5000) {\n performanceStatus = \"FAST\";\n} else if (clientMs <= 10000) {\n performanceStatus = \"ACCEPTABLE\";\n} else if (clientMs <= 30000) {\n performanceStatus = \"SLOW\";\n} else {\n performanceStatus = \"CRITICAL / PERFORMANCE INVESTIGATION REQUIRED\";\n}\n\nconsole.log({\n endpoint: pm.request.url.toString(),\n client_response_time_ms: clientMs,\n server_response_time_ms: serverMs,\n server_response_time_sec: serverSec,\n overhead_ms: overheadMs,\n performance_status: performanceStatus\n});\n"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "01 - Authentication",
|
|
"item": [
|
|
{
|
|
"name": "Test Bearer Auth Token Validation",
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Authorization",
|
|
"value": "Bearer {{auth_token}}"
|
|
},
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\"patient\": {\"id\": \"{{patient_id}}\", \"name\": \"{{patient_name}}\", \"age\": 30, \"gender\": \"{{patient_gender}}\"}, \"category\": {\"type\": \"{{category_type}}\", \"code\": \"{{category_code}}\", \"name\": \"{{category_name}}\"}, \"language\": \"{{language}}\"}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/v1/onboarding/start",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"v1",
|
|
"onboarding",
|
|
"start"
|
|
]
|
|
}
|
|
},
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test('Status code is 200 OK', function () { pm.response.to.have.status(200); });",
|
|
"\nconst clientMs = pm.response.responseTime;\nconst json = pm.response.json();\nconst maxAllowedMs = Number(pm.environment.get('text_complete_max_ms') || 10000);\n\npm.test(\"Response time is recorded\", function () {\n pm.expect(clientMs).to.be.a(\"number\");\n});\n\nlet serverMs = null;\nlet serverSec = null;\nlet overheadMs = null;\n\nif (json && json.response_time_ms !== undefined && json.response_time_ms !== null) {\n serverMs = Number(json.response_time_ms);\n serverSec = Number(json.response_time_sec);\n overheadMs = clientMs - serverMs;\n\n pm.test(\"Server response_time_ms is numeric\", function () {\n pm.expect(serverMs).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_sec is numeric\", function () {\n pm.expect(serverSec).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_ms and response_time_sec consistency (<0.1s diff)\", function () {\n const calculatedSec = serverMs / 1000;\n pm.expect(Math.abs(calculatedSec - serverSec)).to.be.below(0.1);\n });\n}\n\nlet performanceStatus;\nif (clientMs <= 5000) {\n performanceStatus = \"FAST\";\n} else if (clientMs <= 10000) {\n performanceStatus = \"ACCEPTABLE\";\n} else if (clientMs <= 30000) {\n performanceStatus = \"SLOW\";\n} else {\n performanceStatus = \"CRITICAL / PERFORMANCE INVESTIGATION REQUIRED\";\n}\n\nconsole.log({\n endpoint: pm.request.url.toString(),\n client_response_time_ms: clientMs,\n server_response_time_ms: serverMs,\n server_response_time_sec: serverSec,\n overhead_ms: overheadMs,\n performance_status: performanceStatus\n});\n"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "02 - Patient Onboarding (Text)",
|
|
"item": [
|
|
{
|
|
"name": "Start Text Onboarding",
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Authorization",
|
|
"value": "Bearer {{auth_token}}"
|
|
},
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\"patient\": {\"id\": \"{{patient_id}}\", \"name\": \"{{patient_name}}\", \"age\": 35, \"gender\": \"{{patient_gender}}\"}, \"category\": {\"type\": \"{{category_type}}\", \"code\": \"{{category_code}}\", \"name\": \"{{category_name}}\"}, \"language\": \"{{language}}\"}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/v1/onboarding/start",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"v1",
|
|
"onboarding",
|
|
"start"
|
|
]
|
|
}
|
|
},
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test('Status code is 200', function () { pm.response.to.have.status(200); });",
|
|
"const data = pm.response.json(); pm.environment.set('session_id', data.session_id);",
|
|
"\nconst clientMs = pm.response.responseTime;\nconst json = pm.response.json();\nconst maxAllowedMs = Number(pm.environment.get('text_complete_max_ms') || 10000);\n\npm.test(\"Response time is recorded\", function () {\n pm.expect(clientMs).to.be.a(\"number\");\n});\n\nlet serverMs = null;\nlet serverSec = null;\nlet overheadMs = null;\n\nif (json && json.response_time_ms !== undefined && json.response_time_ms !== null) {\n serverMs = Number(json.response_time_ms);\n serverSec = Number(json.response_time_sec);\n overheadMs = clientMs - serverMs;\n\n pm.test(\"Server response_time_ms is numeric\", function () {\n pm.expect(serverMs).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_sec is numeric\", function () {\n pm.expect(serverSec).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_ms and response_time_sec consistency (<0.1s diff)\", function () {\n const calculatedSec = serverMs / 1000;\n pm.expect(Math.abs(calculatedSec - serverSec)).to.be.below(0.1);\n });\n}\n\nlet performanceStatus;\nif (clientMs <= 5000) {\n performanceStatus = \"FAST\";\n} else if (clientMs <= 10000) {\n performanceStatus = \"ACCEPTABLE\";\n} else if (clientMs <= 30000) {\n performanceStatus = \"SLOW\";\n} else {\n performanceStatus = \"CRITICAL / PERFORMANCE INVESTIGATION REQUIRED\";\n}\n\nconsole.log({\n endpoint: pm.request.url.toString(),\n client_response_time_ms: clientMs,\n server_response_time_ms: serverMs,\n server_response_time_sec: serverSec,\n overhead_ms: overheadMs,\n performance_status: performanceStatus\n});\n"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "Send Patient Message",
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Authorization",
|
|
"value": "Bearer {{auth_token}}"
|
|
},
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\"message\": \"I have shortness of breath and chest tightness.\"}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/v1/onboarding/{{session_id}}/message",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"v1",
|
|
"onboarding",
|
|
"{{session_id}}",
|
|
"message"
|
|
]
|
|
}
|
|
},
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test('Status code is 200', function () { pm.response.to.have.status(200); });",
|
|
"\nconst clientMs = pm.response.responseTime;\nconst json = pm.response.json();\nconst maxAllowedMs = Number(pm.environment.get('text_complete_max_ms') || 10000);\n\npm.test(\"Response time is recorded\", function () {\n pm.expect(clientMs).to.be.a(\"number\");\n});\n\nlet serverMs = null;\nlet serverSec = null;\nlet overheadMs = null;\n\nif (json && json.response_time_ms !== undefined && json.response_time_ms !== null) {\n serverMs = Number(json.response_time_ms);\n serverSec = Number(json.response_time_sec);\n overheadMs = clientMs - serverMs;\n\n pm.test(\"Server response_time_ms is numeric\", function () {\n pm.expect(serverMs).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_sec is numeric\", function () {\n pm.expect(serverSec).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_ms and response_time_sec consistency (<0.1s diff)\", function () {\n const calculatedSec = serverMs / 1000;\n pm.expect(Math.abs(calculatedSec - serverSec)).to.be.below(0.1);\n });\n}\n\nlet performanceStatus;\nif (clientMs <= 5000) {\n performanceStatus = \"FAST\";\n} else if (clientMs <= 10000) {\n performanceStatus = \"ACCEPTABLE\";\n} else if (clientMs <= 30000) {\n performanceStatus = \"SLOW\";\n} else {\n performanceStatus = \"CRITICAL / PERFORMANCE INVESTIGATION REQUIRED\";\n}\n\nconsole.log({\n endpoint: pm.request.url.toString(),\n client_response_time_ms: clientMs,\n server_response_time_ms: serverMs,\n server_response_time_sec: serverSec,\n overhead_ms: overheadMs,\n performance_status: performanceStatus\n});\n"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "Complete Text Onboarding",
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Authorization",
|
|
"value": "Bearer {{auth_token}}"
|
|
},
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\"confirmed\": true}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/v1/onboarding/{{session_id}}/complete",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"v1",
|
|
"onboarding",
|
|
"{{session_id}}",
|
|
"complete"
|
|
]
|
|
}
|
|
},
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test('Status code is 200', function () { pm.response.to.have.status(200); });",
|
|
"\nconst clientMs = pm.response.responseTime;\nconst json = pm.response.json();\nconst maxAllowedMs = Number(pm.environment.get('text_complete_max_ms') || 10000);\n\npm.test(\"Response time is recorded\", function () {\n pm.expect(clientMs).to.be.a(\"number\");\n});\n\nlet serverMs = null;\nlet serverSec = null;\nlet overheadMs = null;\n\nif (json && json.response_time_ms !== undefined && json.response_time_ms !== null) {\n serverMs = Number(json.response_time_ms);\n serverSec = Number(json.response_time_sec);\n overheadMs = clientMs - serverMs;\n\n pm.test(\"Server response_time_ms is numeric\", function () {\n pm.expect(serverMs).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_sec is numeric\", function () {\n pm.expect(serverSec).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_ms and response_time_sec consistency (<0.1s diff)\", function () {\n const calculatedSec = serverMs / 1000;\n pm.expect(Math.abs(calculatedSec - serverSec)).to.be.below(0.1);\n });\n}\n\nlet performanceStatus;\nif (clientMs <= 5000) {\n performanceStatus = \"FAST\";\n} else if (clientMs <= 10000) {\n performanceStatus = \"ACCEPTABLE\";\n} else if (clientMs <= 30000) {\n performanceStatus = \"SLOW\";\n} else {\n performanceStatus = \"CRITICAL / PERFORMANCE INVESTIGATION REQUIRED\";\n}\n\nconsole.log({\n endpoint: pm.request.url.toString(),\n client_response_time_ms: clientMs,\n server_response_time_ms: serverMs,\n server_response_time_sec: serverSec,\n overhead_ms: overheadMs,\n performance_status: performanceStatus\n});\n"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "03 - Voice Onboarding",
|
|
"item": [
|
|
{
|
|
"name": "Start Voice Onboarding",
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Authorization",
|
|
"value": "Bearer {{auth_token}}"
|
|
},
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\"patient\": {\"id\": \"{{patient_id}}\", \"name\": \"{{patient_name}}\", \"age\": 45, \"gender\": \"{{patient_gender}}\"}, \"language\": \"ta-IN\"}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/v1/voice-onboarding/start",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"v1",
|
|
"voice-onboarding",
|
|
"start"
|
|
]
|
|
}
|
|
},
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test('Status code is 200', function () { pm.response.to.have.status(200); });",
|
|
"const data = pm.response.json(); pm.environment.set('voice_session_id', data.session_id);",
|
|
"\nconst clientMs = pm.response.responseTime;\nconst json = pm.response.json();\nconst maxAllowedMs = Number(pm.environment.get('text_complete_max_ms') || 10000);\n\npm.test(\"Response time is recorded\", function () {\n pm.expect(clientMs).to.be.a(\"number\");\n});\n\nlet serverMs = null;\nlet serverSec = null;\nlet overheadMs = null;\n\nif (json && json.response_time_ms !== undefined && json.response_time_ms !== null) {\n serverMs = Number(json.response_time_ms);\n serverSec = Number(json.response_time_sec);\n overheadMs = clientMs - serverMs;\n\n pm.test(\"Server response_time_ms is numeric\", function () {\n pm.expect(serverMs).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_sec is numeric\", function () {\n pm.expect(serverSec).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_ms and response_time_sec consistency (<0.1s diff)\", function () {\n const calculatedSec = serverMs / 1000;\n pm.expect(Math.abs(calculatedSec - serverSec)).to.be.below(0.1);\n });\n}\n\nlet performanceStatus;\nif (clientMs <= 5000) {\n performanceStatus = \"FAST\";\n} else if (clientMs <= 10000) {\n performanceStatus = \"ACCEPTABLE\";\n} else if (clientMs <= 30000) {\n performanceStatus = \"SLOW\";\n} else {\n performanceStatus = \"CRITICAL / PERFORMANCE INVESTIGATION REQUIRED\";\n}\n\nconsole.log({\n endpoint: pm.request.url.toString(),\n client_response_time_ms: clientMs,\n server_response_time_ms: serverMs,\n server_response_time_sec: serverSec,\n overhead_ms: overheadMs,\n performance_status: performanceStatus\n});\n"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "Voice Turn - Text Fallback",
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Authorization",
|
|
"value": "Bearer {{auth_token}}"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "formdata",
|
|
"formdata": [
|
|
{
|
|
"key": "text_fallback",
|
|
"value": "எனக்கு கடந்த 3 நாளா நெஞ்சு பாரமா இருக்குங்க.",
|
|
"type": "text"
|
|
}
|
|
]
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/v1/voice-onboarding/{{voice_session_id}}/turn",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"v1",
|
|
"voice-onboarding",
|
|
"{{voice_session_id}}",
|
|
"turn"
|
|
]
|
|
}
|
|
},
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test('Status code is 200', function () { pm.response.to.have.status(200); });",
|
|
"\nconst clientMs = pm.response.responseTime;\nconst json = pm.response.json();\nconst maxAllowedMs = Number(pm.environment.get('text_complete_max_ms') || 10000);\n\npm.test(\"Response time is recorded\", function () {\n pm.expect(clientMs).to.be.a(\"number\");\n});\n\nlet serverMs = null;\nlet serverSec = null;\nlet overheadMs = null;\n\nif (json && json.response_time_ms !== undefined && json.response_time_ms !== null) {\n serverMs = Number(json.response_time_ms);\n serverSec = Number(json.response_time_sec);\n overheadMs = clientMs - serverMs;\n\n pm.test(\"Server response_time_ms is numeric\", function () {\n pm.expect(serverMs).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_sec is numeric\", function () {\n pm.expect(serverSec).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_ms and response_time_sec consistency (<0.1s diff)\", function () {\n const calculatedSec = serverMs / 1000;\n pm.expect(Math.abs(calculatedSec - serverSec)).to.be.below(0.1);\n });\n}\n\nlet performanceStatus;\nif (clientMs <= 5000) {\n performanceStatus = \"FAST\";\n} else if (clientMs <= 10000) {\n performanceStatus = \"ACCEPTABLE\";\n} else if (clientMs <= 30000) {\n performanceStatus = \"SLOW\";\n} else {\n performanceStatus = \"CRITICAL / PERFORMANCE INVESTIGATION REQUIRED\";\n}\n\nconsole.log({\n endpoint: pm.request.url.toString(),\n client_response_time_ms: clientMs,\n server_response_time_ms: serverMs,\n server_response_time_sec: serverSec,\n overhead_ms: overheadMs,\n performance_status: performanceStatus\n});\n"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "Complete Voice Onboarding",
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Authorization",
|
|
"value": "Bearer {{auth_token}}"
|
|
},
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\"confirmed\": true}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/v1/voice-onboarding/{{voice_session_id}}/complete",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"v1",
|
|
"voice-onboarding",
|
|
"{{voice_session_id}}",
|
|
"complete"
|
|
]
|
|
}
|
|
},
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test('Status code is 200', function () { pm.response.to.have.status(200); });",
|
|
"\nconst clientMs = pm.response.responseTime;\nconst json = pm.response.json();\nconst maxAllowedMs = Number(pm.environment.get('text_complete_max_ms') || 10000);\n\npm.test(\"Response time is recorded\", function () {\n pm.expect(clientMs).to.be.a(\"number\");\n});\n\nlet serverMs = null;\nlet serverSec = null;\nlet overheadMs = null;\n\nif (json && json.response_time_ms !== undefined && json.response_time_ms !== null) {\n serverMs = Number(json.response_time_ms);\n serverSec = Number(json.response_time_sec);\n overheadMs = clientMs - serverMs;\n\n pm.test(\"Server response_time_ms is numeric\", function () {\n pm.expect(serverMs).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_sec is numeric\", function () {\n pm.expect(serverSec).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_ms and response_time_sec consistency (<0.1s diff)\", function () {\n const calculatedSec = serverMs / 1000;\n pm.expect(Math.abs(calculatedSec - serverSec)).to.be.below(0.1);\n });\n}\n\nlet performanceStatus;\nif (clientMs <= 5000) {\n performanceStatus = \"FAST\";\n} else if (clientMs <= 10000) {\n performanceStatus = \"ACCEPTABLE\";\n} else if (clientMs <= 30000) {\n performanceStatus = \"SLOW\";\n} else {\n performanceStatus = \"CRITICAL / PERFORMANCE INVESTIGATION REQUIRED\";\n}\n\nconsole.log({\n endpoint: pm.request.url.toString(),\n client_response_time_ms: clientMs,\n server_response_time_ms: serverMs,\n server_response_time_sec: serverSec,\n overhead_ms: overheadMs,\n performance_status: performanceStatus\n});\n"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "09 - Performance Tests",
|
|
"item": [
|
|
{
|
|
"name": "Performance Benchmark Suite Target",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [],
|
|
"url": {
|
|
"raw": "{{base_url}}/health",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"health"
|
|
]
|
|
}
|
|
},
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test('Performance Benchmark Health Target Status 200', function () { pm.response.to.have.status(200); });",
|
|
"\nconst clientMs = pm.response.responseTime;\nconst json = pm.response.json();\nconst maxAllowedMs = Number(pm.environment.get('text_complete_max_ms') || 10000);\n\npm.test(\"Response time is recorded\", function () {\n pm.expect(clientMs).to.be.a(\"number\");\n});\n\nlet serverMs = null;\nlet serverSec = null;\nlet overheadMs = null;\n\nif (json && json.response_time_ms !== undefined && json.response_time_ms !== null) {\n serverMs = Number(json.response_time_ms);\n serverSec = Number(json.response_time_sec);\n overheadMs = clientMs - serverMs;\n\n pm.test(\"Server response_time_ms is numeric\", function () {\n pm.expect(serverMs).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_sec is numeric\", function () {\n pm.expect(serverSec).to.be.a(\"number\");\n });\n\n pm.test(\"Server response_time_ms and response_time_sec consistency (<0.1s diff)\", function () {\n const calculatedSec = serverMs / 1000;\n pm.expect(Math.abs(calculatedSec - serverSec)).to.be.below(0.1);\n });\n}\n\nlet performanceStatus;\nif (clientMs <= 5000) {\n performanceStatus = \"FAST\";\n} else if (clientMs <= 10000) {\n performanceStatus = \"ACCEPTABLE\";\n} else if (clientMs <= 30000) {\n performanceStatus = \"SLOW\";\n} else {\n performanceStatus = \"CRITICAL / PERFORMANCE INVESTIGATION REQUIRED\";\n}\n\nconsole.log({\n endpoint: pm.request.url.toString(),\n client_response_time_ms: clientMs,\n server_response_time_ms: serverMs,\n server_response_time_sec: serverSec,\n overhead_ms: overheadMs,\n performance_status: performanceStatus\n});\n"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
} |