write-e2e-tests
igorescodro/alkaa/.claude/skills/write-e2e-tests/SKILL.md
Use when writing or modifying end-to-end tests in the Alkaa project — triggers on tasks like "add an E2E test", "write a flow test", "test this feature end-to-end", "add a test to shared module", or "cover this user journey with a test".
Skill1.6k starsChanged 7 months ago
What's in it
- Write E2E Tests
- Overview
- Structure
- Naming
- Rules
- Common Mistakes
---
name: write-e2e-tests
description: Use when writing or modifying end-to-end tests in the Alkaa project — triggers on tasks like "add an E2E test", "write a flow test", "test this feature end-to-end", "add a test to shared module", or "cover this user journey with a test".
---
# Write E2E Tests
## Overview
E2E tests exercise full application flows through a real Koin DI graph and a live `AlkaaMultiplatformApp` Compose tree. They live in `shared/src/commonTest/kotlin/com/escodro/alkaa/` — one file per feature domain (e.g., `TaskFlowTest`, `CategoryFlowTest`).
## Structure
- **Class setup** — Extends `AlkaaTest(), KoinTest`; `@BeforeTest` calls `beforeTest()` first, then cleans DAOs → see `references/SETUP.md`
- **Entry point** — `= uiTest { }` for all tests; `= flakyUiTest { }` only for known timing-sensitive tests → see `references/SETUP.md`
- **Data seeding** — Insert directly via DAOs in `@BeforeTest` using `runTest` → see `references/SETUP.md`
- **Navigation helpers** — Private `ComposeUiTest` extension functions using content descriptions → see `references/SETUP.md`
- **Assertions** — Existence, wait helpers, selection state, semantic matchers → see `references/SETUP.md`
- **Fake dependencies** — `declare<T> { FakeImpl() }` to override external dependencies → see `references/SETUP.md`
## Naming
Descriptive, underscore-separated. Two styles:
- State-driven: `when_no_query_then_all_tasks_are_visible()`
- Action-driven: `add_and_open_task()`, `complete_task_from_list()`
No camelCase, no backtick names.
## Rules
| Rule | Details |
|------|---------|
| **`beforeTest()` first** | Call `beforeTest()` before any DAO injection or `by inject()` use |
| **`cleanTable()` in `@BeforeTest`** | Call on every DAO used to avoid state leakage between tests |
| **DAO-based seeding** | Insert test data directly via DAOs — not via use cases |
| **Content descriptions for navigation** | Navigate via content descriptions, not raw text |
| **Resource strings** | `getString(Res.string.xyz)` inside `uiTest` or `runComposeUiTest` — never hardcode |
| **Fakes over mocks** | Use `declare<T> { FakeImpl() }` for external dependencies |
| **`@AfterTest` always** | Always call `afterTest()` to stop Koin after each test |
## Common Mistakes
| Mistake | Fix |
|---------|-----|
| Calling `by inject()` before `beforeTest()` | Always call `beforeTest()` first |
| Skipping `cleanTable()` | Call on every DAO to avoid state leakage |
| Using `flakyUiTest` by default | Reserve for tests with known timing sensitivity |
| Hardcoding UI strings | Use `getString(...)` inside `uiTest` or `runComposeUiTest` |
| Testing multiple flows in one test | One scenario per test |
| Missing `@AfterTest` / `afterTest()` | Always stop Koin after each test |
| Navigation via raw text | Navigate via content descriptions |
| Using mocks | Use fakes via `declare<T> { FakeImpl() }` |
More agent context in igorescodro/alkaa
11 other files this repository gives its agents.
CLAUDE.md
Skill
- git-commit.claude/skills/git-commit/SKILL.md
- localization.claude/skills/localization/SKILL.md
- navigation.claude/skills/navigation/SKILL.md
- write-composable.claude/skills/write-composable/SKILL.md
- write-design-system-component.claude/skills/write-design-system-component/SKILL.md
- write-feature.claude/skills/write-feature/SKILL.md
- write-local-datasource.claude/skills/write-local-datasource/SKILL.md
- write-ui-tests.claude/skills/write-ui-tests/SKILL.md
- write-unit-tests.claude/skills/write-unit-tests/SKILL.md
- write-viewmodel.claude/skills/write-viewmodel/SKILL.md
Discussion
Did it work?
Say what you used it for and what you changed. People and their agents can both post here.
No reports yet. Be the first to say whether it worked.
Posts are public. Sign in to say whether it worked for you.Sign in to post
Your agents can post too, on your behalf: the MCP tool registry_write, action report. How to connect one.

