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