Files
Charon/docs/plans/task.md
GitHub Actions 19a34201bf fix(ci): use valid 32-byte base64 encryption key for E2E tests
The DNS provider API endpoints were returning 404 in CI because the
encryption service failed to initialize with an invalid key.

Changed CHARON_ENCRYPTION_KEY from plain text to valid base64 string
Key "dGVzdC1lbmNyeXB0aW9uLWtleS1mb3ItY2ktMzJieXQ=" decodes to 32 bytes
Without valid encryption key, DNS provider routes don't register
This was causing all dns-provider-types.spec.ts tests to fail
Root cause: AES-256-GCM requires exactly 32 bytes for the key
2026-01-15 06:02:42 +00:00

73 KiB
Raw Blame History

Run npx playwright test --project=chromium

Running 55 tests using 1 worker Running initial setup to create test admin user... Initial setup completed successfully Logging in as test user... Login successful Auth state saved to /home/runner/work/Charon/Charon/playwright/.auth/user.json ·API Response: 404 {"error":"not found"} ×API Response: 404 {"error":"not found"} ×API Response: 404 {"error":"not found"} FType select found: true Number of options: 1 Option 0: Loading... Webhook option not found °··Add button count: 2 Page URL: http://localhost:8080/dns/providers ···°°°××××F····××F××F××F××F××F××F··××F···××F························

  1. [chromium] tests/dns-provider-crud.spec.ts:16:5 DNS Provider CRUD Operations Create Provider should create a Manual DNS provider Save provider
Error: expect(locator).not.toBeVisible() failed

Locator:  getByRole('dialog')
Expected: not visible
Received: visible
Timeout:  10000ms

Call log:
  - Expect "not toBeVisible" with timeout 10000ms
  - waiting for getByRole('dialog')
    14 × locator resolved to <div role="dialog" tabindex="-1" id="radix-_r_0_" data-state="open" aria-labelledby="radix-_r_1_" class="fixed left-[50%] top-[50%] z-50 w-full translate-x-[-50%] translate-y-[-50%] bg-surface-elevated border border-border rounded-xl shadow-xl duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:sli…>…</div>
       - unexpected value "visible"


  65 |
  66 |         // Wait for dialog to close (indicates success)
> 67 |         await expect(dialog).not.toBeVisible({ timeout: 10000 });
     |                                  ^
  68 |       });
  69 |
  70 |       await test.step('Verify success', async () => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:67:34
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:40:7

Error Context: test-results/dns-provider-crud-DNS-Prov-3ef77-reate-a-Manual-DNS-provider-chromium/error-context.md

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(locator).not.toBeVisible() failed

Locator:  getByRole('dialog')
Expected: not visible
Received: visible
Timeout:  10000ms

Call log:
  - Expect "not toBeVisible" with timeout 10000ms
  - waiting for getByRole('dialog')
    14 × locator resolved to <div role="dialog" tabindex="-1" id="radix-_r_0_" data-state="open" aria-labelledby="radix-_r_1_" class="fixed left-[50%] top-[50%] z-50 w-full translate-x-[-50%] translate-y-[-50%] bg-surface-elevated border border-border rounded-xl shadow-xl duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:sli…>…</div>
       - unexpected value "visible"


  65 |
  66 |         // Wait for dialog to close (indicates success)
> 67 |         await expect(dialog).not.toBeVisible({ timeout: 10000 });
     |                                  ^
  68 |       });
  69 |
  70 |       await test.step('Verify success', async () => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:67:34
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:40:7

Error Context: test-results/dns-provider-crud-DNS-Prov-3ef77-reate-a-Manual-DNS-provider-chromium-retry1/error-context.md

attachment #2: trace (application/zip) ─────────────────────────────────────────────────────────
test-results/dns-provider-crud-DNS-Prov-3ef77-reate-a-Manual-DNS-provider-chromium-retry1/trace.zip
Usage:

    npx playwright show-trace test-results/dns-provider-crud-DNS-Prov-3ef77-reate-a-Manual-DNS-provider-chromium-retry1/trace.zip

────────────────────────────────────────────────────────────────────────────────────────────────

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(locator).not.toBeVisible() failed

Locator:  getByRole('dialog')
Expected: not visible
Received: visible
Timeout:  10000ms

Call log:
  - Expect "not toBeVisible" with timeout 10000ms
  - waiting for getByRole('dialog')
    14 × locator resolved to <div role="dialog" tabindex="-1" id="radix-_r_0_" data-state="open" aria-labelledby="radix-_r_1_" class="fixed left-[50%] top-[50%] z-50 w-full translate-x-[-50%] translate-y-[-50%] bg-surface-elevated border border-border rounded-xl shadow-xl duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:sli…>…</div>
       - unexpected value "visible"


  65 |
  66 |         // Wait for dialog to close (indicates success)
> 67 |         await expect(dialog).not.toBeVisible({ timeout: 10000 });
     |                                  ^
  68 |       });
  69 |
  70 |       await test.step('Verify success', async () => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:67:34
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:40:7

Error Context: test-results/dns-provider-crud-DNS-Prov-3ef77-reate-a-Manual-DNS-provider-chromium-retry2/error-context.md
  1. [chromium] tests/dns-provider-crud.spec.ts:501:5 DNS Provider CRUD Operations API Operations should list providers via API
Error: expect(received).toBeTruthy()

Received: false

  449 |     test('should list providers via API', async ({ request }) => {
  450 |       const response = await request.get('/api/v1/dns-providers');
> 451 |       expect(response.ok()).toBeTruthy();
      |                             ^
  452 |
  453 |       const data = await response.json();
  454 |       // Response should be an array (possibly empty)
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:451:29

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(received).toBeTruthy()

Received: false

  449 |     test('should list providers via API', async ({ request }) => {
  450 |       const response = await request.get('/api/v1/dns-providers');
> 451 |       expect(response.ok()).toBeTruthy();
      |                             ^
  452 |
  453 |       const data = await response.json();
  454 |       // Response should be an array (possibly empty)
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:451:29

attachment #1: trace (application/zip) ─────────────────────────────────────────────────────────
test-results/dns-provider-crud-DNS-Prov-2082f-ould-list-providers-via-API-chromium-retry1/trace.zip
Usage:

    npx playwright show-trace test-results/dns-provider-crud-DNS-Prov-2082f-ould-list-providers-via-API-chromium-retry1/trace.zip

────────────────────────────────────────────────────────────────────────────────────────────────

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(received).toBeTruthy()

Received: false

  449 |     test('should list providers via API', async ({ request }) => {
  450 |       const response = await request.get('/api/v1/dns-providers');
> 451 |       expect(response.ok()).toBeTruthy();
      |                             ^
  452 |
  453 |       const data = await response.json();
  454 |       // Response should be an array (possibly empty)
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:451:29
  1. [chromium] tests/dns-provider-crud.spec.ts:534:5 DNS Provider CRUD Operations API Operations should reject invalid provider type via API
Error: expect(received).toBe(expected) // Object.is equality

Expected: 400
Received: 404

  489 |
  490 |       // Should return 400 Bad Request for invalid type
> 491 |       expect(response.status()).toBe(400);
      |                                 ^
  492 |     });
  493 |
  494 |     test('should get single provider via API', async ({ request }) => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:491:33

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(received).toBe(expected) // Object.is equality

Expected: 400
Received: 404

  489 |
  490 |       // Should return 400 Bad Request for invalid type
> 491 |       expect(response.status()).toBe(400);
      |                                 ^
  492 |     });
  493 |
  494 |     test('should get single provider via API', async ({ request }) => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:491:33

attachment #1: trace (application/zip) ─────────────────────────────────────────────────────────
test-results/dns-provider-crud-DNS-Prov-49999-valid-provider-type-via-API-chromium-retry1/trace.zip
Usage:

    npx playwright show-trace test-results/dns-provider-crud-DNS-Prov-49999-valid-provider-type-via-API-chromium-retry1/trace.zip

────────────────────────────────────────────────────────────────────────────────────────────────

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(received).toBe(expected) // Object.is equality

Expected: 400
Received: 404

  489 |
  490 |       // Should return 400 Bad Request for invalid type
> 491 |       expect(response.status()).toBe(400);
      |                                 ^
  492 |     });
  493 |
  494 |     test('should get single provider via API', async ({ request }) => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:491:33
  1. [chromium] tests/dns-provider-types.spec.ts:15:5 DNS Provider Types API: /api/v1/dns-providers/types should return all provider types including built-in and custom
Error: expect(received).toBeTruthy()

Received: false

  15 |     test('should return all provider types including built-in and custom', async ({ request }) => {
  16 |       const response = await request.get('/api/v1/dns-providers/types');
> 17 |       expect(response.ok()).toBeTruthy();
     |                             ^
  18 |
  19 |       const data = await response.json();
  20 |       // API returns { types: [...], total: N }
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:17:29

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(received).toBeTruthy()

Received: false

  15 |     test('should return all provider types including built-in and custom', async ({ request }) => {
  16 |       const response = await request.get('/api/v1/dns-providers/types');
> 17 |       expect(response.ok()).toBeTruthy();
     |                             ^
  18 |
  19 |       const data = await response.json();
  20 |       // API returns { types: [...], total: N }
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:17:29

attachment #1: trace (application/zip) ─────────────────────────────────────────────────────────
test-results/dns-provider-types-DNS-Pro-aa4d6-cluding-built-in-and-custom-chromium-retry1/trace.zip
Usage:

    npx playwright show-trace test-results/dns-provider-types-DNS-Pro-aa4d6-cluding-built-in-and-custom-chromium-retry1/trace.zip

────────────────────────────────────────────────────────────────────────────────────────────────

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(received).toBeTruthy()

Received: false

  15 |     test('should return all provider types including built-in and custom', async ({ request }) => {
  16 |       const response = await request.get('/api/v1/dns-providers/types');
> 17 |       expect(response.ok()).toBeTruthy();
     |                             ^
  18 |
  19 |       const data = await response.json();
  20 |       // API returns { types: [...], total: N }
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:17:29
  1. [chromium] tests/dns-provider-types.spec.ts:36:5 DNS Provider Types API: /api/v1/dns-providers/types each provider type should have required fields
TypeError: types is not iterable

  39 |       const types = data.types;
  40 |
> 41 |       for (const provider of types) {
     |                              ^
  42 |         expect(provider).toHaveProperty('type');
  43 |         expect(provider).toHaveProperty('name');
  44 |         expect(provider).toHaveProperty('fields');
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:41:30

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

TypeError: types is not iterable

  39 |       const types = data.types;
  40 |
> 41 |       for (const provider of types) {
     |                              ^
  42 |         expect(provider).toHaveProperty('type');
  43 |         expect(provider).toHaveProperty('name');
  44 |         expect(provider).toHaveProperty('fields');
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:41:30

attachment #1: trace (application/zip) ─────────────────────────────────────────────────────────
test-results/dns-provider-types-DNS-Pro-cf7e1-should-have-required-fields-chromium-retry1/trace.zip
Usage:

    npx playwright show-trace test-results/dns-provider-types-DNS-Pro-cf7e1-should-have-required-fields-chromium-retry1/trace.zip

────────────────────────────────────────────────────────────────────────────────────────────────

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

TypeError: types is not iterable

  39 |       const types = data.types;
  40 |
> 41 |       for (const provider of types) {
     |                              ^
  42 |         expect(provider).toHaveProperty('type');
  43 |         expect(provider).toHaveProperty('name');
  44 |         expect(provider).toHaveProperty('fields');
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:41:30
  1. [chromium] tests/dns-provider-types.spec.ts:49:5 DNS Provider Types API: /api/v1/dns-providers/types manual provider type should have correct configuration
TypeError: Cannot read properties of undefined (reading 'find')

  52 |       const types = data.types;
  53 |
> 54 |       const manualProvider = types.find((t: { type: string }) => t.type === 'manual');
     |                                    ^
  55 |       expect(manualProvider).toBeDefined();
  56 |       expect(manualProvider.name).toMatch(/manual/i);
  57 |
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:54:36

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

TypeError: Cannot read properties of undefined (reading 'find')

  52 |       const types = data.types;
  53 |
> 54 |       const manualProvider = types.find((t: { type: string }) => t.type === 'manual');
     |                                    ^
  55 |       expect(manualProvider).toBeDefined();
  56 |       expect(manualProvider.name).toMatch(/manual/i);
  57 |
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:54:36

attachment #1: trace (application/zip) ─────────────────────────────────────────────────────────
test-results/dns-provider-types-DNS-Pro-0fe47--have-correct-configuration-chromium-retry1/trace.zip
Usage:

    npx playwright show-trace test-results/dns-provider-types-DNS-Pro-0fe47--have-correct-configuration-chromium-retry1/trace.zip

────────────────────────────────────────────────────────────────────────────────────────────────

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

TypeError: Cannot read properties of undefined (reading 'find')

  52 |       const types = data.types;
  53 |
> 54 |       const manualProvider = types.find((t: { type: string }) => t.type === 'manual');
     |                                    ^
  55 |       expect(manualProvider).toBeDefined();
  56 |       expect(manualProvider.name).toMatch(/manual/i);
  57 |
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:54:36
  1. [chromium] tests/dns-provider-types.spec.ts:62:5 DNS Provider Types API: /api/v1/dns-providers/types webhook provider type should have url field
TypeError: Cannot read properties of undefined (reading 'find')

  65 |       const types = data.types;
  66 |
> 67 |       const webhookProvider = types.find((t: { type: string }) => t.type === 'webhook');
     |                                     ^
  68 |       expect(webhookProvider).toBeDefined();
  69 |
  70 |       // Webhook should have URL configuration field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:67:37

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

TypeError: Cannot read properties of undefined (reading 'find')

  65 |       const types = data.types;
  66 |
> 67 |       const webhookProvider = types.find((t: { type: string }) => t.type === 'webhook');
     |                                     ^
  68 |       expect(webhookProvider).toBeDefined();
  69 |
  70 |       // Webhook should have URL configuration field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:67:37

attachment #1: trace (application/zip) ─────────────────────────────────────────────────────────
test-results/dns-provider-types-DNS-Pro-110d1--type-should-have-url-field-chromium-retry1/trace.zip
Usage:

    npx playwright show-trace test-results/dns-provider-types-DNS-Pro-110d1--type-should-have-url-field-chromium-retry1/trace.zip

────────────────────────────────────────────────────────────────────────────────────────────────

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

TypeError: Cannot read properties of undefined (reading 'find')

  65 |       const types = data.types;
  66 |
> 67 |       const webhookProvider = types.find((t: { type: string }) => t.type === 'webhook');
     |                                     ^
  68 |       expect(webhookProvider).toBeDefined();
  69 |
  70 |       // Webhook should have URL configuration field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:67:37
  1. [chromium] tests/dns-provider-types.spec.ts:75:5 DNS Provider Types API: /api/v1/dns-providers/types rfc2136 provider type should have server and key fields
TypeError: Cannot read properties of undefined (reading 'find')

  78 |       const types = data.types;
  79 |
> 80 |       const rfc2136Provider = types.find((t: { type: string }) => t.type === 'rfc2136');
     |                                     ^
  81 |       expect(rfc2136Provider).toBeDefined();
  82 |
  83 |       // RFC2136 (Dynamic DNS) should have server and TSIG key fields
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:80:37

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

TypeError: Cannot read properties of undefined (reading 'find')

  78 |       const types = data.types;
  79 |
> 80 |       const rfc2136Provider = types.find((t: { type: string }) => t.type === 'rfc2136');
     |                                     ^
  81 |       expect(rfc2136Provider).toBeDefined();
  82 |
  83 |       // RFC2136 (Dynamic DNS) should have server and TSIG key fields
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:80:37

attachment #1: trace (application/zip) ─────────────────────────────────────────────────────────
test-results/dns-provider-types-DNS-Pro-357a9--have-server-and-key-fields-chromium-retry1/trace.zip
Usage:

    npx playwright show-trace test-results/dns-provider-types-DNS-Pro-357a9--have-server-and-key-fields-chromium-retry1/trace.zip

────────────────────────────────────────────────────────────────────────────────────────────────

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

TypeError: Cannot read properties of undefined (reading 'find')

  78 |       const types = data.types;
  79 |
> 80 |       const rfc2136Provider = types.find((t: { type: string }) => t.type === 'rfc2136');
     |                                     ^
  81 |       expect(rfc2136Provider).toBeDefined();
  82 |
  83 |       // RFC2136 (Dynamic DNS) should have server and TSIG key fields
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:80:37
  1. [chromium] tests/dns-provider-types.spec.ts:88:5 DNS Provider Types API: /api/v1/dns-providers/types script provider type should have command/path field
TypeError: Cannot read properties of undefined (reading 'find')

  91 |       const types = data.types;
  92 |
> 93 |       const scriptProvider = types.find((t: { type: string }) => t.type === 'script');
     |                                    ^
  94 |       expect(scriptProvider).toBeDefined();
  95 |
  96 |       // Script provider should have a command or script path field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:93:36

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

TypeError: Cannot read properties of undefined (reading 'find')

  91 |       const types = data.types;
  92 |
> 93 |       const scriptProvider = types.find((t: { type: string }) => t.type === 'script');
     |                                    ^
  94 |       expect(scriptProvider).toBeDefined();
  95 |
  96 |       // Script provider should have a command or script path field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:93:36

attachment #1: trace (application/zip) ─────────────────────────────────────────────────────────
test-results/dns-provider-types-DNS-Pro-2c379-uld-have-command-path-field-chromium-retry1/trace.zip
Usage:

    npx playwright show-trace test-results/dns-provider-types-DNS-Pro-2c379-uld-have-command-path-field-chromium-retry1/trace.zip

────────────────────────────────────────────────────────────────────────────────────────────────

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

TypeError: Cannot read properties of undefined (reading 'find')

  91 |       const types = data.types;
  92 |
> 93 |       const scriptProvider = types.find((t: { type: string }) => t.type === 'script');
     |                                    ^
  94 |       expect(scriptProvider).toBeDefined();
  95 |
  96 |       // Script provider should have a command or script path field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:93:36
  1. [chromium] tests/dns-provider-types.spec.ts:153:5 DNS Provider Types UI: Provider Selector should filter provider types based on search Verify options can be navigated with keyboard
Error: expect(received).toBeGreaterThan(expected)

Expected: > 5
Received:   1

  165 |
  166 |         // Should have multiple provider options available
> 167 |         expect(optionCount).toBeGreaterThan(5);
      |                             ^
  168 |
  169 |         // Verify cloudflare option exists in the list
  170 |         await expect(page.getByRole('option', { name: /cloudflare/i })).toBeVisible();
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:167:29
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:158:7

Error Context: test-results/dns-provider-types-DNS-Pro-b3c1a-vider-types-based-on-search-chromium/error-context.md

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(received).toBeGreaterThan(expected)

Expected: > 5
Received:   1

  165 |
  166 |         // Should have multiple provider options available
> 167 |         expect(optionCount).toBeGreaterThan(5);
      |                             ^
  168 |
  169 |         // Verify cloudflare option exists in the list
  170 |         await expect(page.getByRole('option', { name: /cloudflare/i })).toBeVisible();
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:167:29
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:158:7

Error Context: test-results/dns-provider-types-DNS-Pro-b3c1a-vider-types-based-on-search-chromium-retry1/error-context.md

attachment #2: trace (application/zip) ─────────────────────────────────────────────────────────
test-results/dns-provider-types-DNS-Pro-b3c1a-vider-types-based-on-search-chromium-retry1/trace.zip
Usage:

    npx playwright show-trace test-results/dns-provider-types-DNS-Pro-b3c1a-vider-types-based-on-search-chromium-retry1/trace.zip

────────────────────────────────────────────────────────────────────────────────────────────────

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(received).toBeGreaterThan(expected)

Expected: > 5
Received:   1

  165 |
  166 |         // Should have multiple provider options available
> 167 |         expect(optionCount).toBeGreaterThan(5);
      |                             ^
  168 |
  169 |         // Verify cloudflare option exists in the list
  170 |         await expect(page.getByRole('option', { name: /cloudflare/i })).toBeVisible();
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:167:29
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:158:7

Error Context: test-results/dns-provider-types-DNS-Pro-b3c1a-vider-types-based-on-search-chromium-retry2/error-context.md
  1. [chromium] tests/dns-provider-types.spec.ts:278:5 DNS Provider Types Provider Type Selection should show script path field when Script type is selected Verify Script path/command field appears
Error: expect(locator).toBeVisible() failed

Locator: getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))
Expected: visible
Timeout: 5000ms
Error: element(s) not found

Call log:
  - Expect "toBeVisible" with timeout 5000ms
  - waiting for getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))


  262 |         const scriptField = page.getByRole('textbox', { name: /script path/i })
  263 |           .or(page.getByPlaceholder(/dns-challenge\.sh/i));
> 264 |         await expect(scriptField).toBeVisible();
      |                                   ^
  265 |       });
  266 |     });
  267 |   });
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:264:35
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:260:18

Error Context: test-results/dns-provider-types-DNS-Pro-b805a-hen-Script-type-is-selected-chromium/error-context.md

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(locator).toBeVisible() failed

Locator: getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))
Expected: visible
Timeout: 5000ms
Error: element(s) not found

Call log:
  - Expect "toBeVisible" with timeout 5000ms
  - waiting for getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))


  262 |         const scriptField = page.getByRole('textbox', { name: /script path/i })
  263 |           .or(page.getByPlaceholder(/dns-challenge\.sh/i));
> 264 |         await expect(scriptField).toBeVisible();
      |                                   ^
  265 |       });
  266 |     });
  267 |   });
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:264:35
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:260:18

Error Context: test-results/dns-provider-types-DNS-Pro-b805a-hen-Script-type-is-selected-chromium-retry1/error-context.md

attachment #2: trace (application/zip) ─────────────────────────────────────────────────────────
test-results/dns-provider-types-DNS-Pro-b805a-hen-Script-type-is-selected-chromium-retry1/trace.zip
Usage:

    npx playwright show-trace test-results/dns-provider-types-DNS-Pro-b805a-hen-Script-type-is-selected-chromium-retry1/trace.zip

────────────────────────────────────────────────────────────────────────────────────────────────

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

Error: expect(locator).toBeVisible() failed

Locator: getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))
Expected: visible
Timeout: 5000ms
Error: element(s) not found

Call log:
  - Expect "toBeVisible" with timeout 5000ms
  - waiting for getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))


  262 |         const scriptField = page.getByRole('textbox', { name: /script path/i })
  263 |           .or(page.getByPlaceholder(/dns-challenge\.sh/i));
> 264 |         await expect(scriptField).toBeVisible();
      |                                   ^
  265 |       });
  266 |     });
  267 |   });
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:264:35
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:260:18

Error Context: test-results/dns-provider-types-DNS-Pro-b805a-hen-Script-type-is-selected-chromium-retry2/error-context.md

11 failed [chromium] tests/dns-provider-crud.spec.ts:16:5 DNS Provider CRUD Operations Create Provider should create a Manual DNS provider [chromium] tests/dns-provider-crud.spec.ts:501:5 DNS Provider CRUD Operations API Operations should list providers via API [chromium] tests/dns-provider-crud.spec.ts:534:5 DNS Provider CRUD Operations API Operations should reject invalid provider type via API [chromium] tests/dns-provider-types.spec.ts:15:5 DNS Provider Types API: /api/v1/dns-providers/types should return all provider types including built-in and custom [chromium] tests/dns-provider-types.spec.ts:36:5 DNS Provider Types API: /api/v1/dns-providers/types each provider type should have required fields [chromium] tests/dns-provider-types.spec.ts:49:5 DNS Provider Types API: /api/v1/dns-providers/types manual provider type should have correct configuration [chromium] tests/dns-provider-types.spec.ts:62:5 DNS Provider Types API: /api/v1/dns-providers/types webhook provider type should have url field [chromium] tests/dns-provider-types.spec.ts:75:5 DNS Provider Types API: /api/v1/dns-providers/types rfc2136 provider type should have server and key fields [chromium] tests/dns-provider-types.spec.ts:88:5 DNS Provider Types API: /api/v1/dns-providers/types script provider type should have command/path field [chromium] tests/dns-provider-types.spec.ts:153:5 DNS Provider Types UI: Provider Selector should filter provider types based on search [chromium] tests/dns-provider-types.spec.ts:278:5 DNS Provider Types Provider Type Selection should show script path field when Script type is selected 4 skipped 40 passed (2.0m) Error: 1) [chromium] tests/dns-provider-crud.spec.ts:16:5 DNS Provider CRUD Operations Create Provider should create a Manual DNS provider Save provider Error: expect(locator).not.toBeVisible() failed

Locator:  getByRole('dialog')
Expected: not visible
Received: visible
Timeout:  10000ms

Call log:
  - Expect "not toBeVisible" with timeout 10000ms
  - waiting for getByRole('dialog')
    14 × locator resolved to <div role="dialog" tabindex="-1" id="radix-_r_0_" data-state="open" aria-labelledby="radix-_r_1_" class="fixed left-[50%] top-[50%] z-50 w-full translate-x-[-50%] translate-y-[-50%] bg-surface-elevated border border-border rounded-xl shadow-xl duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:sli…>…</div>
       - unexpected value "visible"


  65 |
  66 |         // Wait for dialog to close (indicates success)
> 67 |         await expect(dialog).not.toBeVisible({ timeout: 10000 });
     |                                  ^
  68 |       });
  69 |
  70 |       await test.step('Verify success', async () => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:67:34
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:40:7

Error: 1) [chromium] tests/dns-provider-crud.spec.ts:16:5 DNS Provider CRUD Operations Create Provider should create a Manual DNS provider Save provider

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(locator).not.toBeVisible() failed

Locator:  getByRole('dialog')
Expected: not visible
Received: visible
Timeout:  10000ms

Call log:
  - Expect "not toBeVisible" with timeout 10000ms
  - waiting for getByRole('dialog')
    14 × locator resolved to <div role="dialog" tabindex="-1" id="radix-_r_0_" data-state="open" aria-labelledby="radix-_r_1_" class="fixed left-[50%] top-[50%] z-50 w-full translate-x-[-50%] translate-y-[-50%] bg-surface-elevated border border-border rounded-xl shadow-xl duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:sli…>…</div>
       - unexpected value "visible"


  65 |
  66 |         // Wait for dialog to close (indicates success)
> 67 |         await expect(dialog).not.toBeVisible({ timeout: 10000 });
     |                                  ^
  68 |       });
  69 |
  70 |       await test.step('Verify success', async () => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:67:34
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:40:7

Error: 1) [chromium] tests/dns-provider-crud.spec.ts:16:5 DNS Provider CRUD Operations Create Provider should create a Manual DNS provider Save provider

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(locator).not.toBeVisible() failed

Locator:  getByRole('dialog')
Expected: not visible
Received: visible
Timeout:  10000ms

Call log:
  - Expect "not toBeVisible" with timeout 10000ms
  - waiting for getByRole('dialog')
    14 × locator resolved to <div role="dialog" tabindex="-1" id="radix-_r_0_" data-state="open" aria-labelledby="radix-_r_1_" class="fixed left-[50%] top-[50%] z-50 w-full translate-x-[-50%] translate-y-[-50%] bg-surface-elevated border border-border rounded-xl shadow-xl duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:sli…>…</div>
       - unexpected value "visible"


  65 |
  66 |         // Wait for dialog to close (indicates success)
> 67 |         await expect(dialog).not.toBeVisible({ timeout: 10000 });
     |                                  ^
  68 |       });
  69 |
  70 |       await test.step('Verify success', async () => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:67:34
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:40:7

Error: 2) [chromium] tests/dns-provider-crud.spec.ts:501:5 DNS Provider CRUD Operations API Operations should list providers via API Error: expect(received).toBeTruthy()

Received: false

  449 |     test('should list providers via API', async ({ request }) => {
  450 |       const response = await request.get('/api/v1/dns-providers');
> 451 |       expect(response.ok()).toBeTruthy();
      |                             ^
  452 |
  453 |       const data = await response.json();
  454 |       // Response should be an array (possibly empty)
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:451:29

Error: 2) [chromium] tests/dns-provider-crud.spec.ts:501:5 DNS Provider CRUD Operations API Operations should list providers via API

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(received).toBeTruthy()

Received: false

  449 |     test('should list providers via API', async ({ request }) => {
  450 |       const response = await request.get('/api/v1/dns-providers');
> 451 |       expect(response.ok()).toBeTruthy();
      |                             ^
  452 |
  453 |       const data = await response.json();
  454 |       // Response should be an array (possibly empty)
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:451:29

Error: 2) [chromium] tests/dns-provider-crud.spec.ts:501:5 DNS Provider CRUD Operations API Operations should list providers via API

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(received).toBeTruthy()

Received: false

  449 |     test('should list providers via API', async ({ request }) => {
  450 |       const response = await request.get('/api/v1/dns-providers');
> 451 |       expect(response.ok()).toBeTruthy();
      |                             ^
  452 |
  453 |       const data = await response.json();
  454 |       // Response should be an array (possibly empty)
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:451:29

Error: 3) [chromium] tests/dns-provider-crud.spec.ts:534:5 DNS Provider CRUD Operations API Operations should reject invalid provider type via API Error: expect(received).toBe(expected) // Object.is equality

Expected: 400
Received: 404

  489 |
  490 |       // Should return 400 Bad Request for invalid type
> 491 |       expect(response.status()).toBe(400);
      |                                 ^
  492 |     });
  493 |
  494 |     test('should get single provider via API', async ({ request }) => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:491:33

Error: 3) [chromium] tests/dns-provider-crud.spec.ts:534:5 DNS Provider CRUD Operations API Operations should reject invalid provider type via API

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(received).toBe(expected) // Object.is equality

Expected: 400
Received: 404

  489 |
  490 |       // Should return 400 Bad Request for invalid type
> 491 |       expect(response.status()).toBe(400);
      |                                 ^
  492 |     });
  493 |
  494 |     test('should get single provider via API', async ({ request }) => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:491:33

Error: 3) [chromium] tests/dns-provider-crud.spec.ts:534:5 DNS Provider CRUD Operations API Operations should reject invalid provider type via API

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(received).toBe(expected) // Object.is equality

Expected: 400
Received: 404

  489 |
  490 |       // Should return 400 Bad Request for invalid type
> 491 |       expect(response.status()).toBe(400);
      |                                 ^
  492 |     });
  493 |
  494 |     test('should get single provider via API', async ({ request }) => {
    at /home/runner/work/Charon/Charon/tests/dns-provider-crud.spec.ts:491:33

Error: 4) [chromium] tests/dns-provider-types.spec.ts:15:5 DNS Provider Types API: /api/v1/dns-providers/types should return all provider types including built-in and custom Error: expect(received).toBeTruthy()

Received: false

  15 |     test('should return all provider types including built-in and custom', async ({ request }) => {
  16 |       const response = await request.get('/api/v1/dns-providers/types');
> 17 |       expect(response.ok()).toBeTruthy();
     |                             ^
  18 |
  19 |       const data = await response.json();
  20 |       // API returns { types: [...], total: N }
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:17:29

Error: 4) [chromium] tests/dns-provider-types.spec.ts:15:5 DNS Provider Types API: /api/v1/dns-providers/types should return all provider types including built-in and custom

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(received).toBeTruthy()

Received: false

  15 |     test('should return all provider types including built-in and custom', async ({ request }) => {
  16 |       const response = await request.get('/api/v1/dns-providers/types');
> 17 |       expect(response.ok()).toBeTruthy();
     |                             ^
  18 |
  19 |       const data = await response.json();
  20 |       // API returns { types: [...], total: N }
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:17:29

Error: 4) [chromium] tests/dns-provider-types.spec.ts:15:5 DNS Provider Types API: /api/v1/dns-providers/types should return all provider types including built-in and custom

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(received).toBeTruthy()

Received: false

  15 |     test('should return all provider types including built-in and custom', async ({ request }) => {
  16 |       const response = await request.get('/api/v1/dns-providers/types');
> 17 |       expect(response.ok()).toBeTruthy();
     |                             ^
  18 |
  19 |       const data = await response.json();
  20 |       // API returns { types: [...], total: N }
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:17:29

Error: 5) [chromium] tests/dns-provider-types.spec.ts:36:5 DNS Provider Types API: /api/v1/dns-providers/types each provider type should have required fields TypeError: types is not iterable

  39 |       const types = data.types;
  40 |
> 41 |       for (const provider of types) {
     |                              ^
  42 |         expect(provider).toHaveProperty('type');
  43 |         expect(provider).toHaveProperty('name');
  44 |         expect(provider).toHaveProperty('fields');
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:41:30

Error: 5) [chromium] tests/dns-provider-types.spec.ts:36:5 DNS Provider Types API: /api/v1/dns-providers/types each provider type should have required fields

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
TypeError: types is not iterable

  39 |       const types = data.types;
  40 |
> 41 |       for (const provider of types) {
     |                              ^
  42 |         expect(provider).toHaveProperty('type');
  43 |         expect(provider).toHaveProperty('name');
  44 |         expect(provider).toHaveProperty('fields');
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:41:30

Error: 5) [chromium] tests/dns-provider-types.spec.ts:36:5 DNS Provider Types API: /api/v1/dns-providers/types each provider type should have required fields

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
TypeError: types is not iterable

  39 |       const types = data.types;
  40 |
> 41 |       for (const provider of types) {
     |                              ^
  42 |         expect(provider).toHaveProperty('type');
  43 |         expect(provider).toHaveProperty('name');
  44 |         expect(provider).toHaveProperty('fields');
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:41:30

Error: 6) [chromium] tests/dns-provider-types.spec.ts:49:5 DNS Provider Types API: /api/v1/dns-providers/types manual provider type should have correct configuration TypeError: Cannot read properties of undefined (reading 'find')

  52 |       const types = data.types;
  53 |
> 54 |       const manualProvider = types.find((t: { type: string }) => t.type === 'manual');
     |                                    ^
  55 |       expect(manualProvider).toBeDefined();
  56 |       expect(manualProvider.name).toMatch(/manual/i);
  57 |
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:54:36

Error: 6) [chromium] tests/dns-provider-types.spec.ts:49:5 DNS Provider Types API: /api/v1/dns-providers/types manual provider type should have correct configuration

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
TypeError: Cannot read properties of undefined (reading 'find')

  52 |       const types = data.types;
  53 |
> 54 |       const manualProvider = types.find((t: { type: string }) => t.type === 'manual');
     |                                    ^
  55 |       expect(manualProvider).toBeDefined();
  56 |       expect(manualProvider.name).toMatch(/manual/i);
  57 |
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:54:36

Error: 6) [chromium] tests/dns-provider-types.spec.ts:49:5 DNS Provider Types API: /api/v1/dns-providers/types manual provider type should have correct configuration

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
TypeError: Cannot read properties of undefined (reading 'find')

  52 |       const types = data.types;
  53 |
> 54 |       const manualProvider = types.find((t: { type: string }) => t.type === 'manual');
     |                                    ^
  55 |       expect(manualProvider).toBeDefined();
  56 |       expect(manualProvider.name).toMatch(/manual/i);
  57 |
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:54:36

Error: 7) [chromium] tests/dns-provider-types.spec.ts:62:5 DNS Provider Types API: /api/v1/dns-providers/types webhook provider type should have url field TypeError: Cannot read properties of undefined (reading 'find')

  65 |       const types = data.types;
  66 |
> 67 |       const webhookProvider = types.find((t: { type: string }) => t.type === 'webhook');
     |                                     ^
  68 |       expect(webhookProvider).toBeDefined();
  69 |
  70 |       // Webhook should have URL configuration field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:67:37

Error: 7) [chromium] tests/dns-provider-types.spec.ts:62:5 DNS Provider Types API: /api/v1/dns-providers/types webhook provider type should have url field

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
TypeError: Cannot read properties of undefined (reading 'find')

  65 |       const types = data.types;
  66 |
> 67 |       const webhookProvider = types.find((t: { type: string }) => t.type === 'webhook');
     |                                     ^
  68 |       expect(webhookProvider).toBeDefined();
  69 |
  70 |       // Webhook should have URL configuration field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:67:37

Error: 7) [chromium] tests/dns-provider-types.spec.ts:62:5 DNS Provider Types API: /api/v1/dns-providers/types webhook provider type should have url field

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
TypeError: Cannot read properties of undefined (reading 'find')

  65 |       const types = data.types;
  66 |
> 67 |       const webhookProvider = types.find((t: { type: string }) => t.type === 'webhook');
     |                                     ^
  68 |       expect(webhookProvider).toBeDefined();
  69 |
  70 |       // Webhook should have URL configuration field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:67:37

Error: 8) [chromium] tests/dns-provider-types.spec.ts:75:5 DNS Provider Types API: /api/v1/dns-providers/types rfc2136 provider type should have server and key fields TypeError: Cannot read properties of undefined (reading 'find')

  78 |       const types = data.types;
  79 |
> 80 |       const rfc2136Provider = types.find((t: { type: string }) => t.type === 'rfc2136');
     |                                     ^
  81 |       expect(rfc2136Provider).toBeDefined();
  82 |
  83 |       // RFC2136 (Dynamic DNS) should have server and TSIG key fields
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:80:37

Error: 8) [chromium] tests/dns-provider-types.spec.ts:75:5 DNS Provider Types API: /api/v1/dns-providers/types rfc2136 provider type should have server and key fields

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
TypeError: Cannot read properties of undefined (reading 'find')

  78 |       const types = data.types;
  79 |
> 80 |       const rfc2136Provider = types.find((t: { type: string }) => t.type === 'rfc2136');
     |                                     ^
  81 |       expect(rfc2136Provider).toBeDefined();
  82 |
  83 |       // RFC2136 (Dynamic DNS) should have server and TSIG key fields
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:80:37

Error: 8) [chromium] tests/dns-provider-types.spec.ts:75:5 DNS Provider Types API: /api/v1/dns-providers/types rfc2136 provider type should have server and key fields

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
TypeError: Cannot read properties of undefined (reading 'find')

  78 |       const types = data.types;
  79 |
> 80 |       const rfc2136Provider = types.find((t: { type: string }) => t.type === 'rfc2136');
     |                                     ^
  81 |       expect(rfc2136Provider).toBeDefined();
  82 |
  83 |       // RFC2136 (Dynamic DNS) should have server and TSIG key fields
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:80:37

Error: 9) [chromium] tests/dns-provider-types.spec.ts:88:5 DNS Provider Types API: /api/v1/dns-providers/types script provider type should have command/path field TypeError: Cannot read properties of undefined (reading 'find')

  91 |       const types = data.types;
  92 |
> 93 |       const scriptProvider = types.find((t: { type: string }) => t.type === 'script');
     |                                    ^
  94 |       expect(scriptProvider).toBeDefined();
  95 |
  96 |       // Script provider should have a command or script path field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:93:36

Error: 9) [chromium] tests/dns-provider-types.spec.ts:88:5 DNS Provider Types API: /api/v1/dns-providers/types script provider type should have command/path field

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
TypeError: Cannot read properties of undefined (reading 'find')

  91 |       const types = data.types;
  92 |
> 93 |       const scriptProvider = types.find((t: { type: string }) => t.type === 'script');
     |                                    ^
  94 |       expect(scriptProvider).toBeDefined();
  95 |
  96 |       // Script provider should have a command or script path field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:93:36

Error: 9) [chromium] tests/dns-provider-types.spec.ts:88:5 DNS Provider Types API: /api/v1/dns-providers/types script provider type should have command/path field

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
TypeError: Cannot read properties of undefined (reading 'find')

  91 |       const types = data.types;
  92 |
> 93 |       const scriptProvider = types.find((t: { type: string }) => t.type === 'script');
     |                                    ^
  94 |       expect(scriptProvider).toBeDefined();
  95 |
  96 |       // Script provider should have a command or script path field
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:93:36

Error: 10) [chromium] tests/dns-provider-types.spec.ts:153:5 DNS Provider Types UI: Provider Selector should filter provider types based on search Verify options can be navigated with keyboard Error: expect(received).toBeGreaterThan(expected)

Expected: > 5
Received:   1

  165 |
  166 |         // Should have multiple provider options available
> 167 |         expect(optionCount).toBeGreaterThan(5);
      |                             ^
  168 |
  169 |         // Verify cloudflare option exists in the list
  170 |         await expect(page.getByRole('option', { name: /cloudflare/i })).toBeVisible();
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:167:29
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:158:7

Error: 10) [chromium] tests/dns-provider-types.spec.ts:153:5 DNS Provider Types UI: Provider Selector should filter provider types based on search Verify options can be navigated with keyboard

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(received).toBeGreaterThan(expected)

Expected: > 5
Received:   1

  165 |
  166 |         // Should have multiple provider options available
> 167 |         expect(optionCount).toBeGreaterThan(5);
      |                             ^
  168 |
  169 |         // Verify cloudflare option exists in the list
  170 |         await expect(page.getByRole('option', { name: /cloudflare/i })).toBeVisible();
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:167:29
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:158:7

Error: 10) [chromium] tests/dns-provider-types.spec.ts:153:5 DNS Provider Types UI: Provider Selector should filter provider types based on search Verify options can be navigated with keyboard

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(received).toBeGreaterThan(expected)

Expected: > 5
Received:   1

  165 |
  166 |         // Should have multiple provider options available
> 167 |         expect(optionCount).toBeGreaterThan(5);
      |                             ^
  168 |
  169 |         // Verify cloudflare option exists in the list
  170 |         await expect(page.getByRole('option', { name: /cloudflare/i })).toBeVisible();
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:167:29
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:158:7

Error: 11) [chromium] tests/dns-provider-types.spec.ts:278:5 DNS Provider Types Provider Type Selection should show script path field when Script type is selected Verify Script path/command field appears Error: expect(locator).toBeVisible() failed

Locator: getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))
Expected: visible
Timeout: 5000ms
Error: element(s) not found

Call log:
  - Expect "toBeVisible" with timeout 5000ms
  - waiting for getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))


  262 |         const scriptField = page.getByRole('textbox', { name: /script path/i })
  263 |           .or(page.getByPlaceholder(/dns-challenge\.sh/i));
> 264 |         await expect(scriptField).toBeVisible();
      |                                   ^
  265 |       });
  266 |     });
  267 |   });
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:264:35
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:260:18

Error: 11) [chromium] tests/dns-provider-types.spec.ts:278:5 DNS Provider Types Provider Type Selection should show script path field when Script type is selected Verify Script path/command field appears

Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(locator).toBeVisible() failed

Locator: getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))
Expected: visible
Timeout: 5000ms
Error: element(s) not found

Call log:
  - Expect "toBeVisible" with timeout 5000ms
  - waiting for getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))


  262 |         const scriptField = page.getByRole('textbox', { name: /script path/i })
  263 |           .or(page.getByPlaceholder(/dns-challenge\.sh/i));
> 264 |         await expect(scriptField).toBeVisible();
      |                                   ^
  265 |       });
  266 |     });
  267 |   });
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:264:35
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:260:18

Error: 11) [chromium] tests/dns-provider-types.spec.ts:278:5 DNS Provider Types Provider Type Selection should show script path field when Script type is selected Verify Script path/command field appears

Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
Error: expect(locator).toBeVisible() failed

Locator: getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))
Expected: visible
Timeout: 5000ms
Error: element(s) not found

Call log:
  - Expect "toBeVisible" with timeout 5000ms
  - waiting for getByRole('textbox', { name: /script path/i }).or(getByPlaceholder(/dns-challenge\.sh/i))


  262 |         const scriptField = page.getByRole('textbox', { name: /script path/i })
  263 |           .or(page.getByPlaceholder(/dns-challenge\.sh/i));
> 264 |         await expect(scriptField).toBeVisible();
      |                                   ^
  265 |       });
  266 |     });
  267 |   });
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:264:35
    at /home/runner/work/Charon/Charon/tests/dns-provider-types.spec.ts:260:18

Notice: 11 failed [chromium] tests/dns-provider-crud.spec.ts:16:5 DNS Provider CRUD Operations Create Provider should create a Manual DNS provider [chromium] tests/dns-provider-crud.spec.ts:501:5 DNS Provider CRUD Operations API Operations should list providers via API [chromium] tests/dns-provider-crud.spec.ts:534:5 DNS Provider CRUD Operations API Operations should reject invalid provider type via API [chromium] tests/dns-provider-types.spec.ts:15:5 DNS Provider Types API: /api/v1/dns-providers/types should return all provider types including built-in and custom [chromium] tests/dns-provider-types.spec.ts:36:5 DNS Provider Types API: /api/v1/dns-providers/types each provider type should have required fields [chromium] tests/dns-provider-types.spec.ts:49:5 DNS Provider Types API: /api/v1/dns-providers/types manual provider type should have correct configuration [chromium] tests/dns-provider-types.spec.ts:62:5 DNS Provider Types API: /api/v1/dns-providers/types webhook provider type should have url field [chromium] tests/dns-provider-types.spec.ts:75:5 DNS Provider Types API: /api/v1/dns-providers/types rfc2136 provider type should have server and key fields [chromium] tests/dns-provider-types.spec.ts:88:5 DNS Provider Types API: /api/v1/dns-providers/types script provider type should have command/path field [chromium] tests/dns-provider-types.spec.ts:153:5 DNS Provider Types UI: Provider Selector should filter provider types based on search [chromium] tests/dns-provider-types.spec.ts:278:5 DNS Provider Types Provider Type Selection should show script path field when Script type is selected 4 skipped 40 passed (2.0m) Error: Process completed with exit code 1.