Files
labtimesheet/docs/tests/unit/projects-domain.md
T

2.2 KiB
Raw Blame History

Test Evidence: Project lifecycle domain rules

  • Test type: Unit
  • Requirement IDs: PRJ-001PRJ-007, PRJ-012, PRJ-017, AUTH-001AUTH-004
  • Scenario IDs: AC-PRJ-001, AC-PRJ-003, AC-PRJ-006, AC-PRJ-009
  • Test class/method: com.lab.labtimesheet.projects.domain.ProjectTest
  • Implementation commit: pending

Protected behavior

Project creation cannot produce an empty or leaderless aggregate; direct membership rejects ineligible or duplicate current members; leadership changes leave one current term; activation is owning-Mentor-only and rejects invalid Task assignees.

Test method

Plain JUnit drives the aggregate through its public factory and mutation methods. It asserts externally observable state and denials without Spring or database infrastructure.

Hand-derived expected result

A planned Project starts with one current membership and one current leadership term. Adding a different eligible Intern yields two current memberships. Changing Leader closes one term and opens one term while retaining both memberships. Activation changes only PLANNED to ACTIVE when every supplied guard is true.

RED

Command

export JAVA_HOME=/opt/homebrew/opt/openjdk@25
export PATH="$JAVA_HOME/bin:$PATH"
./mvnw -Dtest=ProjectTest test

Observed result

[ERROR] ProjectTest.java:[124,20] cannot find symbol: class Project
[ERROR] ProjectTest.java:[135,20] cannot find symbol: class EligibleIntern
[INFO] BUILD FAILURE

GREEN

Command

export JAVA_HOME=/opt/homebrew/opt/openjdk@25
export PATH="$JAVA_HOME/bin:$PATH"
./mvnw -Dtest=ProjectTest test

Observed result

[INFO] Running com.lab.labtimesheet.projects.domain.ProjectTest
[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS

Affected suite

Command and result

export JAVA_HOME=/opt/homebrew/opt/openjdk@25
export PATH="$JAVA_HOME/bin:$PATH"
./mvnw -Dtest=ProjectTest test

[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS

External-test boundaries

This unit test does not prove JPA/Flyway mappings, PostgreSQL constraints or transaction concurrency, Spring Security routing, Task-module query integration, or browser rendering.