codenuk_backend_mine/services/tech-stack-selector/postman_collection.json
2025-10-10 08:56:39 +05:30

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)"
}
]
}