{ "info": { "_postman_id": "blog-backend-collection", "name": "Rust Blog Backend API", "description": "API collection for testing the Rust Blog Backend", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "variable": [ { "key": "base_url", "value": "http://127.0.0.1:8080", "type": "string" }, { "key": "token", "value": "", "type": "string" }, { "key": "post_id", "value": "", "type": "string" } ], "item": [ { "name": "Auth", "item": [ { "name": "Register", "event": [ { "listen": "test", "script": { "exec": [ "if (pm.response.code === 201) {", " var jsonData = pm.response.json();", " pm.collectionVariables.set('token', jsonData.token);", " console.log('Token saved:', jsonData.token);", "}" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"email\": \"test@example.com\",\n \"password\": \"password123\"\n}" }, "url": { "raw": "{{base_url}}/api/auth/register", "host": ["{{base_url}}"], "path": ["api", "auth", "register"] }, "description": "Register a new user. Saves the JWT token automatically." }, "response": [] }, { "name": "Login", "event": [ { "listen": "test", "script": { "exec": [ "if (pm.response.code === 200) {", " var jsonData = pm.response.json();", " pm.collectionVariables.set('token', jsonData.token);", " console.log('Token saved:', jsonData.token);", "}" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"email\": \"test@example.com\",\n \"password\": \"password123\"\n}" }, "url": { "raw": "{{base_url}}/api/auth/login", "host": ["{{base_url}}"], "path": ["api", "auth", "login"] }, "description": "Login with existing credentials. Saves the JWT token automatically." }, "response": [] } ], "description": "Authentication endpoints" }, { "name": "Posts", "item": [ { "name": "Create Post", "event": [ { "listen": "test", "script": { "exec": [ "if (pm.response.code === 201) {", " var jsonData = pm.response.json();", " pm.collectionVariables.set('post_id', jsonData.id);", " console.log('Post ID saved:', jsonData.id);", "}" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{token}}" } ], "body": { "mode": "raw", "raw": "{\n \"title\": \"My First Blog Post\",\n \"content\": \"This is the content of my first blog post. It contains some interesting text about Rust programming.\",\n \"published\": true\n}" }, "url": { "raw": "{{base_url}}/api/posts", "host": ["{{base_url}}"], "path": ["api", "posts"] }, "description": "Create a new blog post. Requires authentication." }, "response": [] }, { "name": "Create Draft Post", "event": [ { "listen": "test", "script": { "exec": [ "if (pm.response.code === 201) {", " var jsonData = pm.response.json();", " console.log('Draft Post ID:', jsonData.id);", "}" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{token}}" } ], "body": { "mode": "raw", "raw": "{\n \"title\": \"Draft Post - Work in Progress\",\n \"content\": \"This is a draft post that is not yet published.\",\n \"published\": false\n}" }, "url": { "raw": "{{base_url}}/api/posts", "host": ["{{base_url}}"], "path": ["api", "posts"] }, "description": "Create a draft post (not published). Requires authentication." }, "response": [] }, { "name": "List Posts", "request": { "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/posts?page=1&limit=10", "host": ["{{base_url}}"], "path": ["api", "posts"], "query": [ { "key": "page", "value": "1", "description": "Page number (default: 1)" }, { "key": "limit", "value": "10", "description": "Items per page (default: 10, max: 50)" } ] }, "description": "List all published posts with pagination. No authentication required." }, "response": [] }, { "name": "List Posts (Page 2)", "request": { "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/posts?page=2&limit=5", "host": ["{{base_url}}"], "path": ["api", "posts"], "query": [ { "key": "page", "value": "2" }, { "key": "limit", "value": "5" } ] }, "description": "List posts - second page with 5 items per page." }, "response": [] }, { "name": "Get Post by ID", "request": { "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/posts/{{post_id}}", "host": ["{{base_url}}"], "path": ["api", "posts", "{{post_id}}"] }, "description": "Get a single post by ID. No authentication required." }, "response": [] }, { "name": "Update Post", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{token}}" } ], "body": { "mode": "raw", "raw": "{\n \"title\": \"Updated Blog Post Title\",\n \"content\": \"This content has been updated with new information.\"\n}" }, "url": { "raw": "{{base_url}}/api/posts/{{post_id}}", "host": ["{{base_url}}"], "path": ["api", "posts", "{{post_id}}"] }, "description": "Update an existing post. Requires authentication and ownership." }, "response": [] }, { "name": "Update Post (Publish)", "request": { "method": "PUT", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{token}}" } ], "body": { "mode": "raw", "raw": "{\n \"published\": true\n}" }, "url": { "raw": "{{base_url}}/api/posts/{{post_id}}", "host": ["{{base_url}}"], "path": ["api", "posts", "{{post_id}}"] }, "description": "Publish a draft post. Only updates the published field." }, "response": [] }, { "name": "Delete Post", "request": { "method": "DELETE", "header": [ { "key": "Authorization", "value": "Bearer {{token}}" } ], "url": { "raw": "{{base_url}}/api/posts/{{post_id}}", "host": ["{{base_url}}"], "path": ["api", "posts", "{{post_id}}"] }, "description": "Soft delete a post. Requires authentication and ownership." }, "response": [] } ], "description": "Blog post CRUD endpoints" }, { "name": "Upload", "item": [ { "name": "Upload Image", "request": { "method": "POST", "header": [ { "key": "Authorization", "value": "Bearer {{token}}" } ], "body": { "mode": "formdata", "formdata": [ { "key": "file", "type": "file", "src": "", "description": "Select a JPG, JPEG, PNG, or WebP image (max 5MB)" } ] }, "url": { "raw": "{{base_url}}/api/upload", "host": ["{{base_url}}"], "path": ["api", "upload"] }, "description": "Upload an image file. Requires authentication. Allowed types: jpg, jpeg, png, webp. Max size: 5MB." }, "response": [] } ], "description": "File upload endpoint" }, { "name": "Error Cases", "item": [ { "name": "Register - Invalid Email", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"email\": \"invalid-email\",\n \"password\": \"password123\"\n}" }, "url": { "raw": "{{base_url}}/api/auth/register", "host": ["{{base_url}}"], "path": ["api", "auth", "register"] }, "description": "Test validation: invalid email format" }, "response": [] }, { "name": "Register - Short Password", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"email\": \"test2@example.com\",\n \"password\": \"short\"\n}" }, "url": { "raw": "{{base_url}}/api/auth/register", "host": ["{{base_url}}"], "path": ["api", "auth", "register"] }, "description": "Test validation: password too short (min 8 chars)" }, "response": [] }, { "name": "Login - Wrong Password", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"email\": \"test@example.com\",\n \"password\": \"wrongpassword\"\n}" }, "url": { "raw": "{{base_url}}/api/auth/login", "host": ["{{base_url}}"], "path": ["api", "auth", "login"] }, "description": "Test: wrong password returns 401" }, "response": [] }, { "name": "Create Post - No Auth", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"title\": \"Unauthorized Post\",\n \"content\": \"This should fail\",\n \"published\": true\n}" }, "url": { "raw": "{{base_url}}/api/posts", "host": ["{{base_url}}"], "path": ["api", "posts"] }, "description": "Test: creating post without auth returns 401" }, "response": [] }, { "name": "Get Post - Not Found", "request": { "method": "GET", "header": [], "url": { "raw": "{{base_url}}/api/posts/non-existent-id", "host": ["{{base_url}}"], "path": ["api", "posts", "non-existent-id"] }, "description": "Test: getting non-existent post returns 404" }, "response": [] }, { "name": "Create Post - Empty Title", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{token}}" } ], "body": { "mode": "raw", "raw": "{\n \"title\": \"\",\n \"content\": \"Content without title\",\n \"published\": true\n}" }, "url": { "raw": "{{base_url}}/api/posts", "host": ["{{base_url}}"], "path": ["api", "posts"] }, "description": "Test validation: empty title returns 400" }, "response": [] } ], "description": "Test error cases and validation" } ] }