From 0366899f6045f6abf08bff3c1575b5f5a180569a Mon Sep 17 00:00:00 2001 From: Achanandhi-M Date: Fri, 7 Nov 2025 14:14:16 +0530 Subject: [PATCH] feat: merge postman collection Signed-off-by: Achanandhi-M --- postman/ecommerce_full_collection.json | 955 +++++++++++++++++++++++++ 1 file changed, 955 insertions(+) create mode 100644 postman/ecommerce_full_collection.json diff --git a/postman/ecommerce_full_collection.json b/postman/ecommerce_full_collection.json new file mode 100644 index 0000000..5b50be8 --- /dev/null +++ b/postman/ecommerce_full_collection.json @@ -0,0 +1,955 @@ +{ + "info": { + "name": "E-commerce Full Stack (Gateway + Microservices)", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "API Gateway", + "item": [ + { + "name": "Login (via user service path)", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "url": { + "raw": "{{gw_base}}/api/v1/login", + "host": [ + "{{gw_base}}" + ], + "path": [ + "api", + "v1", + "login" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"username\": \"{{username}}\",\n \"password\": \"p@ssw0rd\"\n}" + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var j={}; try{ j=pm.response.json(); }catch(e){}; if (j.token) pm.environment.set('jwt', j.token);", + "pm.test('got token', function(){ pm.expect(!!pm.environment.get('jwt')).to.be.true; });" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Create address", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{gw_base}}/api/v1/users/{{user_id}}/addresses", + "host": [ + "{{gw_base}}" + ], + "path": [ + "api", + "v1", + "users", + "{{user_id}}", + "addresses" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"line1\": \"1 Main St\",\n \"city\": \"NYC\",\n \"state\": \"NY\",\n \"postal_code\": \"10001\",\n \"country\": \"US\",\n \"phone\": \"+1-555-0000\",\n \"is_default\": true\n}" + } + } + }, + { + "name": "Delete user (via gateway)", + "request": { + "method": "DELETE", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{gw_base}}/api/v1/users/{{user_id}}", + "host": [ + "{{gw_base}}" + ], + "path": [ + "api", + "v1", + "users", + "{{user_id}}" + ] + } + } + }, + { + "name": "Create order (shippingAddressId)", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Idempotency-Key", + "value": "{{idempotency_key}}" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{gw_base}}/api/v1/orders", + "host": [ + "{{gw_base}}" + ], + "path": [ + "api", + "v1", + "orders" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"userId\": \"{{user_id}}\",\n \"items\": [ { \"productId\": \"{{product_id}}\", \"quantity\": 1 } ],\n \"shippingAddressId\": \"{{address_id}}\"\n}" + } + } + }, + { + "name": "Get order details (enriched)", + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{gw_base}}/api/v1/orders/{{order_id}}/details", + "host": [ + "{{gw_base}}" + ], + "path": [ + "api", + "v1", + "orders", + "{{order_id}}", + "details" + ] + } + } + } + ] + }, + { + "name": "User Service", + "item": [ + { + "name": "Login (get token)", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "url": { + "raw": "{{user_base}}/login", + "host": [ + "{{user_base}}" + ], + "path": [ + "login" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"username\": \"{{username}}\",\n \"password\": \"p@ssw0rd\"\n}" + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var j={}; try{ j=pm.response.json(); }catch(e){};", + "if (j.token) pm.environment.set('jwt', j.token);", + "pm.test('got token', function(){ pm.expect(!!pm.environment.get('jwt')).to.be.true; });" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Create user", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{user_base}}/users", + "host": [ + "{{user_base}}" + ], + "path": [ + "users" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"username\": \"{{username}}\",\n \"email\": \"{{email}}\",\n \"password\": \"p@ssw0rd\"\n}" + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test('user created', function(){", + " pm.expect([200,201]).to.include(pm.response.code);", + "});", + "var json = {}; try { json = pm.response.json(); } catch(e){}", + "if (json.id) { pm.environment.set('last_user_id', json.id); }" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Add address (default)", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{user_base}}/users/{{last_user_id}}/addresses", + "host": [ + "{{user_base}}" + ], + "path": [ + "users", + "{{last_user_id}}", + "addresses" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"line1\": \"1 Main St\",\n \"city\": \"NYC\",\n \"state\": \"NY\",\n \"postal_code\": \"10001\",\n \"country\": \"US\",\n \"phone\": \"+1-555-0000\",\n \"is_default\": true\n}" + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test('address created', function(){ pm.expect([200,201]).to.include(pm.response.code); });", + "var j={}; try{ j=pm.response.json(); }catch(e){}; if (j.id){ pm.environment.set('last_address_id', j.id); }" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "List addresses", + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{user_base}}/users/{{last_user_id}}/addresses", + "host": [ + "{{user_base}}" + ], + "path": [ + "users", + "{{last_user_id}}", + "addresses" + ] + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test('addresses listed', function(){ pm.expect(pm.response.code).to.eql(200); });" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Get user", + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{user_base}}/users/{{last_user_id}}", + "host": [ + "{{user_base}}" + ], + "path": [ + "users", + "{{last_user_id}}" + ] + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test('user fetched', function(){ pm.expect(pm.response.code).to.eql(200); });" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Delete user", + "request": { + "method": "DELETE", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{user_base}}/users/{{last_user_id}}", + "host": [ + "{{user_base}}" + ], + "path": [ + "users", + "{{last_user_id}}" + ] + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test('deleted or not found', function(){ pm.expect([200,404]).to.include(pm.response.code); });" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Login", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "url": { + "raw": "{{user_base}}/login", + "host": [ + "{{user_base}}" + ], + "path": [ + "login" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"username\": \"{{username}}\",\n \"password\": \"p@ssw0rd\"\n}" + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test('login ok', function(){ pm.expect(pm.response.code).to.eql(200); });" + ], + "type": "text/javascript" + } + } + ] + } + ] + }, + { + "name": "Product Service", + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "if (!pm.environment.get('laptop_id') || !pm.environment.get('mouse_id')) {", + " // Fetch products once to seed IDs", + " pm.sendRequest({ url: pm.environment.get('product_base') + '/products', method: 'GET' }, function(err, res) {", + " if (!err) {", + " var arr = res.json();", + " if (arr && arr.length) {", + " pm.environment.set('laptop_id', arr[0].id);", + " if (arr.length > 1) pm.environment.set('mouse_id', arr[1].id);", + " }", + " }", + " });", + "}" + ], + "type": "text/javascript" + } + } + ], + "item": [ + { + "name": "List products", + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{product_base}}/products", + "host": [ + "{{product_base}}" + ], + "path": [ + "products" + ] + } + } + }, + { + "name": "Get product (laptop)", + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{product_base}}/products/{{laptop_id}}", + "host": [ + "{{product_base}}" + ], + "path": [ + "products", + "{{laptop_id}}" + ] + } + } + }, + { + "name": "Reserve laptop", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{product_base}}/products/{{laptop_id}}/reserve", + "host": [ + "{{product_base}}" + ], + "path": [ + "products", + "{{laptop_id}}", + "reserve" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"quantity\": 1\n}" + } + } + }, + { + "name": "Release laptop", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{product_base}}/products/{{laptop_id}}/release", + "host": [ + "{{product_base}}" + ], + "path": [ + "products", + "{{laptop_id}}", + "release" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"quantity\": 1\n}" + } + } + } + ] + }, + { + "name": "Order Service", + "item": [ + { + "name": "Create order (laptop x1)", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Idempotency-Key", + "value": "{{idempotency_key}}" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{order_base}}/orders", + "host": [ + "{{order_base}}" + ], + "path": [ + "orders" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"userId\": \"{{last_user_id}}\",\n \"items\": [ { \"productId\": \"{{laptop_id}}\", \"quantity\": 1 } ],\n \"shippingAddressId\": \"{{last_address_id}}\"\n}" + } + }, + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "if (!pm.environment.get('idempotency_key')) { pm.environment.set('idempotency_key', pm.variables.replaceIn('{{$guid}}')); }" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test('order created', function(){ pm.expect([200,201]).to.include(pm.response.code); });", + "var j={}; try{ j=pm.response.json(); }catch(e){}; if (j.id){ pm.environment.set('last_order_id', j.id); }" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Create order (fallback default addr)", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Idempotency-Key", + "value": "{{idempotency_key}}" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{order_base}}/orders", + "host": [ + "{{order_base}}" + ], + "path": [ + "orders" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"userId\": \"{{last_user_id}}\",\n \"items\": [ { \"productId\": \"{{mouse_id}}\", \"quantity\": 1 } ]\n}" + } + }, + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "pm.environment.set('idempotency_key', pm.variables.replaceIn('{{$guid}}'));" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test('order created', function(){ pm.expect([200,201]).to.include(pm.response.code); });" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "List my orders", + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{order_base}}/orders?userId={{last_user_id}}&limit=5", + "host": [ + "{{order_base}}" + ], + "path": [ + "orders" + ], + "query": [ + { + "key": "userId", + "value": "{{last_user_id}}" + }, + { + "key": "limit", + "value": "5" + } + ] + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test('listed', function(){ pm.expect(pm.response.code).to.eql(200); });" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Get order", + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{order_base}}/orders/{{last_order_id}}", + "host": [ + "{{order_base}}" + ], + "path": [ + "orders", + "{{last_order_id}}" + ] + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test('got order', function(){ pm.expect(pm.response.code).to.eql(200); });" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Get order details (enriched)", + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{order_base}}/orders/{{last_order_id}}/details", + "host": [ + "{{order_base}}" + ], + "path": [ + "orders", + "{{last_order_id}}", + "details" + ] + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test('got details', function(){ pm.expect(pm.response.code).to.eql(200); });" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Pay order", + "request": { + "method": "POST", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{order_base}}/orders/{{last_order_id}}/pay", + "host": [ + "{{order_base}}" + ], + "path": [ + "orders", + "{{last_order_id}}", + "pay" + ] + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test('paid or already paid', function(){ pm.expect([200].concat([200])).to.include(pm.response.code); });" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Cancel order (expect 409 if paid)", + "request": { + "method": "POST", + "header": [ + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{order_base}}/orders/{{last_order_id}}/cancel", + "host": [ + "{{order_base}}" + ], + "path": [ + "orders", + "{{last_order_id}}", + "cancel" + ] + } + }, + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test('cancel response code', function(){ pm.expect([200,409,404]).to.include(pm.response.code); });" + ], + "type": "text/javascript" + } + } + ] + }, + { + "name": "Create order idempotent (mouse x2)", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Idempotency-Key", + "value": "{{idempotency_key}}" + }, + { + "key": "Authorization", + "value": "Bearer {{jwt}}" + } + ], + "url": { + "raw": "{{order_base}}/orders", + "host": [ + "{{order_base}}" + ], + "path": [ + "orders" + ] + }, + "body": { + "mode": "raw", + "raw": "{\n \"userId\": \"{{last_user_id}}\",\n \"items\": [ { \"productId\": \"{{mouse_id}}\", \"quantity\": 2 } ]\n}" + } + }, + "event": [ + { + "listen": "prerequest", + "script": { + "exec": [ + "if (!pm.environment.get('idempotency_key')) { pm.environment.set('idempotency_key', pm.variables.replaceIn('{{$guid}}')); }" + ], + "type": "text/javascript" + } + }, + { + "listen": "test", + "script": { + "exec": [ + "pm.test('order created idempotently', function(){ pm.expect([200,201]).to.include(pm.response.code); });" + ], + "type": "text/javascript" + } + } + ] + } + ] + } + ], + "variable": [ + { + "key": "gw_base", + "value": "http://localhost:8083" + }, + { + "key": "username", + "value": "alice" + }, + { + "key": "email", + "value": "alice@example.com" + }, + { + "key": "user_base", + "value": "http://localhost:8082/api/v1" + }, + { + "key": "product_base", + "value": "http://localhost:8081/api/v1" + }, + { + "key": "order_base", + "value": "http://localhost:8080/api/v1" + }, + { + "key": "jwt", + "value": "" + }, + { + "key": "last_user_id", + "value": "" + }, + { + "key": "laptop_id", + "value": "" + }, + { + "key": "mouse_id", + "value": "" + }, + { + "key": "idempotency_key", + "value": "" + } + ] +} \ No newline at end of file