1337 lines
36 KiB
JSON
1337 lines
36 KiB
JSON
{
|
|
"info": {
|
|
"_postman_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
|
"name": "Enhanced Tech Stack Selector - Migrated Version",
|
|
"description": "Complete Postman collection for the Enhanced Tech Stack Selector API v15.0.0\n\nThis collection includes all endpoints for:\n- Health checks and diagnostics\n- Tech stack recommendations\n- Price tier analysis\n- Technology and tool queries\n- Data integrity validation\n- Compatibility analysis\n\nBase URL: http://localhost:8002",
|
|
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
|
|
"_exporter_id": "12345678"
|
|
},
|
|
"item": [
|
|
{
|
|
"name": "Health & Diagnostics",
|
|
"item": [
|
|
{
|
|
"name": "Health Check",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Response has required fields\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('status');",
|
|
" pm.expect(jsonData).to.have.property('service');",
|
|
" pm.expect(jsonData).to.have.property('version');",
|
|
" pm.expect(jsonData).to.have.property('features');",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Service is healthy\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData.status).to.eql('healthy');",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/health",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"health"
|
|
]
|
|
},
|
|
"description": "Basic health check endpoint to verify the service is running"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Diagnostics",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Diagnostics response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('service');",
|
|
" pm.expect(jsonData).to.have.property('version');",
|
|
" pm.expect(jsonData).to.have.property('checks');",
|
|
" pm.expect(jsonData.checks).to.have.property('neo4j');",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Neo4j connection status\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData.checks.neo4j).to.have.property('status');",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/diagnostics",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"diagnostics"
|
|
]
|
|
},
|
|
"description": "Comprehensive diagnostics including Neo4j connection status and data integrity checks"
|
|
},
|
|
"response": []
|
|
}
|
|
],
|
|
"description": "Health and diagnostics endpoints"
|
|
},
|
|
{
|
|
"name": "Recommendations",
|
|
"item": [
|
|
{
|
|
"name": "Get Best Recommendations",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Recommendations response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('recommendations');",
|
|
" pm.expect(jsonData).to.have.property('count');",
|
|
" pm.expect(jsonData.success).to.be.true;",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Recommendations array is not empty\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData.recommendations).to.be.an('array');",
|
|
" pm.expect(jsonData.count).to.be.above(0);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Each recommendation has required fields\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" if (jsonData.recommendations.length > 0) {",
|
|
" const firstRec = jsonData.recommendations[0];",
|
|
" pm.expect(firstRec).to.have.property('stack_name');",
|
|
" pm.expect(firstRec).to.have.property('monthly_cost');",
|
|
" pm.expect(firstRec).to.have.property('frontend');",
|
|
" pm.expect(firstRec).to.have.property('backend');",
|
|
" pm.expect(firstRec).to.have.property('database');",
|
|
" }",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json"
|
|
},
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"domain\": \"web development\",\n \"budget\": 500.0,\n \"preferredTechnologies\": [\"React\", \"Node.js\", \"PostgreSQL\"]\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/recommend/best",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"recommend",
|
|
"best"
|
|
]
|
|
},
|
|
"description": "Get the best tech stack recommendations based on budget, domain, and preferred technologies"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Recommendations - E-commerce",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Domain-specific recommendations\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData.domain).to.eql('e-commerce');",
|
|
" pm.expect(jsonData.budget).to.eql(1000);",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"domain\": \"e-commerce\",\n \"budget\": 1000.0,\n \"preferredTechnologies\": [\"Vue.js\", \"Django\", \"Redis\"]\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/recommend/best",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"recommend",
|
|
"best"
|
|
]
|
|
},
|
|
"description": "Get recommendations specifically for e-commerce domain with higher budget"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Recommendations - Startup Budget",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Low budget recommendations\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData.budget).to.eql(100);",
|
|
" if (jsonData.recommendations.length > 0) {",
|
|
" jsonData.recommendations.forEach(rec => {",
|
|
" pm.expect(rec.monthly_cost).to.be.at.most(100);",
|
|
" });",
|
|
" }",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "POST",
|
|
"header": [
|
|
{
|
|
"key": "Content-Type",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"body": {
|
|
"mode": "raw",
|
|
"raw": "{\n \"domain\": \"startup\",\n \"budget\": 100.0\n}"
|
|
},
|
|
"url": {
|
|
"raw": "{{base_url}}/recommend/best",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"recommend",
|
|
"best"
|
|
]
|
|
},
|
|
"description": "Get recommendations for startup with limited budget"
|
|
},
|
|
"response": []
|
|
}
|
|
],
|
|
"description": "Tech stack recommendation endpoints"
|
|
},
|
|
{
|
|
"name": "Price Tiers",
|
|
"item": [
|
|
{
|
|
"name": "Get All Price Tiers",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Price tiers response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('price_tiers');",
|
|
" pm.expect(jsonData).to.have.property('count');",
|
|
" pm.expect(jsonData.success).to.be.true;",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Price tiers have required fields\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" if (jsonData.price_tiers.length > 0) {",
|
|
" const firstTier = jsonData.price_tiers[0];",
|
|
" pm.expect(firstTier).to.have.property('tier_name');",
|
|
" pm.expect(firstTier).to.have.property('min_price');",
|
|
" pm.expect(firstTier).to.have.property('max_price');",
|
|
" pm.expect(firstTier).to.have.property('target_audience');",
|
|
" }",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/price-tiers",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"price-tiers"
|
|
]
|
|
},
|
|
"description": "Get analysis of all price tiers with technology and tool counts"
|
|
},
|
|
"response": []
|
|
}
|
|
],
|
|
"description": "Price tier analysis endpoints"
|
|
},
|
|
{
|
|
"name": "Technologies",
|
|
"item": [
|
|
{
|
|
"name": "Get Technologies by Tier - Free",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Technologies response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('tier_name');",
|
|
" pm.expect(jsonData).to.have.property('technologies');",
|
|
" pm.expect(jsonData.tier_name).to.eql('Free');",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Technologies have required fields\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" if (jsonData.technologies.length > 0) {",
|
|
" const firstTech = jsonData.technologies[0];",
|
|
" pm.expect(firstTech).to.have.property('name');",
|
|
" pm.expect(firstTech).to.have.property('category');",
|
|
" pm.expect(firstTech).to.have.property('monthly_cost');",
|
|
" }",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/technologies/Free",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"technologies",
|
|
"Free"
|
|
]
|
|
},
|
|
"description": "Get all technologies in the Free price tier"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Technologies by Tier - Micro Budget",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/technologies/Micro%20Budget",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"technologies",
|
|
"Micro Budget"
|
|
]
|
|
},
|
|
"description": "Get all technologies in the Micro Budget price tier"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Technologies by Tier - Startup Budget",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/technologies/Startup%20Budget",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"technologies",
|
|
"Startup Budget"
|
|
]
|
|
},
|
|
"description": "Get all technologies in the Startup Budget price tier"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Technologies by Tier - Growth Stage",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/technologies/Growth%20Stage",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"technologies",
|
|
"Growth Stage"
|
|
]
|
|
},
|
|
"description": "Get all technologies in the Growth Stage price tier"
|
|
},
|
|
"response": []
|
|
}
|
|
],
|
|
"description": "Technology queries by price tier"
|
|
},
|
|
{
|
|
"name": "Tools",
|
|
"item": [
|
|
{
|
|
"name": "Get Tools by Tier - Free",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Tools response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('tier_name');",
|
|
" pm.expect(jsonData).to.have.property('tools');",
|
|
" pm.expect(jsonData.tier_name).to.eql('Free');",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Tools have required fields\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" if (jsonData.tools.length > 0) {",
|
|
" const firstTool = jsonData.tools[0];",
|
|
" pm.expect(firstTool).to.have.property('name');",
|
|
" pm.expect(firstTool).to.have.property('category');",
|
|
" pm.expect(firstTool).to.have.property('monthly_cost');",
|
|
" }",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/tools/Free",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"tools",
|
|
"Free"
|
|
]
|
|
},
|
|
"description": "Get all tools in the Free price tier"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Tools by Tier - Micro Budget",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/tools/Micro%20Budget",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"tools",
|
|
"Micro Budget"
|
|
]
|
|
},
|
|
"description": "Get all tools in the Micro Budget price tier"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Tools by Tier - Startup Budget",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/tools/Startup%20Budget",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"tools",
|
|
"Startup Budget"
|
|
]
|
|
},
|
|
"description": "Get all tools in the Startup Budget price tier"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Tools by Tier - Growth Stage",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/tools/Growth%20Stage",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"tools",
|
|
"Growth Stage"
|
|
]
|
|
},
|
|
"description": "Get all tools in the Growth Stage price tier"
|
|
},
|
|
"response": []
|
|
}
|
|
],
|
|
"description": "Tool queries by price tier"
|
|
},
|
|
{
|
|
"name": "Analysis & Optimization",
|
|
"item": [
|
|
{
|
|
"name": "Get Optimal Combinations - Frontend",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Optimal combinations response\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('combinations');",
|
|
" pm.expect(jsonData).to.have.property('budget');",
|
|
" pm.expect(jsonData).to.have.property('category');",
|
|
" pm.expect(jsonData.category).to.eql('frontend');",
|
|
"});",
|
|
"",
|
|
"pm.test(\"All combinations within budget\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" const budget = jsonData.budget;",
|
|
" if (jsonData.combinations.length > 0) {",
|
|
" jsonData.combinations.forEach(combo => {",
|
|
" pm.expect(combo.monthly_cost).to.be.at.most(budget);",
|
|
" });",
|
|
" }",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/combinations/optimal?budget=300&category=frontend",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"combinations",
|
|
"optimal"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "budget",
|
|
"value": "300"
|
|
},
|
|
{
|
|
"key": "category",
|
|
"value": "frontend"
|
|
}
|
|
]
|
|
},
|
|
"description": "Get optimal frontend technology combinations within budget"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Optimal Combinations - Backend",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/combinations/optimal?budget=500&category=backend",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"combinations",
|
|
"optimal"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "budget",
|
|
"value": "500"
|
|
},
|
|
{
|
|
"key": "category",
|
|
"value": "backend"
|
|
}
|
|
]
|
|
},
|
|
"description": "Get optimal backend technology combinations within budget"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Optimal Combinations - Database",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/combinations/optimal?budget=200&category=database",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"combinations",
|
|
"optimal"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "budget",
|
|
"value": "200"
|
|
},
|
|
{
|
|
"key": "category",
|
|
"value": "database"
|
|
}
|
|
]
|
|
},
|
|
"description": "Get optimal database technology combinations within budget"
|
|
},
|
|
"response": []
|
|
}
|
|
],
|
|
"description": "Analysis and optimization endpoints"
|
|
},
|
|
{
|
|
"name": "Compatibility",
|
|
"item": [
|
|
{
|
|
"name": "Get Compatibility - React",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Compatibility response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('tech_name');",
|
|
" pm.expect(jsonData).to.have.property('compatible_technologies');",
|
|
" pm.expect(jsonData.tech_name).to.eql('React');",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Compatible technologies have scores\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" if (jsonData.compatible_technologies.length > 0) {",
|
|
" const firstCompat = jsonData.compatible_technologies[0];",
|
|
" pm.expect(firstCompat).to.have.property('compatible_tech');",
|
|
" pm.expect(firstCompat).to.have.property('score');",
|
|
" pm.expect(firstCompat).to.have.property('category');",
|
|
" }",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/compatibility/React",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"compatibility",
|
|
"React"
|
|
]
|
|
},
|
|
"description": "Get compatibility analysis for React technology"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Compatibility - Node.js",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/compatibility/Node.js",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"compatibility",
|
|
"Node.js"
|
|
]
|
|
},
|
|
"description": "Get compatibility analysis for Node.js technology"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Get Compatibility - PostgreSQL",
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/compatibility/PostgreSQL",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"compatibility",
|
|
"PostgreSQL"
|
|
]
|
|
},
|
|
"description": "Get compatibility analysis for PostgreSQL database"
|
|
},
|
|
"response": []
|
|
}
|
|
],
|
|
"description": "Technology compatibility analysis"
|
|
},
|
|
{
|
|
"name": "Data Validation",
|
|
"item": [
|
|
{
|
|
"name": "Validate Data Integrity",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Data integrity response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('integrity_check');",
|
|
" pm.expect(jsonData).to.have.property('summary');",
|
|
" pm.expect(jsonData.success).to.be.true;",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Summary has stack counts\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" const summary = jsonData.summary;",
|
|
" pm.expect(summary).to.have.property('total_stacks');",
|
|
" pm.expect(summary).to.have.property('complete_stacks');",
|
|
" pm.expect(summary).to.have.property('incomplete_stacks');",
|
|
" pm.expect(summary.total_stacks).to.be.a('number');",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Stack counts are consistent\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" const summary = jsonData.summary;",
|
|
" pm.expect(summary.complete_stacks + summary.incomplete_stacks)",
|
|
" .to.eql(summary.total_stacks);",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/validate/integrity",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"validate",
|
|
"integrity"
|
|
]
|
|
},
|
|
"description": "Validate the integrity of migrated data in Neo4j"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Validate Stack Completeness",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Stack completeness response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('validation_results');",
|
|
" pm.expect(jsonData).to.have.property('incomplete_stacks');",
|
|
" pm.expect(jsonData.success).to.be.true;",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Validation results have required fields\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" const results = jsonData.validation_results;",
|
|
" pm.expect(results).to.have.property('total_stacks');",
|
|
" pm.expect(results).to.have.property('complete_stacks');",
|
|
" pm.expect(results).to.have.property('incomplete_count');",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Incomplete stacks have missing components\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" if (jsonData.incomplete_stacks.length > 0) {",
|
|
" const firstIncomplete = jsonData.incomplete_stacks[0];",
|
|
" pm.expect(firstIncomplete).to.have.property('stack_name');",
|
|
" pm.expect(firstIncomplete).to.have.property('missing_components');",
|
|
" }",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/validate/stacks",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"validate",
|
|
"stacks"
|
|
]
|
|
},
|
|
"description": "Validate that all tech stacks have complete frontend, backend, and database components"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Validate Price Consistency",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Price consistency response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('price_validation');",
|
|
" pm.expect(jsonData).to.have.property('inconsistencies');",
|
|
" pm.expect(jsonData.success).to.be.true;",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Price validation summary\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" const validation = jsonData.price_validation;",
|
|
" pm.expect(validation).to.have.property('total_stacks_checked');",
|
|
" pm.expect(validation).to.have.property('consistent_stacks');",
|
|
" pm.expect(validation).to.have.property('inconsistent_count');",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Inconsistencies have details\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" if (jsonData.inconsistencies.length > 0) {",
|
|
" const firstInconsistency = jsonData.inconsistencies[0];",
|
|
" pm.expect(firstInconsistency).to.have.property('stack_name');",
|
|
" pm.expect(firstInconsistency).to.have.property('calculated_cost');",
|
|
" pm.expect(firstInconsistency).to.have.property('stored_cost');",
|
|
" }",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/validate/prices",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"validate",
|
|
"prices"
|
|
]
|
|
},
|
|
"description": "Validate price consistency between calculated and stored monthly costs"
|
|
},
|
|
"response": []
|
|
}
|
|
],
|
|
"description": "Data validation and integrity checks"
|
|
},
|
|
{
|
|
"name": "Search & Filtering",
|
|
"item": [
|
|
{
|
|
"name": "Search Technologies",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Search response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('query');",
|
|
" pm.expect(jsonData).to.have.property('results');",
|
|
" pm.expect(jsonData).to.have.property('count');",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Search results contain query term\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" const query = jsonData.query.toLowerCase();",
|
|
" if (jsonData.results.length > 0) {",
|
|
" jsonData.results.forEach(result => {",
|
|
" const name = result.name.toLowerCase();",
|
|
" const category = result.category.toLowerCase();",
|
|
" pm.expect(name.includes(query) || category.includes(query)).to.be.true;",
|
|
" });",
|
|
" }",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/search/technologies?q=javascript",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"search",
|
|
"technologies"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "q",
|
|
"value": "javascript"
|
|
}
|
|
]
|
|
},
|
|
"description": "Search technologies by name or category"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Search Tools",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Tools search response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('query');",
|
|
" pm.expect(jsonData).to.have.property('results');",
|
|
" pm.expect(jsonData).to.have.property('count');",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/search/tools?q=docker",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"search",
|
|
"tools"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "q",
|
|
"value": "docker"
|
|
}
|
|
]
|
|
},
|
|
"description": "Search tools by name or category"
|
|
},
|
|
"response": []
|
|
},
|
|
{
|
|
"name": "Filter by Budget Range",
|
|
"event": [
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"exec": [
|
|
"pm.test(\"Status code is 200\", function () {",
|
|
" pm.response.to.have.status(200);",
|
|
"});",
|
|
"",
|
|
"pm.test(\"Budget filter response structure\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" pm.expect(jsonData).to.have.property('success');",
|
|
" pm.expect(jsonData).to.have.property('budget_range');",
|
|
" pm.expect(jsonData).to.have.property('stacks');",
|
|
" pm.expect(jsonData).to.have.property('count');",
|
|
"});",
|
|
"",
|
|
"pm.test(\"All stacks within budget range\", function () {",
|
|
" const jsonData = pm.response.json();",
|
|
" const minBudget = jsonData.budget_range.min;",
|
|
" const maxBudget = jsonData.budget_range.max;",
|
|
" ",
|
|
" if (jsonData.stacks.length > 0) {",
|
|
" jsonData.stacks.forEach(stack => {",
|
|
" pm.expect(stack.monthly_cost).to.be.at.least(minBudget);",
|
|
" pm.expect(stack.monthly_cost).to.be.at.most(maxBudget);",
|
|
" });",
|
|
" }",
|
|
"});"
|
|
],
|
|
"type": "text/javascript"
|
|
}
|
|
}
|
|
],
|
|
"request": {
|
|
"method": "GET",
|
|
"header": [
|
|
{
|
|
"key": "Accept",
|
|
"value": "application/json"
|
|
}
|
|
],
|
|
"url": {
|
|
"raw": "{{base_url}}/api/filter/budget?min=100&max=500",
|
|
"host": [
|
|
"{{base_url}}"
|
|
],
|
|
"path": [
|
|
"api",
|
|
"filter",
|
|
"budget"
|
|
],
|
|
"query": [
|
|
{
|
|
"key": "min",
|
|
"value": "100"
|
|
},
|
|
{
|
|
"key": "max",
|
|
"value": "500"
|
|
}
|
|
]
|
|
},
|
|
"description": "Filter tech stacks by budget range"
|
|
},
|
|
"response": []
|
|
}
|
|
],
|
|
"description": "Search and filtering endpoints"
|
|
}
|
|
],
|
|
"event": [
|
|
{
|
|
"listen": "prerequest",
|
|
"script": {
|
|
"type": "text/javascript",
|
|
"exec": [
|
|
"// Set base URL if not already set",
|
|
"if (!pm.environment.get('base_url')) {",
|
|
" pm.environment.set('base_url', 'http://localhost:8002');",
|
|
"}",
|
|
"",
|
|
"// Add timestamp for unique test runs",
|
|
"pm.environment.set('timestamp', new Date().toISOString());"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"listen": "test",
|
|
"script": {
|
|
"type": "text/javascript",
|
|
"exec": [
|
|
"// Global test to ensure response time is reasonable",
|
|
"pm.test(\"Response time is less than 5000ms\", function () {",
|
|
" pm.expect(pm.response.responseTime).to.be.below(5000);",
|
|
"});",
|
|
"",
|
|
"// Global test to ensure content type is JSON for API endpoints",
|
|
"const url = pm.request.url.toString();",
|
|
"if (url.includes('/api/') || url.includes('/recommend/')) {",
|
|
" pm.test(\"Content-Type is application/json\", function () {",
|
|
" pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json');",
|
|
" });",
|
|
"}"
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"variable": [
|
|
{
|
|
"key": "base_url",
|
|
"value": "http://localhost:8002",
|
|
"type": "string",
|
|
"description": "Base URL for the Enhanced Tech Stack Selector API"
|
|
},
|
|
{
|
|
"key": "api_version",
|
|
"value": "v15.0.0",
|
|
"type": "string",
|
|
"description": "Current API version"
|
|
},
|
|
{
|
|
"key": "test_budget_low",
|
|
"value": "100",
|
|
"type": "string",
|
|
"description": "Low budget for testing (startup tier)"
|
|
},
|
|
{
|
|
"key": "test_budget_medium",
|
|
"value": "500",
|
|
"type": "string",
|
|
"description": "Medium budget for testing (professional tier)"
|
|
},
|
|
{
|
|
"key": "test_budget_high",
|
|
"value": "1000",
|
|
"type": "string",
|
|
"description": "High budget for testing (enterprise tier)"
|
|
}
|
|
]
|
|
} |