{
  "testReport": {
    "endpoint": "/api/search/token",
    "method": "POST",
    "baseUrl": "http://localhost:8001",
    "testTimestamp": "2025-10-19T15:39:01Z",
    "testExecutor": "curl",
    "serverStatus": "running"
  },
  "testResults": [
    {
      "testId": "test-1",
      "name": "Basic POST with expiresIn parameter",
      "description": "Test token generation with custom expiry time",
      "request": {
        "method": "POST",
        "url": "http://localhost:8001/api/search/token",
        "headers": {
          "Content-Type": "application/json"
        },
        "body": {
          "expiresIn": 3600
        }
      },
      "response": {
        "statusCode": 200,
        "headers": {
          "Content-Type": "application/json"
        },
        "body": {
          "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZWFyY2hSdWxlcyI6eyJuYXZpZG9jcy1wYWdlcyI6eyJmaWx0ZXIiOiJ1c2VySWQgPSBcInRlc3QtdXNlci1pZFwiIE9SIG9yZ2FuaXphdGlvbklkIElOIFtcIm9yZy10ZXN0LTFcIiwgXCJ0ZXN0LW9yZy1pZFwiXSJ9fSwiYXBpS2V5VWlkIjoiYTEzMWQzYzYtNGNjOS00ZTFlLWI3ZDQtMGMzZjQ0MmQ1ODYyIiwiZXhwIjoxNzYwODkxOTQxfQ.0xH-qhfFT9kAoY1rfYOKoKUOheUlr97_xb2tem7gyk8",
          "expiresAt": "2025-10-19T16:39:01.106Z",
          "expiresIn": 3600,
          "indexName": "navidocs-pages",
          "searchUrl": "http://127.0.0.1:7700",
          "mode": "tenant"
        }
      },
      "validation": {
        "statusCode": {
          "expected": 200,
          "actual": 200,
          "passed": true
        },
        "responseStructure": {
          "hasToken": true,
          "hasIndexName": true,
          "hasMode": true,
          "hasExpiresAt": true,
          "hasSearchUrl": true,
          "allFieldsPresent": true
        },
        "tokenValidation": {
          "isString": true,
          "isNotEmpty": true,
          "length": 343,
          "format": "JWT",
          "isValidJWT": true
        },
        "mode": {
          "expected": "tenant",
          "actual": "tenant",
          "passed": true,
          "description": "Using Meilisearch tenant tokens with multi-tenant filtering"
        },
        "indexName": {
          "expected": "navidocs-pages",
          "actual": "navidocs-pages",
          "passed": true
        },
        "expiresIn": {
          "requested": 3600,
          "actual": 3600,
          "passed": true
        }
      },
      "jwtAnalysis": {
        "header": {
          "alg": "HS256",
          "typ": "JWT"
        },
        "payload": {
          "searchRules": {
            "navidocs-pages": {
              "filter": "userId = \"test-user-id\" OR organizationId IN [\"org-test-1\", \"test-org-id\"]"
            }
          },
          "apiKeyUid": "a131d3c6-4cc9-4e1e-b7d4-0c3f442d5862",
          "exp": 1760891941
        },
        "signature": "0xH-qhfFT9kAoY1rfYOKoKUOheUlr97_xb2tem7gyk8"
      },
      "result": "PASSED"
    },
    {
      "testId": "test-2",
      "name": "POST with empty body (default expiresIn)",
      "description": "Test token generation using default expiry time",
      "request": {
        "method": "POST",
        "url": "http://localhost:8001/api/search/token",
        "headers": {
          "Content-Type": "application/json"
        },
        "body": {}
      },
      "response": {
        "statusCode": 200,
        "body": {
          "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZWFyY2hSdWxlcyI6eyJuYXZpZG9jcy1wYWdlcyI6eyJmaWx0ZXIiOiJ1c2VySWQgPSBcInRlc3QtdXNlci1pZFwiIE9SIG9yZ2FuaXphdGlvbklkIElOIFtcIm9yZy10ZXN0LTFcIiwgXCJ0ZXN0LW9yZy1pZFwiXSJ9fSwiYXBpS2V5VWlkIjoiYTEzMWQzYzYtNGNjOS00ZTFlLWI3ZDQtMGMzZjQ0MmQ1ODYyIiwiZXhwIjoxNzYwODkxOTQxfQ.0xH-qhfFT9kAoY1rfYOKoKUOheUlr97_xb2tem7gyk8",
          "expiresAt": "2025-10-19T16:39:01.119Z",
          "expiresIn": 3600,
          "indexName": "navidocs-pages",
          "searchUrl": "http://127.0.0.1:7700",
          "mode": "tenant"
        }
      },
      "validation": {
        "statusCode": {
          "expected": 200,
          "actual": 200,
          "passed": true
        },
        "defaultExpiry": {
          "expected": 3600,
          "actual": 3600,
          "passed": true,
          "description": "Default expiry of 1 hour (3600 seconds) applied correctly"
        },
        "mode": {
          "actual": "tenant",
          "passed": true
        }
      },
      "result": "PASSED"
    },
    {
      "testId": "test-3",
      "name": "Maximum expiry enforcement",
      "description": "Test that excessive expiry values are capped at 24 hours",
      "request": {
        "method": "POST",
        "url": "http://localhost:8001/api/search/token",
        "headers": {
          "Content-Type": "application/json"
        },
        "body": {
          "expiresIn": 999999
        }
      },
      "response": {
        "statusCode": 200,
        "body": {
          "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZWFyY2hSdWxlcyI6eyJuYXZpZG9jcy1wYWdlcyI6eyJmaWx0ZXIiOiJ1c2VySWQgPSBcInRlc3QtdXNlci1pZFwiIE9SIG9yZ2FuaXphdGlvbklkIElOIFtcIm9yZy10ZXN0LTFcIiwgXCJ0ZXN0LW9yZy1pZFwiXSJ9fSwiYXBpS2V5VWlkIjoiYTEzMWQzYzYtNGNjOS00ZTFlLWI3ZDQtMGMzZjQ0MmQ1ODYyIiwiZXhwIjoxNzYwOTc0NzQxfQ.QWk9hb0ls2Yp2DC7YPRAq9Z_CP4MSm9DGNvnhux7FkY",
          "expiresAt": "2025-10-20T15:39:01.133Z",
          "expiresIn": 86400,
          "indexName": "navidocs-pages",
          "searchUrl": "http://127.0.0.1:7700",
          "mode": "tenant"
        }
      },
      "validation": {
        "statusCode": {
          "expected": 200,
          "actual": 200,
          "passed": true
        },
        "expiryEnforcement": {
          "requested": 999999,
          "maxAllowed": 86400,
          "actual": 86400,
          "passed": true,
          "description": "Expiry correctly capped at 24 hours (86400 seconds)"
        },
        "mode": {
          "actual": "tenant",
          "passed": true
        }
      },
      "result": "PASSED"
    }
  ],
  "fallbackTesting": {
    "tested": false,
    "reason": "Tenant token generation succeeded in all tests, fallback not triggered",
    "fallbackMechanism": {
      "description": "When tenant token generation fails, the endpoint falls back to using MEILISEARCH_SEARCH_KEY environment variable or fetches a search API key from Meilisearch",
      "mode": "search-key",
      "available": true,
      "configuredInEnv": true
    },
    "note": "Fallback mechanism exists in code (lines 50-66 in /home/setup/navidocs/server/routes/search.js) but was not triggered during testing"
  },
  "summary": {
    "totalTests": 3,
    "passedTests": 3,
    "failedTests": 0,
    "successRate": "100%",
    "overallResult": "SUCCESS",
    "tokenMode": "tenant",
    "tokenModeDescription": "All tokens generated using tenant mode with proper multi-tenant filtering",
    "criticalFindings": [],
    "observations": [
      "All tests returned HTTP 200 status code",
      "All responses contained required fields: token, indexName, mode, expiresAt, searchUrl",
      "Token mode is 'tenant' indicating proper multi-tenant security is active",
      "Tokens are valid JWT format with HS256 algorithm",
      "Default expiry (1 hour) applied when not specified",
      "Maximum expiry enforcement working (24 hour cap)",
      "Token payload includes proper search rules with user/org filtering",
      "Index name correctly set to 'navidocs-pages'"
    ],
    "recommendations": [
      "Endpoint is functioning correctly and ready for production use",
      "Consider testing the fallback mechanism explicitly by temporarily breaking tenant token generation",
      "Monitor token generation performance in production",
      "Consider adding rate limiting specific to token generation endpoint"
    ]
  },
  "technicalDetails": {
    "implementation": {
      "file": "/home/setup/navidocs/server/routes/search.js",
      "lines": "21-72",
      "authentication": "Currently using test-user-id placeholder, needs proper auth middleware",
      "database": "SQLite - queries user_organizations table for multi-tenant filtering"
    },
    "tokenStructure": {
      "format": "JWT (JSON Web Token)",
      "algorithm": "HS256",
      "payloadFields": [
        "searchRules",
        "apiKeyUid",
        "exp"
      ],
      "searchRulesFilter": "userId = \"test-user-id\" OR organizationId IN [\"org-test-1\", \"test-org-id\"]"
    },
    "meilisearchConfig": {
      "host": "http://127.0.0.1:7700",
      "indexName": "navidocs-pages",
      "parentKeyUid": "a131d3c6-4cc9-4e1e-b7d4-0c3f442d5862",
      "parentKeyName": "Default Search API Key"
    }
  },
  "errors": [],
  "warnings": [
    "Authentication middleware not yet implemented - currently using hardcoded test-user-id",
    "Server was initially failing (had to restart) - ensure proper deployment procedures"
  ]
}
