con un clic
scout-api-testing
// Use when creating, updating, debugging, or reviewing Scout API tests in Kibana (apiTest/apiClient/requestAuth/samlAuth/apiServices), including auth choices, response assertions, and API service patterns.
// Use when creating, updating, debugging, or reviewing Scout API tests in Kibana (apiTest/apiClient/requestAuth/samlAuth/apiServices), including auth choices, response assertions, and API service patterns.
Single entry point for migrating Kibana Functional Test Runner (FTR) tests to Scout. Plans the migration first, asks the user to review the plan, then executes it and runs the new tests. Use when migrating FTR tests to Scout, triaging FTR suites for Scout readiness, deciding UI vs API vs RTL/Jest, mapping FTR services/page objects/hooks to Scout fixtures, or splitting loadTestFile patterns.
Use when creating, updating, debugging, or reviewing Scout UI tests in Kibana (Playwright + Scout fixtures), including page objects, browser authentication, parallel UI tests (spaceTest/scoutSpace), a11y checks, and flake control.
Use when you need a quick VALID or NOT VALID result for a scoped Kibana OAS area, and first ensure the generated `oas_docs` inputs are up to date so validation runs against the current environment rather than stale snapshots.
Deep reference for the Kibana Functional Test Runner (FTR). Use when reading, analyzing, debugging, or reviewing FTR tests, including config anatomy, services, page objects, loadTestFile patterns, data loading, tags, CI wiring, and common FTR idioms.
This skill should be used when the user asks to "create a kbn-ui package", "onboard a component to kbn-ui", "package a Kibana component for external distribution", "add a package to kbn-ui", "set up packaging for a Kibana component", or any mention of distributing a Kibana UI component to Cloud UI or external consumers. Guides the full interactive process: gathers inputs, moves source files, scaffolds the packaging layer, and updates all Kibana imports.
Create a new GitHub issue (feature request or bug report) by gathering an unstructured description from the user, classifying it, filling out the appropriate Kibana template, interviewing the user to improve any weak sections, and filing the issue via the GitHub CLI.
| name | scout-api-testing |
| description | Use when creating, updating, debugging, or reviewing Scout API tests in Kibana (apiTest/apiClient/requestAuth/samlAuth/apiServices), including auth choices, response assertions, and API service patterns. |
<module-root>/test/scout*/api/{tests,parallel_tests}/**/*.spec.ts (examples: test/scout/api/..., test/scout_uiam_local/api/...).src/platform/** or x-pack/platform/** -> @kbn/scoutx-pack/solutions/observability/** -> @kbn/scout-obltx-pack/solutions/search/** -> @kbn/scout-searchx-pack/solutions/security/** -> @kbn/scout-securityapiTest.describe(...) per file and avoid nested describe blocks; multiple top-level describes are supported, but files get hard to read quickly.{ tag: ... } on the suite (or individual tests) so CI/discovery can select the right test target. For solution modules, prefer explicit targets (e.g. [...tags.stateful.classic, ...tags.serverless.observability.complete] in Observability); reserve tags.deploymentAgnostic mainly for platform specs that truly need every deployment-agnostic target (see scout-migrate-from-ftr). Unlike UI tests, API tests don’t currently validate tags at runtime.@ in test titles: Playwright treats @word in test/describe titles as tags. Do not use @ followed by word characters in titles (e.g., @timestamp, @elastic). Rephrase the title instead (e.g., use timestamp field instead of @timestamp).apiTest from <module-root>/test/scout*/api/fixtures to get module-specific extensions. Importing directly from the module’s Scout package is also fine when you don’t need extensions.apiTest (no page, browserAuth, pageObjects).import { apiTest, tags } from '@kbn/scout'; (or the module's Scout package, e.g. @kbn/scout-oblt)import { expect } from '@kbn/scout/api'; (or @kbn/scout-oblt/api, etc.) — not from the main entryimport type { RoleApiCredentials } from '@kbn/scout';expect is not exported from the main @kbn/scout entry. Use the /api subpath for API tests.api/* endpoints: use API keys via requestAuth (getApiKey, getApiKeyForCustomRole).internal/* endpoints: use cookies via samlAuth.asInteractiveUser(...).apiServices/kbnClient/esArchiver in beforeAll.beforeAll and reuse.apiClient and the right headers.statusCode and response body; verify side effects via apiServices/kbnClient when needed.Important: apiServices/kbnClient run with elevated privileges. Don’t use them to validate the endpoint under test (use apiClient + scoped auth).
Header reminders:
kbn-xsrf.x-elastic-internal-origin: kibana for Kibana APIs.elastic-api-version for versioned public APIs (e.g. '2023-10-31') or internal APIs (e.g. '1').apiClient methods (get, post, put, delete, patch, head) return { statusCode, body, headers }.@kbn/scout/api:
expect(response).toHaveStatusCode(200)expect(response).toHaveStatusText('OK')expect(response).toHaveHeaders({ 'content-type': 'application/json' })toBe, toStrictEqual, toMatchObject, etc.) and asymmetric matchers (expect.objectContaining(...), expect.any(String)) are also available.apiServices (no UI interactions). Use it for setup/teardown and verifying side effects, not for RBAC validation.<module-root>/test/scout*/api/services/<service>_api_service.ts (or similar). Register it by extending the module's apiServices fixture in <module-root>/test/scout*/api/fixtures/index.ts (prefer { scope: 'worker' } when the helper doesn't need per-test state).src/platform/packages/shared/kbn-scout/src/playwright/fixtures/scope/worker/apis/.When tests need custom auth helpers or API services, extend apiTest in the module's fixtures/index.ts:
import { apiTest as base } from '@kbn/scout'; // or the module's Scout package
import type { RequestAuthFixture } from '@kbn/scout';
interface MyApiFixtures {
requestAuth: RequestAuthFixture & { getMyPluginApiKey: () => Promise<RoleApiCredentials> };
}
export const apiTest = base.extend<MyApiFixtures>({
requestAuth: async ({ requestAuth }, use) => {
const getMyPluginApiKey = async () =>
requestAuth.getApiKeyForCustomRole({
kibana: [{ base: [], feature: { myPlugin: ['all'] }, spaces: ['*'] }],
});
await use({ ...requestAuth, getMyPluginApiKey });
},
});
Tests then import apiTest from the local fixtures: import { apiTest } from '../fixtures';
--config or --testFiles (they are mutually exclusive).node scripts/scout.js run-tests --arch stateful --domain classic --config <module-root>/test/scout*/api/playwright.config.ts (or .../api/parallel.playwright.config.ts for parallel API runs)playwright.config.ts vs parallel.playwright.config.ts): node scripts/scout.js run-tests --arch stateful --domain classic --testFiles <module-root>/test/scout*/api/tests/my.spec.tsnode scripts/scout.js start-server --arch stateful --domain classic [--serverConfigSet <configSet>], then run Playwright directly: node scripts/playwright test --config <...> --project local --grep <tag>.run-tests auto-detects custom config sets from .../test/scout_<name>/... paths.start-server has no Playwright config to inspect, so pass --serverConfigSet <name> when your tests require a custom config set.SCOUT_LOG_LEVEL=debugplugins.enabled / packages.enabled in .buildkite/scout_ci_config.yml.node scripts/scout.js generate registers the module under enabled so the new configs run in CI.Open only what you need:
references/scout-api-auth.mdapiServices helpers (kbnClient + retries + logging): references/scout-api-services.md