{
	"info": {
		"_postman_id": "speedtest-collection-v2",
		"name": "Speed Test API - Complete Testing Suite v2.0",
		"description": "Collection completa per testare gli endpoint di speed test con il nuovo sistema di token temporanei.\n\n**Base URL:** http://localhost:5000\n\n**🆕 Nuove Funzionalità v2.0:**\n- Sistema token temporaneo per bypass rate limit\n- Statistiche dettagliate nelle risposte\n- Chunk size raccomandato\n- Rate limit aumentato (15 req/min)\n\n**Endpoints testati:**\n- GET /speedtest/start (NEW)\n- POST /speedtest/upload (aggiornato)\n- POST /speedtest/upload?token=xxx (NEW)\n- GET /speedtest/ping (aggiornato)\n- POST /speedtest/ping\n- Rate limiting (standard + token)\n- Error handling",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"variable": [
		{
			"key": "base_url",
			"value": "http://localhost:5000",
			"type": "string"
		},
		{
			"key": "server_url",
			"value": "https://apprecap.liverecap.it/recapweb/ws/",
			"type": "string",
			"disabled": true
		},
		{
			"key": "speedtest_token",
			"value": "",
			"type": "string"
		},
		{
			"key": "recommended_chunk_size",
			"value": "1048576",
			"type": "string"
		}
	],
	"item": [
		{
			"name": "0. Token System (NEW)",
			"item": [
				{
					"name": "Start Speed Test Session - Get Token",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.test(\"Response contains token\", function () {",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData).to.have.property('token');",
									"    pm.expect(jsonData.token).to.be.a('string');",
									"    pm.expect(jsonData.token).to.have.lengthOf.above(10);",
									"});",
									"",
									"pm.test(\"Response contains session info\", function () {",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData).to.have.property('expires');",
									"    pm.expect(jsonData).to.have.property('expiresAt');",
									"    pm.expect(jsonData).to.have.property('recommendedChunkSize');",
									"    pm.expect(jsonData).to.have.property('maxRequests');",
									"    ",
									"    pm.expect(jsonData.expires).to.equal(60);",
									"    pm.expect(jsonData.maxRequests).to.equal(20);",
									"    pm.expect(jsonData.recommendedChunkSize).to.equal(1048576); // 1 MB",
									"});",
									"",
									"// Salva token e chunk size per test successivi",
									"var jsonData = pm.response.json();",
									"pm.collectionVariables.set('speedtest_token', jsonData.token);",
									"pm.collectionVariables.set('recommended_chunk_size', jsonData.recommendedChunkSize);",
									"",
									"console.log('✅ Token obtained: ' + jsonData.token.substring(0, 20) + '...');",
									"console.log('📦 Recommended chunk size: ' + (jsonData.recommendedChunkSize / 1024 / 1024) + ' MB');",
									"console.log('⏱️ Expires in: ' + jsonData.expires + ' seconds');",
									"console.log('🔢 Max requests: ' + jsonData.maxRequests);"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/speedtest/start",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"start"
							]
						},
						"description": "🆕 Ottiene un token temporaneo per eseguire speed test senza rate limit.\n\n**Risposta:**\n```json\n{\n  \"token\": \"abc123...\",\n  \"expires\": 60,\n  \"expiresAt\": \"2024-01-15T10:30:00Z\",\n  \"recommendedChunkSize\": 1048576,\n  \"maxRequests\": 20\n}\n```\n\nIl token è valido per 60 secondi e permette fino a 20 richieste."
					},
					"response": []
				},
				{
					"name": "Start - Rate Limit Test (3 req/10s)",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"// Le prime 3 richieste dovrebbero avere successo",
									"// La 4a dovrebbe ricevere 429",
									"",
									"const requestNum = pm.globals.get('start_request_count') || 0;",
									"pm.globals.set('start_request_count', requestNum + 1);",
									"",
									"if (requestNum < 3) {",
									"    pm.test(`Request ${requestNum + 1}/4 should succeed`, function () {",
									"        pm.response.to.have.status(200);",
									"    });",
									"    console.log(`✅ Request ${requestNum + 1}/4: SUCCESS`);",
									"} else {",
									"    pm.test(\"Request 4/4 should be rate limited\", function () {",
									"        pm.response.to.have.status(429);",
									"    });",
									"    ",
									"    pm.test(\"Retry-After header exists\", function () {",
									"        pm.response.to.have.header('Retry-After');",
									"    });",
									"    ",
									"    console.log('🚫 Request 4/4: RATE LIMITED (expected)');",
									"    console.log('✅ /start rate limiting working correctly (3 req/10s)');",
									"    pm.globals.unset('start_request_count');",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/speedtest/start",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"start"
							]
						},
						"description": "Test del rate limit specifico per /start.\n\n**Esegui 4 volte rapidamente usando Collection Runner:**\n- Prime 3 richieste: 200 OK\n- 4a richiesta: 429 Too Many Requests"
					},
					"response": []
				}
			],
			"description": "🆕 Test del nuovo sistema di token temporaneo per speed test avanzati"
		},
		{
			"name": "1. Ping Tests",
			"item": [
				{
					"name": "Ping - GET (Simple)",
					"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 () {",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData).to.have.property('ok');",
									"    pm.expect(jsonData).to.have.property('timestamp');",
									"    pm.expect(jsonData).to.have.property('recommendedChunkSize');",
									"    ",
									"    pm.expect(jsonData.ok).to.be.true;",
									"    pm.expect(jsonData.timestamp).to.be.a('number');",
									"    pm.expect(jsonData.recommendedChunkSize).to.equal(1048576);",
									"});",
									"",
									"pm.test(\"X-Recommended-Chunk-Size header exists\", function () {",
									"    pm.response.to.have.header('X-Recommended-Chunk-Size');",
									"    pm.expect(pm.response.headers.get('X-Recommended-Chunk-Size')).to.equal('1048576');",
									"});",
									"",
									"pm.test(\"Response time is less than 500ms\", function () {",
									"    pm.expect(pm.response.responseTime).to.be.below(500);",
									"});",
									"",
									"console.log(`📡 Latency: ${pm.response.responseTime}ms`);",
									"console.log(`📦 Recommended chunk: ${pm.response.json().recommendedChunkSize / 1024 / 1024}MB`);"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/speedtest/ping",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"ping"
							]
						},
						"description": "Test base dell'endpoint ping. Verifica:\n- Status 200 OK\n- Campo 'ok', 'timestamp', 'recommendedChunkSize'\n- Header 'X-Recommended-Chunk-Size'\n- Latenza < 500ms"
					},
					"response": []
				},
				{
					"name": "Ping - POST",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.test(\"Response structure is correct\", function () {",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData.ok).to.be.true;",
									"    pm.expect(jsonData.timestamp).to.be.a('number');",
									"    pm.expect(jsonData.recommendedChunkSize).to.equal(1048576);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [],
						"url": {
							"raw": "{{base_url}}/speedtest/ping",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"ping"
							]
						},
						"description": "Test endpoint ping con metodo POST (per compatibilità client)"
					},
					"response": []
				},
				{
					"name": "Ping - Multiple Requests (Latency Test)",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"// Colleziona tempi di risposta",
									"let pings = pm.globals.get('ping_times');",
									"if (!pings) {",
									"    pings = [];",
									"}",
									"pings.push(pm.response.responseTime);",
									"pm.globals.set('ping_times', JSON.stringify(pings));",
									"",
									"// Se abbiamo 5 ping, calcola statistiche",
									"if (pings.length >= 5) {",
									"    const avg = pings.reduce((a, b) => a + b) / pings.length;",
									"    const min = Math.min(...pings);",
									"    const max = Math.max(...pings);",
									"    const jitter = max - min;",
									"    ",
									"    console.log('=================================');",
									"    console.log('📊 LATENCY STATISTICS (5 pings)');",
									"    console.log('=================================');",
									"    console.log(`  Average: ${avg.toFixed(2)}ms`);",
									"    console.log(`  Min: ${min}ms`);",
									"    console.log(`  Max: ${max}ms`);",
									"    console.log(`  Jitter: ${jitter}ms`);",
									"    console.log('=================================');",
									"    ",
									"    pm.globals.unset('ping_times');",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/speedtest/ping",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"ping"
							]
						},
						"description": "Esegui questo test 5 volte usando il Collection Runner per ottenere statistiche di latenza.\n\n**Istruzioni:**\n1. Apri Collection Runner\n2. Seleziona questa richiesta\n3. Imposta Iterations: 5\n4. Imposta Delay: 500ms\n5. Run"
					},
					"response": []
				}
			],
			"description": "Test degli endpoint ping per misurare latenza (RTT)"
		},
		{
			"name": "2. Upload Tests (Standard - No Token)",
			"item": [
				{
					"name": "Upload - Small (100 KB)",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.test(\"Response confirms upload\", function () {",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData.ok).to.be.true;",
									"    pm.expect(jsonData).to.have.property('bytesReceived');",
									"    pm.expect(jsonData).to.have.property('serverProcessingMs');",
									"    pm.expect(jsonData).to.not.have.property('remainingRequests'); // No token",
									"});",
									"",
									"// Calcola velocità upload",
									"const sizeBytes = 100 * 1024;",
									"const timeSeconds = pm.response.responseTime / 1000;",
									"const speedMbps = (sizeBytes * 8) / (timeSeconds * 1000000);",
									"",
									"console.log(`📤 Upload Speed: ${speedMbps.toFixed(2)} Mbps`);",
									"console.log(`📦 Size: 100 KB`);",
									"console.log(`⏱️ Time: ${timeSeconds.toFixed(3)}s`);",
									"console.log(`⚙️ Server Processing: ${pm.response.json().serverProcessingMs}ms`);"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/octet-stream",
								"type": "text"
							}
						],
						"body": {
							"mode": "file",
							"file": {}
						},
						"url": {
							"raw": "{{base_url}}/speedtest/upload",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"upload"
							]
						},
						"description": "Test upload con file piccolo (100 KB) senza token.\n\n**Nota:** Seleziona un file qualsiasi di ~100KB nella sezione Body > Binary"
					},
					"response": []
				},
				{
					"name": "Upload - Medium (1 MB)",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.test(\"Upload successful with stats\", function () {",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData.ok).to.be.true;",
									"    pm.expect(jsonData.bytesReceived).to.be.above(0);",
									"});",
									"",
									"const sizeBytes = 1 * 1024 * 1024;",
									"const timeSeconds = pm.response.responseTime / 1000;",
									"const speedMbps = (sizeBytes * 8) / (timeSeconds * 1000000);",
									"",
									"console.log(`📤 Upload Speed: ${speedMbps.toFixed(2)} Mbps`);"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/octet-stream",
								"type": "text"
							}
						],
						"body": {
							"mode": "file",
							"file": {}
						},
						"url": {
							"raw": "{{base_url}}/speedtest/upload",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"upload"
							]
						},
						"description": "Test upload con file medio (1 MB).\n\n**Nota:** Seleziona un file di ~1MB"
					},
					"response": []
				}
			],
			"description": "Test upload senza token (rate limit standard: 15 req/min)"
		},
		{
			"name": "3. Upload Tests with Token (NEW)",
			"item": [
				{
					"name": "Upload with Token - 1 MB (Recommended Size)",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.test(\"Response contains detailed stats\", function () {",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData.ok).to.be.true;",
									"    pm.expect(jsonData).to.have.property('bytesReceived');",
									"    pm.expect(jsonData).to.have.property('serverProcessingMs');",
									"    pm.expect(jsonData).to.have.property('remainingRequests');",
									"    ",
									"    pm.expect(jsonData.remainingRequests).to.be.at.most(20);",
									"    pm.expect(jsonData.bytesReceived).to.be.above(0);",
									"});",
									"",
									"var jsonData = pm.response.json();",
									"const sizeBytes = jsonData.bytesReceived;",
									"const timeSeconds = pm.response.responseTime / 1000;",
									"const speedMbps = (sizeBytes * 8) / (timeSeconds * 1000000);",
									"",
									"console.log('=================================');",
									"console.log('📊 UPLOAD TEST WITH TOKEN');",
									"console.log('=================================');",
									"console.log(`📤 Upload Speed: ${speedMbps.toFixed(2)} Mbps`);",
									"console.log(`📦 Bytes Received: ${sizeBytes}`);",
									"console.log(`⏱️ Total Time: ${timeSeconds.toFixed(3)}s`);",
									"console.log(`⚙️ Server Processing: ${jsonData.serverProcessingMs}ms`);",
									"console.log(`🔢 Remaining Requests: ${jsonData.remainingRequests}/20`);",
									"console.log('=================================');"
								],
								"type": "text/javascript"
							}
						},
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									"// Verifica che il token sia presente",
									"const token = pm.collectionVariables.get('speedtest_token');",
									"if (!token || token === '') {",
									"    console.error('❌ Token not found! Run \"Start Speed Test Session\" first.');",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/octet-stream",
								"type": "text"
							}
						],
						"body": {
							"mode": "file",
							"file": {}
						},
						"url": {
							"raw": "{{base_url}}/speedtest/upload?token={{speedtest_token}}",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"upload"
							],
							"query": [
								{
									"key": "token",
									"value": "{{speedtest_token}}"
								}
							]
						},
						"description": "🆕 Upload con token temporaneo - bypassa il rate limit!\n\n**Prima di eseguire:**\n1. Esegui \"Start Speed Test Session\" per ottenere un token\n2. Seleziona un file da 1 MB (recommended chunk size)\n\n**Risposta attesa:**\n```json\n{\n  \"ok\": true,\n  \"bytesReceived\": 1048576,\n  \"serverProcessingMs\": 15,\n  \"remainingRequests\": 19\n}\n```"
					},
					"response": []
				},
				{
					"name": "Upload with Token - Multiple Requests Test",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"const iteration = pm.globals.get('token_upload_iteration') || 0;",
									"pm.globals.set('token_upload_iteration', iteration + 1);",
									"",
									"pm.test(`Upload ${iteration + 1}/10 successful`, function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.test(\"Remaining requests decreasing\", function () {",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData.remainingRequests).to.be.at.most(20 - iteration);",
									"});",
									"",
									"// Salva velocità per calcolo media",
									"let speeds = pm.globals.get('upload_speeds');",
									"if (!speeds) speeds = [];",
									"",
									"const jsonData = pm.response.json();",
									"const sizeBytes = jsonData.bytesReceived;",
									"const timeSeconds = pm.response.responseTime / 1000;",
									"const speedMbps = (sizeBytes * 8) / (timeSeconds * 1000000);",
									"speeds.push(speedMbps);",
									"",
									"pm.globals.set('upload_speeds', JSON.stringify(speeds));",
									"",
									"console.log(`✅ Upload ${iteration + 1}/10: ${speedMbps.toFixed(2)} Mbps | Remaining: ${jsonData.remainingRequests}`);",
									"",
									"// Se è l'ultima iterazione, calcola statistiche",
									"if (iteration >= 9) {",
									"    const avg = speeds.reduce((a, b) => a + b) / speeds.length;",
									"    const min = Math.min(...speeds);",
									"    const max = Math.max(...speeds);",
									"    ",
									"    console.log('');",
									"    console.log('=================================');",
									"    console.log('📊 UPLOAD SPEED TEST RESULTS');",
									"    console.log('=================================');",
									"    console.log(`  Samples: ${speeds.length}`);",
									"    console.log(`  Average: ${avg.toFixed(2)} Mbps`);",
									"    console.log(`  Min: ${min.toFixed(2)} Mbps`);",
									"    console.log(`  Max: ${max.toFixed(2)} Mbps`);",
									"    console.log('=================================');",
									"    ",
									"    pm.globals.unset('token_upload_iteration');",
									"    pm.globals.unset('upload_speeds');",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/octet-stream",
								"type": "text"
							}
						],
						"body": {
							"mode": "file",
							"file": {}
						},
						"url": {
							"raw": "{{base_url}}/speedtest/upload?token={{speedtest_token}}",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"upload"
							],
							"query": [
								{
									"key": "token",
									"value": "{{speedtest_token}}"
								}
							]
						},
						"description": "Test completo con 10 upload rapidi usando il token.\n\n**Istruzioni:**\n1. Esegui \"Start Speed Test Session\"\n2. Seleziona file da 1 MB\n3. Esegui questo test 10 volte con Collection Runner\n4. Delay: 300ms\n\n**Risultato:**\nStatistiche complete di upload speed (avg, min, max)"
					},
					"response": []
				},
				{
					"name": "Upload with Invalid Token",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 401 Unauthorized\", function () {",
									"    pm.response.to.have.status(401);",
									"});",
									"",
									"pm.test(\"Error message is correct\", function () {",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData.ok).to.be.false;",
									"    pm.expect(jsonData.error).to.equal('Invalid token');",
									"    pm.expect(jsonData.message).to.include('/speedtest/start');",
									"});",
									"",
									"console.log('✅ Invalid token correctly rejected');"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/octet-stream",
								"type": "text"
							}
						],
						"body": {
							"mode": "file",
							"file": {}
						},
						"url": {
							"raw": "{{base_url}}/speedtest/upload?token=invalid_token_12345",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"upload"
							],
							"query": [
								{
									"key": "token",
									"value": "invalid_token_12345"
								}
							]
						},
						"description": "Test con token non valido - dovrebbe ricevere 401 Unauthorized"
					},
					"response": []
				}
			],
			"description": "🆕 Test upload con sistema token (20 req/60s, no rate limit intermedio)"
		},
		{
			"name": "4. Rate Limiting Tests (Updated)",
			"item": [
				{
					"name": "Rate Limit Standard - Test Complete",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"const requestNum = pm.globals.get('rate_limit_count') || 0;",
									"pm.globals.set('rate_limit_count', requestNum + 1);",
									"",
									"// Prime 15 richieste: OK, poi 429",
									"if (requestNum < 15) {",
									"    pm.test(`Request ${requestNum + 1}/17 should succeed`, function () {",
									"        pm.response.to.have.status(200);",
									"    });",
									"    console.log(`✅ Request ${requestNum + 1}/17: OK`);",
									"} else {",
									"    pm.test(`Request ${requestNum + 1}/17 should be rate limited`, function () {",
									"        pm.response.to.have.status(429);",
									"    });",
									"    ",
									"    pm.test(\"Retry-After header exists\", function () {",
									"        pm.response.to.have.header('Retry-After');",
									"    });",
									"    ",
									"    pm.test(\"Error message suggests using token\", function () {",
									"        var jsonData = pm.response.json();",
									"        pm.expect(jsonData.message).to.include('/speedtest/start');",
									"        pm.expect(jsonData.message).to.include('token');",
									"    });",
									"    ",
									"    console.log(`🚫 Request ${requestNum + 1}/17: RATE LIMITED`);",
									"    ",
									"    if (requestNum >= 16) {",
									"        console.log('');",
									"        console.log('=================================');",
									"        console.log('✅ RATE LIMITING TEST PASSED');",
									"        console.log('=================================');",
									"        console.log('  Standard limit: 15 req/min');",
									"        console.log('  Allowed: 15 requests');",
									"        console.log('  Blocked: 2 requests');",
									"        console.log('  Suggestion: Use token system');",
									"        console.log('=================================');",
									"        pm.globals.unset('rate_limit_count');",
									"    }",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/speedtest/ping",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"ping"
							]
						},
						"description": "Test completo del rate limit standard (aumentato a 15 req/min).\n\n**Esegui con Collection Runner:**\n- Iterations: 17\n- Delay: 100ms\n\n**Risultato atteso:**\n- Prime 15 richieste: 200 OK\n- Ultime 2 richieste: 429 Too Many Requests"
					},
					"response": []
				}
			],
			"description": "Test del rate limiting aggiornato (15 req/min standard)"
		},
		{
			"name": "5. Error Handling Tests",
			"item": [
				{
					"name": "Upload - Payload Too Large (should fail)",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 400 Bad Request\", function () {",
									"    pm.response.to.have.status(400);",
									"});",
									"",
									"pm.test(\"Error message indicates size limit\", function () {",
									"    var jsonData = pm.response.json();",
									"    pm.expect(jsonData.ok).to.be.false;",
									"    pm.expect(jsonData.error).to.include('exceeds');",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/octet-stream",
								"type": "text"
							}
						],
						"body": {
							"mode": "file",
							"file": {}
						},
						"url": {
							"raw": "{{base_url}}/speedtest/upload",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"upload"
							]
						},
						"description": "Testa il limite di dimensione massima.\n\n**Nota:** Seleziona un file > 30 MB"
					},
					"response": []
				},
				{
					"name": "Invalid Endpoint",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 404 Not Found\", function () {",
									"    pm.response.to.have.status(404);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/speedtest/invalid",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"invalid"
							]
						},
						"description": "Test endpoint inesistente"
					},
					"response": []
				}
			],
			"description": "Test di gestione errori e casi limite"
		},
		{
			"name": "6. Complete Speed Test Workflow",
			"item": [
				{
					"name": "1. Get Token",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Token obtained\", function () {",
									"    pm.response.to.have.status(200);",
									"    var jsonData = pm.response.json();",
									"    pm.collectionVariables.set('speedtest_token', jsonData.token);",
									"    console.log('✅ Step 1/3: Token obtained');",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/speedtest/start",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"start"
							]
						}
					},
					"response": []
				},
				{
					"name": "2. Measure Latency",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Latency measured\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.collectionVariables.set('latency_ms', pm.response.responseTime);",
									"console.log(`✅ Step 2/3: Latency = ${pm.response.responseTime}ms`);"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/speedtest/ping",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"ping"
							]
						}
					},
					"response": []
				},
				{
					"name": "3. Measure Upload Speed",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Upload completed\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"const jsonData = pm.response.json();",
									"const sizeBytes = jsonData.bytesReceived;",
									"const timeSeconds = pm.response.responseTime / 1000;",
									"const speedMbps = (sizeBytes * 8) / (timeSeconds * 1000000);",
									"",
									"console.log('✅ Step 3/3: Upload completed');",
									"console.log('');",
									"console.log('=================================');",
									"console.log('🎯 COMPLETE SPEED TEST RESULTS');",
									"console.log('=================================');",
									"console.log(`📡 Latency: ${pm.collectionVariables.get('latency_ms')}ms`);",
									"console.log(`📤 Upload Speed: ${speedMbps.toFixed(2)} Mbps`);",
									"console.log(`📦 Data Sent: ${(sizeBytes / 1024 / 1024).toFixed(2)} MB`);",
									"console.log(`⚙️ Server Processing: ${jsonData.serverProcessingMs}ms`);",
									"console.log('=================================');"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/octet-stream"
							}
						],
						"body": {
							"mode": "file",
							"file": {}
						},
						"url": {
							"raw": "{{base_url}}/speedtest/upload?token={{speedtest_token}}",
							"host": [
								"{{base_url}}"
							],
							"path": [
								"speedtest",
								"upload"
							],
							"query": [
								{
									"key": "token",
									"value": "{{speedtest_token}}"
								}
							]
						}
					},
					"response": []
				}
			],
			"description": "🎯 Workflow completo di speed test:\n1. Ottieni token\n2. Misura latenza\n3. Misura upload speed\n\n**Esegui con Collection Runner** per risultati automatici."
		}
	],
	"event": [
		{
			"listen": "prerequest",
			"script": {
				"type": "text/javascript",
				"exec": [
					"// Script globale eseguito prima di ogni richiesta",
					"pm.globals.set('request_timestamp', Date.now());"
				]
			}
		},
		{
			"listen": "test",
			"script": {
				"type": "text/javascript",
				"exec": [
					"// Script globale eseguito dopo ogni richiesta",
					"// Log automatico del response time",
					"// console.log(`⏱️ Response Time: ${pm.response.responseTime}ms`);"
				]
			}
		}
	]
}
