{ "info": { "_postman_id": "c4e8a1b2-7f3d-4a9e-b6c1-2d8f9e0a1b2c", "name": "Mobile App Versions - Complete Flow", "description": "Complete collection for mobile app version management: public version check (Play Store / App Store) and admin CRUD with force vs optional update policies.", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "auth": { "type": "bearer", "bearer": [ { "key": "token", "value": "{{access_token}}", "type": "string" } ] }, "variable": [ { "key": "base_url", "value": "http://localhost:8080" }, { "key": "access_token", "value": "" }, { "key": "app_version_id", "value": "" }, { "key": "app_version_id_optional", "value": "" }, { "key": "client_version_code", "value": "10" } ], "item": [ { "name": "01 - Admin App Version CRUD", "item": [ { "name": "Create Android Version (FORCE update)", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 201\", function () {", " pm.response.to.have.status(201);", "});", "const body = pm.response.json();", "pm.test(\"App version ID exists\", function () {", " pm.expect(body.data.id).to.be.a(\"number\");", "});", "pm.test(\"Update type is FORCE\", function () {", " pm.expect(body.data.update_type).to.eql(\"FORCE\");", "});", "pm.collectionVariables.set(\"app_version_id\", body.data.id);" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json", "type": "text" } ], "body": { "mode": "raw", "raw": "{\n \"platform\": \"ANDROID\",\n \"version_name\": \"1.3.0\",\n \"version_code\": 15,\n \"update_type\": \"FORCE\",\n \"release_notes\": \"Critical security update and performance improvements.\",\n \"store_url\": \"https://play.google.com/store/apps/details?id=com.yimaru.app\",\n \"min_supported_version_code\": 12,\n \"status\": \"ACTIVE\"\n}" }, "url": { "raw": "{{base_url}}/api/v1/admin/app-versions", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions" ] } }, "response": [] }, { "name": "Create Android Version (OPTIONAL update)", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 201\", function () {", " pm.response.to.have.status(201);", "});", "const body = pm.response.json();", "pm.collectionVariables.set(\"app_version_id_optional\", body.data.id);" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json", "type": "text" } ], "body": { "mode": "raw", "raw": "{\n \"platform\": \"ANDROID\",\n \"version_name\": \"1.2.0\",\n \"version_code\": 12,\n \"update_type\": \"OPTIONAL\",\n \"release_notes\": \"Minor bug fixes.\",\n \"store_url\": \"https://play.google.com/store/apps/details?id=com.yimaru.app\",\n \"status\": \"ACTIVE\"\n}" }, "url": { "raw": "{{base_url}}/api/v1/admin/app-versions", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions" ] } }, "response": [] }, { "name": "Create iOS Version (OPTIONAL update)", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json", "type": "text" } ], "body": { "mode": "raw", "raw": "{\n \"platform\": \"IOS\",\n \"version_name\": \"1.3.0\",\n \"version_code\": 15,\n \"update_type\": \"OPTIONAL\",\n \"release_notes\": \"New lessons and UI polish.\",\n \"store_url\": \"https://apps.apple.com/app/id000000000\",\n \"status\": \"ACTIVE\"\n}" }, "url": { "raw": "{{base_url}}/api/v1/admin/app-versions", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions" ] } }, "response": [] }, { "name": "List App Versions (Admin - All)", "request": { "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/admin/app-versions?limit=20&offset=0", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions" ], "query": [ { "key": "limit", "value": "20" }, { "key": "offset", "value": "0" } ] } }, "response": [] }, { "name": "List App Versions (Admin - ANDROID only)", "request": { "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/admin/app-versions?platform=ANDROID&limit=20&offset=0", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions" ], "query": [ { "key": "platform", "value": "ANDROID" }, { "key": "limit", "value": "20" }, { "key": "offset", "value": "0" } ] } }, "response": [] }, { "name": "List App Versions (Admin - ACTIVE only)", "request": { "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/admin/app-versions?status=ACTIVE&limit=20&offset=0", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions" ], "query": [ { "key": "status", "value": "ACTIVE" }, { "key": "limit", "value": "20" }, { "key": "offset", "value": "0" } ] } }, "response": [] }, { "name": "Get App Version By ID (Admin)", "request": { "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/admin/app-versions/{{app_version_id}}", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions", "{{app_version_id}}" ] } }, "response": [] }, { "name": "Update App Version (Admin - change to OPTIONAL)", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});", "const body = pm.response.json();", "pm.test(\"Update type is OPTIONAL\", function () {", " pm.expect(body.data.update_type).to.eql(\"OPTIONAL\");", "});" ], "type": "text/javascript" } } ], "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json", "type": "text" } ], "body": { "mode": "raw", "raw": "{\n \"update_type\": \"OPTIONAL\",\n \"release_notes\": \"Updated policy: optional update for this release.\"\n}" }, "url": { "raw": "{{base_url}}/api/v1/admin/app-versions/{{app_version_id}}", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions", "{{app_version_id}}" ] } }, "response": [] }, { "name": "Update App Version (Admin - set INACTIVE)", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json", "type": "text" } ], "body": { "mode": "raw", "raw": "{\n \"status\": \"INACTIVE\"\n}" }, "url": { "raw": "{{base_url}}/api/v1/admin/app-versions/{{app_version_id_optional}}", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions", "{{app_version_id_optional}}" ] } }, "response": [] } ] }, { "name": "02 - Public Mobile Version Check", "item": [ { "name": "Check Version - Client up to date", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});", "const body = pm.response.json();", "pm.test(\"No update available\", function () {", " pm.expect(body.data.update_available).to.eql(false);", "});" ], "type": "text/javascript" } } ], "request": { "auth": { "type": "noauth" }, "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/app/version/check?platform=ANDROID&version_code=15", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "app", "version", "check" ], "query": [ { "key": "platform", "value": "ANDROID" }, { "key": "version_code", "value": "15" } ] } }, "response": [] }, { "name": "Check Version - Update available (optional)", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});", "const body = pm.response.json();", "pm.test(\"Update available\", function () {", " pm.expect(body.data.update_available).to.eql(true);", "});" ], "type": "text/javascript" } } ], "request": { "auth": { "type": "noauth" }, "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/app/version/check?platform=ANDROID&version_code={{client_version_code}}", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "app", "version", "check" ], "query": [ { "key": "platform", "value": "ANDROID" }, { "key": "version_code", "value": "{{client_version_code}}" } ] } }, "response": [] }, { "name": "Check Version - Force update (below min_supported)", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});", "const body = pm.response.json();", "pm.test(\"Force update required\", function () {", " pm.expect(body.data.force_update).to.eql(true);", "});" ], "type": "text/javascript" } } ], "request": { "auth": { "type": "noauth" }, "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/app/version/check?platform=ANDROID&version_code=5", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "app", "version", "check" ], "query": [ { "key": "platform", "value": "ANDROID" }, { "key": "version_code", "value": "5" } ] } }, "response": [] }, { "name": "Check Version - iOS", "request": { "auth": { "type": "noauth" }, "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/app/version/check?platform=IOS&version_code=10", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "app", "version", "check" ], "query": [ { "key": "platform", "value": "IOS" }, { "key": "version_code", "value": "10" } ] } }, "response": [] } ] }, { "name": "03 - Validation & Auth Errors", "item": [ { "name": "Create Version Missing platform - Expect 400", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json", "type": "text" } ], "body": { "mode": "raw", "raw": "{\n \"version_name\": \"1.0.0\",\n \"version_code\": 1,\n \"update_type\": \"OPTIONAL\"\n}" }, "url": { "raw": "{{base_url}}/api/v1/admin/app-versions", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions" ] } }, "response": [] }, { "name": "Create Version Invalid update_type - Expect 400", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json", "type": "text" } ], "body": { "mode": "raw", "raw": "{\n \"platform\": \"ANDROID\",\n \"version_name\": \"1.0.0\",\n \"version_code\": 1,\n \"update_type\": \"MANDATORY\"\n}" }, "url": { "raw": "{{base_url}}/api/v1/admin/app-versions", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions" ] } }, "response": [] }, { "name": "Check Version Missing platform - Expect 400", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" ], "type": "text/javascript" } } ], "request": { "auth": { "type": "noauth" }, "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/app/version/check?version_code=10", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "app", "version", "check" ], "query": [ { "key": "version_code", "value": "10" } ] } }, "response": [] }, { "name": "Check Version Invalid version_code - Expect 400", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 400\", function () {", " pm.response.to.have.status(400);", "});" ], "type": "text/javascript" } } ], "request": { "auth": { "type": "noauth" }, "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/app/version/check?platform=ANDROID&version_code=0", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "app", "version", "check" ], "query": [ { "key": "platform", "value": "ANDROID" }, { "key": "version_code", "value": "0" } ] } }, "response": [] }, { "name": "List Admin Versions Without Auth - Expect 401/403", "request": { "auth": { "type": "noauth" }, "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/admin/app-versions", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions" ] } }, "response": [] }, { "name": "Get Missing App Version (Admin) - Expect 404", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 404\", function () {", " pm.response.to.have.status(404);", "});" ], "type": "text/javascript" } } ], "request": { "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/v1/admin/app-versions/99999999", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions", "99999999" ] } }, "response": [] } ] }, { "name": "04 - Cleanup", "item": [ { "name": "Delete App Version (FORCE/updated)", "request": { "method": "DELETE", "header": [], "url": { "raw": "{{base_url}}/api/v1/admin/app-versions/{{app_version_id}}", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions", "{{app_version_id}}" ] } }, "response": [] }, { "name": "Delete App Version (OPTIONAL/inactive)", "request": { "method": "DELETE", "header": [], "url": { "raw": "{{base_url}}/api/v1/admin/app-versions/{{app_version_id_optional}}", "host": [ "{{base_url}}" ], "path": [ "api", "v1", "admin", "app-versions", "{{app_version_id_optional}}" ] } }, "response": [] } ] } ] }