--- name: karibu-test description: > Creates Karibu server-side unit tests for Vaadin views covering navigation, component interactions, form validation, grid operations, and notifications. Use when the user asks to "write Karibu tests", "unit test a Vaadin view", "test the UI server-side", "create view tests", or mentions Karibu testing, Vaadin unit tests, or server-side UI testing. --- # Karibu Test > **Legacy skill — no longer recommended for new code.** Since Vaadin 25.1 the official Vaadin Browserless Testing > framework (`com.vaadin:browserless-test-junit6`) is free and open source under Apache 2.0. It supersedes the > community Karibu Testing library. Prefer **`/browserless-test`** for new test classes. Use this skill only when > extending an existing Karibu-based test suite. ## Instructions Create Karibu unit tests for Vaadin views based on the use case $ARGUMENTS. Karibu Testing allows server-side testing of Vaadin components without a browser. If the KaribuTesting MCP server (`https://karibu-testing-mcp.martinelli.ch/mcp`) is configured, use it for documentation and code generation; otherwise rely on your own knowledge and the documentation links below. See [the MCP setup rule](../../rules/mcp-servers.md) to configure this optional server. ## If Tests for This Use Case Already Exist A diff of the specification change may follow the file path in the arguments. When it is there, it is the definitive list of what changed — work through it change by change. A removed line means the scenario it described was dropped: delete the tests that exist only for it instead of keeping them as passing extras. Before writing new tests, look for an existing test class for this use case — search for `UC*Test` and for methods annotated `@UseCase(id = "UC-XXX")`. If one exists, **update it to match the current specification instead of creating a second test class**: - Add test methods for scenarios and business rules the spec has gained since the tests were written - Update existing test methods whose expected values, labels, component captions, or flows the spec has changed - Delete tests for scenarios the spec no longer contains - Leave passing tests the spec still requires untouched - Update the test data (Flyway test migrations) when the spec's data requirements changed - Run the whole test class afterwards, not only the methods you added ## Test Class Naming and `@UseCase` Annotation Karibu tests are **use case tests**. Each test class verifies the behavior of exactly one use case from the use case specification (`docs/use-cases/UC-XXX-*.md`). ### Class naming Test classes must be named after the use case using the pattern `UCTest` — for example `UC001RegisterPersonTest` for use case UC-001 "Register Person". This is the convention the AI Unified Process IntelliJ Navigator plugin relies on to link specs and tests. ### `@UseCase` annotation Every test method must be annotated with `@UseCase(id = "UC-XXX", ...)` so the [AI Unified Process IntelliJ Navigator plugin](https://github.com/AI-Unified-Process/intellij-plugin) can wire up gutter icons and Find Usages between the Markdown spec and the Java tests. **Bootstrap step.** Before writing any tests, check whether the project already contains an annotation type named `UseCase` (search the project for `@interface UseCase`). If it does not, create it. The package does not matter — the plugin resolves the annotation by short name — but a conventional location is `src/main/java///usecase/UseCase.java`. The annotation must have exactly this shape: ```java package com.example.app.usecase; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface UseCase { String id(); String scenario() default "Main Success Scenario"; String[] businessRules() default {}; } ``` ### Usage on test methods Annotate each test method with the use case ID and (when applicable) the scenario and business rules it covers. The values must match headings in the corresponding `UC-XXX-*.md` spec: | Attribute | Maps to spec heading | Default | |-----------------|--------------------------------------------|--------------------------| | `id` | `**Use Case ID:** UC-XXX` | (required) | | `scenario` | `## Main Success Scenario` or `### A1: …` | `"Main Success Scenario"` | | `businessRules` | `### BR-XXX` headings inside the same UC | `{}` | ```java @Test @UseCase(id = "UC-001") void register_person_with_valid_data() { ... } @Test @UseCase(id = "UC-001", scenario = "A1: Email Already Exists") void registration_fails_when_email_already_exists() { ... } @Test @UseCase(id = "UC-001", scenario = "A2: Invalid Postal Code", businessRules = {"BR-003"}) void registration_fails_when_postal_code_invalid() { ... } ``` ## DO NOT - Use Mockito for mocking - Use @Transactional annotation (transaction boundaries must stay intact) - Use services, repositories, or DSLContext to create test data - Delete all data in cleanup (only remove data created during the test) - Use browser-based testing patterns (this is server-side testing) ## Test Data Strategy Create test data using Flyway migrations in `src/test/resources/db/migration`. | Approach | Location | Purpose | |------------------|----------------------------------------|--------------------------| | Flyway migration | src/test/resources/db/migration/V*.sql | Populate test data | | Manual cleanup | @AfterEach method | Remove test-created data | ## Key Helper Classes | Class | Purpose | |---------------------------------------------------------|----------------------------------| | com.github.mvysny.kaributesting.v10.LocatorJ | Find components | | com.github.mvysny.kaributesting.v10.GridKt | Grid assertions and interactions | | com.github.mvysny.kaributesting.v10.NotificationsKt | Notification assertions | | com.github.mvysny.kaributesting.v10.pro.ConfirmDialogKt | ConfirmDialog interactions | ## Template Use [references/UC001ManagePersonsTest.java](references/UC001ManagePersonsTest.java) as the test class structure. It demonstrates the `UCTest` class naming, the `@UseCase` annotation on every test method, and how to map alternative flows (`scenario = "A1: …"`) and business rules (`businessRules = {"BR-…"}`) onto the spec headings. ## Common Patterns ### Navigate to View ```java UI.getCurrent().navigate(PersonView.class); ``` ### Find Components ```java // Find by type var grid = _get(Grid.class); var button = _get(Button.class, spec -> spec.withCaption("Save")); var textField = _get(TextField.class, spec -> spec.withLabel("Name")); // Find all matching List