<< All versions

Skill v1.0.0

currentLLM-judged scan90/100
ls1intum/artemis/write-tests
──Details
PublishedOctober 22, 2026 at 02:44 AM
Content Hashsha256:29e1e7b221d8cc10...
Git SHA1f30b8cdb78b
──Files
Files (1 file, 3.0 KB)
SKILL.md3.0 KBactive
SKILL.md · 73 lines · 3.0 KB

version: "1.0.0" name: write-tests description: Write or debug Artemis JUnit and Vitest tests, including failures that differ between local runs and CI.


Write Artemis tests

Server tests

Server tests need Docker. They run against PostgreSQL through Testcontainers, locally and in CI.

bash
./gradlew test -x webapp # everything
./gradlew test --tests ExamIntegrationTest -x webapp # one class
./gradlew test --tests ExamIntegrationTest.testGetExamScore # one method
./gradlew test -DincludeTags='ArchitectureTest' -x webapp # architecture only, fast

Name tests *Test.java. Reuse the module's base class where one exists.

Read reference/server.md for base class selection, the admin naming rule that forces a different @ResourceLock, date comparison, and shared-spy flakiness.

In the admin module, naming a test `*IntegrationTest` forces it onto a batch base class carrying a shared `@ResourceLock`. A test that mutates global state and needs isolation must be named *Test and extend AbstractSpringIntegrationIndependentTest instead. Enforced by src/test/java/de/tum/cit/aet/artemis/admin/architecture/AdminTestArchitectureTest.java.

Client tests

Vitest, not Jest. Use vi.spyOn(), vi.fn(), vi.clearAllMocks().

bash
pnpm run vitest # watch
pnpm run vitest:run # single run, everything
pnpm exec vitest run <path/to/spec.ts> # single file
pnpm run vitest:coverage
pnpm run test-diff # only specs affected by the diff

`pnpm run vitest:run -- <path>` runs the entire suite. The path is swallowed. Use pnpm exec vitest run <path> for a single file.

Vitest is not the type check CI runs. CI runs a stricter spec tsc:

bash
pnpm run compile:tests

It enforces member visibility, which Vitest does not. A spec that reaches a private member as component.privateThing passes locally and fails in CI. Use bracket access, component['privateThing'], and run compile:tests before pushing.

Test a directive with `TestBed.createDirective`, not a throwaway host component. Keep a host only when the directive is structural or needs a template around it: something around or beside it, content Angular keeps rendering inside it, a static attribute its constructor reads, or an input that takes a TemplateRef or a component instance from the same template. Input bindings apply on the first detectChanges().

Read reference/client.md for the rest: the createDirective pattern and its limits, the monaco stub, zoneless test setup, model() versus input() plus output(), and why template errors need a build rather than a test run.

Both

Keep tests deterministic. Mock external services and WebSockets. CI enforces per-module coverage thresholds, so a new class with no test can fail the build even when nothing is broken.

For E2E tests, see skills/e2e-pr-check/SKILL.md. Do not add a Playwright test for behavior that a unit or integration test can cover.

All versions