{
  "config": {
    "argv": [
      "/usr/bin/node",
      "/app/node_modules/.bin/playwright",
      "test",
      "tests/ui/visitor-token.spec.ts",
      "--project=ui",
      "--output=/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output"
    ],
    "configFile": "/app/playwright.config.ts",
    "rootDir": "/app",
    "failOnFlakyTests": false,
    "forbidOnly": false,
    "fullyParallel": false,
    "globalSetup": null,
    "globalTeardown": null,
    "globalTimeout": 0,
    "grep": {},
    "grepInvert": null,
    "maxFailures": 0,
    "metadata": {
      "actualWorkers": 1
    },
    "preserveOutput": "always",
    "projects": [
      {
        "outputDir": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output",
        "repeatEach": 1,
        "retries": 2,
        "metadata": {
          "actualWorkers": 1
        },
        "id": "ui",
        "name": "ui",
        "testDir": "/app/tests/ui",
        "testIgnore": [],
        "testMatch": [
          "**/*.spec.ts"
        ],
        "timeout": 30000
      },
      {
        "outputDir": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output",
        "repeatEach": 1,
        "retries": 2,
        "metadata": {
          "actualWorkers": 1
        },
        "id": "api",
        "name": "api",
        "testDir": "/app/tests/api",
        "testIgnore": [],
        "testMatch": [
          "**/*.spec.ts"
        ],
        "timeout": 30000
      }
    ],
    "filteredProjects": [
      {
        "grep": {},
        "grepInvert": null,
        "outputDir": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output",
        "repeatEach": 1,
        "retries": 2,
        "metadata": {
          "actualWorkers": 1
        },
        "name": "ui",
        "testDir": "/app/tests/ui",
        "snapshotDir": "/app/tests/ui",
        "testIgnore": [],
        "testMatch": [
          "**/*.spec.ts"
        ],
        "timeout": 30000,
        "use": {
          "browserName": "chromium",
          "baseURL": "https://us.elect.info",
          "extraHTTPHeaders": {},
          "screenshot": "on",
          "video": "on-first-retry",
          "trace": "on-first-retry"
        },
        "dependencies": [],
        "ignoreSnapshots": false,
        "__projectId": "ui"
      }
    ],
    "quiet": false,
    "reporter": [
      [
        "html",
        {
          "outputFolder": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/reports/html",
          "open": "never"
        }
      ],
      [
        "json",
        {
          "outputFile": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/reports/results.json"
        }
      ],
      [
        "list",
        null
      ]
    ],
    "reportSlowTests": {
      "max": 5,
      "threshold": 300000
    },
    "shard": null,
    "tags": [],
    "updateSnapshots": "default",
    "updateSourceMethod": "patch",
    "version": "1.64.1",
    "workers": 32,
    "webServer": null
  },
  "suites": [
    {
      "title": "tests/ui/visitor-token.spec.ts",
      "file": "tests/ui/visitor-token.spec.ts",
      "column": 0,
      "line": 0,
      "specs": [
        {
          "title": "GET /api/token is never an error, with or without the gate",
          "ok": true,
          "tags": [],
          "tests": [
            {
              "timeout": 30000,
              "annotations": [],
              "expectedStatus": "passed",
              "projectId": "ui",
              "projectName": "ui",
              "results": [
                {
                  "workerIndex": 0,
                  "parallelIndex": 0,
                  "status": "passed",
                  "duration": 93,
                  "errors": [],
                  "stdout": [],
                  "stderr": [],
                  "retry": 0,
                  "startTime": "2026-10-25T21:26:44.723Z",
                  "annotations": [],
                  "attachments": []
                }
              ],
              "status": "expected"
            }
          ],
          "id": "66d11097bc5ff2c625f4-ba2e689c22ca1eb58a86",
          "file": "tests/ui/visitor-token.spec.ts",
          "line": 30,
          "column": 5
        }
      ],
      "suites": [
        {
          "title": "visitor-token gate",
          "file": "tests/ui/visitor-token.spec.ts",
          "line": 41,
          "column": 6,
          "specs": [
            {
              "title": "GET /api/token sets an HttpOnly token and a readable expiry",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "ui",
                  "projectName": "ui",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 51,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-10-25T21:26:44.853Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "66d11097bc5ff2c625f4-6a345a67524e2f99f69c",
              "file": "tests/ui/visitor-token.spec.ts",
              "line": 42,
              "column": 7
            },
            {
              "title": "without a token, /api/graphql answers 401",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "ui",
                  "projectName": "ui",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 75,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-10-25T21:26:44.920Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "66d11097bc5ff2c625f4-f396d27256170349746e",
              "file": "tests/ui/visitor-token.spec.ts",
              "line": 57,
              "column": 7
            },
            {
              "title": "an anon token runs persisted documents and nothing else",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "ui",
                  "projectName": "ui",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 669,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-10-25T21:26:45.006Z",
                      "annotations": [],
                      "attachments": []
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "66d11097bc5ff2c625f4-fb37317a2cef824e3dad",
              "file": "tests/ui/visitor-token.spec.ts",
              "line": 69,
              "column": 7
            }
          ]
        },
        {
          "title": "donor records are premium",
          "file": "tests/ui/visitor-token.spec.ts",
          "line": 98,
          "column": 6,
          "specs": [
            {
              "title": "an anonymous visitor gets the premium notice on Individual Donors",
              "ok": false,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "ui",
                  "projectName": "ui",
                  "results": [
                    {
                      "workerIndex": 0,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30090,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/app/tests/ui/visitor-token.spec.ts",
                            "column": 53,
                            "line": 105
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('.premium-required')\nExpected: visible\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" locator('.premium-required') with timeout 30000ms\u001b[22m\n\u001b[2m  - waiting for locator('.premium-required')\u001b[22m\n\u001b[2m  - Test timeout of 30000ms exceeded.\u001b[22m\n\n\n  103 |   test('an anonymous visitor gets the premium notice on Individual Donors', async ({ page }) => {\n  104 |     await page.goto('/individuals/');\n> 105 |     await expect(page.locator('.premium-required')).toBeVisible({ timeout: 30_000 });\n      |                                                     ^\n  106 |     await expect(page.locator('.entity-search-result')).toHaveCount(0);\n  107 |   });\n  108 |\n    at /app/tests/ui/visitor-token.spec.ts:105:53"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-10-25T21:26:45.687Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output/visitor-token-donor-record-4b012-notice-on-Individual-Donors-ui/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output/visitor-token-donor-record-4b012-notice-on-Individual-Donors-ui/error-context.md"
                        }
                      ]
                    },
                    {
                      "workerIndex": 1,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30299,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/app/tests/ui/visitor-token.spec.ts",
                            "column": 53,
                            "line": 105
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('.premium-required')\nExpected: visible\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" locator('.premium-required') with timeout 30000ms\u001b[22m\n\u001b[2m  - waiting for locator('.premium-required')\u001b[22m\n\u001b[2m  - Test timeout of 30000ms exceeded.\u001b[22m\n\n\n  103 |   test('an anonymous visitor gets the premium notice on Individual Donors', async ({ page }) => {\n  104 |     await page.goto('/individuals/');\n> 105 |     await expect(page.locator('.premium-required')).toBeVisible({ timeout: 30_000 });\n      |                                                     ^\n  106 |     await expect(page.locator('.entity-search-result')).toHaveCount(0);\n  107 |   });\n  108 |\n    at /app/tests/ui/visitor-token.spec.ts:105:53"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 1,
                      "startTime": "2026-10-25T21:27:16.417Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output/visitor-token-donor-record-4b012-notice-on-Individual-Donors-ui-retry1/test-failed-1.png"
                        },
                        {
                          "name": "video",
                          "contentType": "video/webm",
                          "path": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output/visitor-token-donor-record-4b012-notice-on-Individual-Donors-ui-retry1/video.webm"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output/visitor-token-donor-record-4b012-notice-on-Individual-Donors-ui-retry1/error-context.md"
                        },
                        {
                          "name": "trace",
                          "contentType": "application/zip",
                          "path": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output/visitor-token-donor-record-4b012-notice-on-Individual-Donors-ui-retry1/trace.zip"
                        }
                      ]
                    },
                    {
                      "workerIndex": 2,
                      "parallelIndex": 0,
                      "status": "timedOut",
                      "duration": 30083,
                      "error": {
                        "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m",
                        "stack": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                      },
                      "errors": [
                        {
                          "message": "\u001b[31mTest timeout of 30000ms exceeded.\u001b[39m"
                        },
                        {
                          "location": {
                            "file": "/app/tests/ui/visitor-token.spec.ts",
                            "column": 53,
                            "line": 105
                          },
                          "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoBeVisible\u001b[2m(\u001b[22m\u001b[2m)\u001b[22m failed\n\nLocator: locator('.premium-required')\nExpected: visible\nError: element(s) not found\n\nCall log:\n\u001b[2m  - Expect \"toBeVisible\" locator('.premium-required') with timeout 30000ms\u001b[22m\n\u001b[2m  - waiting for locator('.premium-required')\u001b[22m\n\u001b[2m  - Test timeout of 30000ms exceeded.\u001b[22m\n\n\n  103 |   test('an anonymous visitor gets the premium notice on Individual Donors', async ({ page }) => {\n  104 |     await page.goto('/individuals/');\n> 105 |     await expect(page.locator('.premium-required')).toBeVisible({ timeout: 30_000 });\n      |                                                     ^\n  106 |     await expect(page.locator('.entity-search-result')).toHaveCount(0);\n  107 |   });\n  108 |\n    at /app/tests/ui/visitor-token.spec.ts:105:53"
                        }
                      ],
                      "stdout": [],
                      "stderr": [],
                      "retry": 2,
                      "startTime": "2026-10-25T21:27:47.516Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output/visitor-token-donor-record-4b012-notice-on-Individual-Donors-ui-retry2/test-failed-1.png"
                        },
                        {
                          "name": "error-context",
                          "contentType": "text/markdown",
                          "path": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output/visitor-token-donor-record-4b012-notice-on-Individual-Donors-ui-retry2/error-context.md"
                        }
                      ]
                    }
                  ],
                  "status": "unexpected"
                }
              ],
              "id": "66d11097bc5ff2c625f4-c8ffc6d48edd62fa84f1",
              "file": "tests/ui/visitor-token.spec.ts",
              "line": 103,
              "column": 7
            },
            {
              "title": "an anonymous visitor sees employer totals but not donor names",
              "ok": true,
              "tags": [],
              "tests": [
                {
                  "timeout": 30000,
                  "annotations": [],
                  "expectedStatus": "passed",
                  "projectId": "ui",
                  "projectName": "ui",
                  "results": [
                    {
                      "workerIndex": 3,
                      "parallelIndex": 0,
                      "status": "passed",
                      "duration": 438,
                      "errors": [],
                      "stdout": [],
                      "stderr": [],
                      "retry": 0,
                      "startTime": "2026-10-25T21:28:18.193Z",
                      "annotations": [],
                      "attachments": [
                        {
                          "name": "screenshot",
                          "contentType": "image/png",
                          "path": "/workspace/artifacts/prod-premium-cc8dc2c/us-prod/test-output/visitor-token-donor-record-c6316--totals-but-not-donor-names-ui/test-finished-1.png"
                        }
                      ]
                    }
                  ],
                  "status": "expected"
                }
              ],
              "id": "66d11097bc5ff2c625f4-70bd87774f0fc06f5206",
              "file": "tests/ui/visitor-token.spec.ts",
              "line": 109,
              "column": 7
            }
          ]
        }
      ]
    }
  ],
  "errors": [],
  "stats": {
    "startTime": "2026-10-25T21:26:44.227Z",
    "duration": 94547.997,
    "expected": 5,
    "skipped": 0,
    "unexpected": 1,
    "flaky": 0
  }
}