# Unit Test Files Index

## Complete List of Test Files Created

### Domain Layer Tests

#### `/home/sebi/git/effigenix/src/test/java/com/effigenix/domain/usermanagement/UserIdTest.java`
- **Class Under Test**: `UserId`
- **Type**: Value Object Test
- **Test Count**: 11 test cases
- **Key Tests**:
  - Valid ID creation
  - Null/empty/blank string rejection
  - Unique ID generation via `UserId.generate()`
  - Static factory method `UserId.of(String value)`
  - Record immutability
  - Equality and hash code consistency
  - Parameterized tests for invalid inputs

#### `/home/sebi/git/effigenix/src/test/java/com/effigenix/domain/usermanagement/RoleIdTest.java`
- **Class Under Test**: `RoleId`
- **Type**: Value Object Test
- **Test Count**: 11 test cases
- **Key Tests**:
  - Similar to UserIdTest but for Role identifiers
  - UUID generation uniqueness
  - Factory methods testing
  - Immutability verification

#### `/home/sebi/git/effigenix/src/test/java/com/effigenix/domain/usermanagement/PasswordHashTest.java`
- **Class Under Test**: `PasswordHash`
- **Type**: Value Object Test (Cryptographic)
- **Test Count**: 16 test cases
- **Key Tests**:
  - BCrypt hash creation acceptance ($2a$, $2b$, $2y$ versions)
  - 60-character length validation
  - Invalid format rejection (non-BCrypt, wrong length)
  - Static factory `PasswordHash.of(String bcryptHash)`
  - Immutability and equality
  - Comprehensive format validation with parameterized tests

#### `/home/sebi/git/effigenix/src/test/java/com/effigenix/domain/usermanagement/UserTest.java`
- **Class Under Test**: `User` (Entity)
- **Type**: Entity Business Logic Test
- **Test Count**: 35+ test cases
- **Key Tests**:
  - **Construction & Validation** (5+ tests)
    - Valid user creation
    - Null validation for UserId, username, email, passwordHash, status
    - Email format validation
    - Default createdAt timestamp
    - Factory method `User.create()`
  - **Status Management** (8+ tests)
    - `lock()` / `unlock()` state transitions
    - `activate()` / `deactivate()` state transitions
    - Status verification methods: `isActive()`, `isLocked()`
  - **Password Management** (3+ tests)
    - `changePassword()` with hash replacement
    - Null hash rejection
  - **Email & Branch Updates** (3+ tests)
    - `updateEmail()` with validation
    - `updateBranch()` assignment
  - **Role Management** (6+ tests)
    - `assignRole()` / `removeRole()`
    - Null role rejection
    - Unmodifiable role set
  - **Permission Logic** (4+ tests)
    - `getAllPermissions()` aggregates from all roles
    - `hasPermission()` checks existence
    - Empty set for users without roles
  - **Login Tracking** (1+ tests)
    - `updateLastLogin()` timestamp
  - **Equality & Immutability** (4+ tests)
    - ID-based equality
    - Unmodifiable collections

#### `/home/sebi/git/effigenix/src/test/java/com/effigenix/domain/usermanagement/RoleTest.java`
- **Class Under Test**: `Role` (Entity)
- **Type**: Entity Business Logic Test
- **Test Count**: 25+ test cases
- **Key Tests**:
  - **Construction & Validation** (4+ tests)
    - Valid role creation
    - Null RoleId/RoleName rejection
    - Null permissions defaulting to empty set
  - **Permission Management** (8+ tests)
    - `addPermission()` / `removePermission()`
    - Duplicate permission handling
    - Null permission rejection
    - Multiple permission operations
    - `hasPermission()` verification
  - **Description Management** (2+ tests)
    - `updateDescription()` updates
    - Null description handling
  - **Equality & Immutability** (4+ tests)
    - ID-based equality
    - Unmodifiable permission set
    - Hash code consistency
  - **Multi-Role Support** (3+ tests)
    - Different RoleNames support
    - Different permission sets
    - Large permission sets

---

### Application Layer Tests

#### `/home/sebi/git/effigenix/src/test/java/com/effigenix/application/usermanagement/CreateUserTest.java`
- **Use Case Under Test**: `CreateUser`
- **Type**: Application Layer / Use Case Test
- **Test Count**: 16 test cases
- **Mocked Dependencies**: UserRepository, RoleRepository, PasswordHasher, AuditLogger
- **Key Tests**:
  - **Success Path** (3+ tests)
    - Valid user creation with all checks
    - Password hashing via PasswordHasher
    - Role loading and assignment
    - UserDTO returned correctly
  - **Password Validation** (1+ tests)
    - Weak password rejection
  - **Uniqueness Checks** (2+ tests)
    - Duplicate username detection
    - Duplicate email detection
    - Validation ordering verification
  - **Role Loading** (2+ tests)
    - Multiple role loading
    - Role not found exception
  - **User Status** (1+ tests)
    - New users created as ACTIVE
  - **Persistence & Audit** (3+ tests)
    - Repository save verification
    - AuditEvent.USER_CREATED logging
    - Audit contains correct ActorId
  - **Error Handling** (3+ tests)
    - Result<Error, DTO> pattern verification
    - No persistence on failure
    - No audit on failure

#### `/home/sebi/git/effigenix/src/test/java/com/effigenix/application/usermanagement/AuthenticateUserTest.java`
- **Use Case Under Test**: `AuthenticateUser`
- **Type**: Application Layer / Use Case Test
- **Test Count**: 15 test cases
- **Mocked Dependencies**: UserRepository, PasswordHasher, SessionManager, AuditLogger
- **Key Tests**:
  - **Success Path** (2+ tests)
    - Credentials verified
    - SessionToken created
    - Last login updated
    - AuditEvent.LOGIN_SUCCESS logged
  - **Username Validation** (1+ tests)
    - User not found error
  - **Status Checks** (3+ tests)
    - LOCKED status blocks login
    - INACTIVE status blocks login
    - ACTIVE status allows login
  - **Password Verification** (2+ tests)
    - Incorrect password failure
    - Correct password success
  - **Session Management** (2+ tests)
    - SessionManager invoked
    - SessionToken returned
  - **Last Login Update** (1+ tests)
    - Timestamp set and persisted
  - **Audit Trail** (3+ tests)
    - Success and failure logging
    - Correct context and ActorId

#### `/home/sebi/git/effigenix/src/test/java/com/effigenix/application/usermanagement/ChangePasswordTest.java`
- **Use Case Under Test**: `ChangePassword`
- **Type**: Application Layer / Use Case Test
- **Test Count**: 14 test cases
- **Mocked Dependencies**: UserRepository, PasswordHasher, AuditLogger
- **Key Tests**:
  - **Success Path** (1+ tests)
    - Password changed successfully
  - **User Lookup** (1+ tests)
    - User not found error
  - **Current Password Verification** (2+ tests)
    - Incorrect current password rejection
    - Verification ordering
  - **New Password Validation** (2+ tests)
    - Weak password rejection
    - Validation ordering
  - **Password Hashing** (1+ tests)
    - New hash created and assigned
  - **Verification Ordering** (1+ tests)
    - Current password verified before new password validated
  - **Persistence** (1+ tests)
    - Updated user saved
  - **Audit Trail** (4+ tests)
    - Success logging
    - Failure logging with context

---

### Infrastructure Layer Tests

#### `/home/sebi/git/effigenix/src/test/java/com/effigenix/infrastructure/security/BCryptPasswordHasherTest.java`
- **Class Under Test**: `BCryptPasswordHasher`
- **Type**: Implementation / Cryptography Test
- **Test Count**: 26+ test cases
- **Key Tests**:
  - **Hashing** (6+ tests)
    - Valid password hashing
    - BCrypt format validation
    - Hash uniqueness (salt randomness)
    - Null/empty/blank rejection
    - Weak password rejection
  - **Verification** (5+ tests)
    - Correct password verification
    - Incorrect password failure
    - Null safety (returns false)
    - Malformed hash handling
  - **Password Validation** (10+ tests)
    - Minimum 8 characters
    - Uppercase letter requirement
    - Lowercase letter requirement
    - Digit requirement
    - Special character requirement
    - All requirements together
    - Long password acceptance
    - Null password handling
    - Similar password rejection
  - **Security Properties** (3+ tests)
    - Strength 12 format verification
    - Constant-time comparison (timing attack resistance)
    - Error graceful handling

#### `/home/sebi/git/effigenix/src/test/java/com/effigenix/infrastructure/persistence/usermanagement/mapper/UserMapperTest.java`
- **Class Under Test**: `UserMapper`
- **Type**: Hexagonal Port / Mapper Test
- **Test Count**: 16 test cases
- **Key Tests**:
  - **Domain → JPA Entity** (4+ tests)
    - All fields mapped correctly
    - Value object extraction
    - Timestamps preserved
    - Status preserved
  - **JPA Entity → Domain** (4+ tests)
    - All fields mapped correctly
    - Value object creation
    - Timestamps preserved
    - Status preserved
  - **Null Handling** (3+ tests)
    - Null user → null entity
    - Null entity → null domain
    - Null role set → empty set
  - **Bidirectional Mapping** (2+ tests)
    - User → Entity → User preservation
    - Field consistency round-trip
  - **Collection Independence** (2+ tests)
    - Set copied (not referenced)
    - Role set independence
  - **Status Mapping** (1+ tests)
    - All user statuses preserved

#### `/home/sebi/git/effigenix/src/test/java/com/effigenix/infrastructure/persistence/usermanagement/mapper/RoleMapperTest.java`
- **Class Under Test**: `RoleMapper`
- **Type**: Hexagonal Port / Mapper Test
- **Test Count**: 16 test cases
- **Key Tests**:
  - **Domain → JPA Entity** (4+ tests)
    - All fields mapped
    - Value object extraction
    - Description preserved
  - **JPA Entity → Domain** (4+ tests)
    - All fields mapped
    - Value object creation
    - Description preserved
  - **Null Handling** (3+ tests)
    - Null role → null entity
    - Null entity → null domain
    - Null permissions → empty set
  - **Bidirectional Mapping** (2+ tests)
    - Role → Entity → Role preservation
    - Full round-trip consistency
  - **Collection Independence** (2+ tests)
    - Permission set copied
    - No shared references
  - **Role Name Mapping** (1+ tests)
    - All RoleNames preserved

---

## Test Statistics by File

| File | Tests | LOC | Focus |
|------|-------|-----|-------|
| UserIdTest.java | 11 | 125 | Value object |
| RoleIdTest.java | 11 | 112 | Value object |
| PasswordHashTest.java | 16 | 232 | Cryptographic validation |
| UserTest.java | 35+ | 520 | Entity logic |
| RoleTest.java | 25+ | 420 | Entity logic |
| CreateUserTest.java | 16 | 285 | Use case flow |
| AuthenticateUserTest.java | 15 | 310 | Authentication |
| ChangePasswordTest.java | 14 | 280 | Password change |
| BCryptPasswordHasherTest.java | 26+ | 395 | Cryptography |
| UserMapperTest.java | 16 | 315 | Entity mapping |
| RoleMapperTest.java | 16 | 315 | Entity mapping |
| **TOTAL** | **170+** | **3,309** | **Full coverage** |

---

## How to Find Tests

### By Component
- **UserId**: `UserIdTest.java`
- **RoleId**: `RoleIdTest.java`
- **PasswordHash**: `PasswordHashTest.java`
- **User Entity**: `UserTest.java`
- **Role Entity**: `RoleTest.java`
- **CreateUser Use Case**: `CreateUserTest.java`
- **AuthenticateUser Use Case**: `AuthenticateUserTest.java`
- **ChangePassword Use Case**: `ChangePasswordTest.java`
- **BCryptPasswordHasher**: `BCryptPasswordHasherTest.java`
- **UserMapper**: `UserMapperTest.java`
- **RoleMapper**: `RoleMapperTest.java`

### By Layer
- **Domain Tests**: `/src/test/java/com/effigenix/domain/usermanagement/`
  - 5 test classes
  - 98 test cases
  - Value objects and entity logic

- **Application Tests**: `/src/test/java/com/effigenix/application/usermanagement/`
  - 3 test classes
  - 45 test cases
  - Use cases with mocked dependencies

- **Infrastructure Tests**: `/src/test/java/com/effigenix/infrastructure/`
  - 3 test classes (security, mappers)
  - 58+ test cases
  - Implementations and adapters

### By Topic
- **Value Objects**: UserIdTest, RoleIdTest, PasswordHashTest
- **Entity Logic**: UserTest, RoleTest
- **Use Cases**: CreateUserTest, AuthenticateUserTest, ChangePasswordTest
- **Cryptography**: BCryptPasswordHasherTest
- **Mapping**: UserMapperTest, RoleMapperTest

---

## Running Specific Tests

### Run a single test class:
```bash
mvn test -Dtest=UserIdTest
mvn test -Dtest=UserTest
mvn test -Dtest=CreateUserTest
mvn test -Dtest=BCryptPasswordHasherTest
mvn test -Dtest=UserMapperTest
```

### Run all tests in a package:
```bash
mvn test -Dtest=com.effigenix.domain.usermanagement.*
mvn test -Dtest=com.effigenix.application.usermanagement.*
mvn test -Dtest=com.effigenix.infrastructure.security.*
mvn test -Dtest=com.effigenix.infrastructure.persistence.usermanagement.mapper.*
```

### Run a single test method:
```bash
mvn test -Dtest=UserTest#should_CreateUser_When_ValidDataProvided
mvn test -Dtest=BCryptPasswordHasherTest#should_HashPassword_When_ValidPasswordProvided
```

---

## Test Dependencies

### JUnit 5 Annotations Used
- `@Test` - Marks a test method
- `@DisplayName("description")` - Human-readable test name
- `@BeforeEach` - Setup before each test
- `@ParameterizedTest` - Parameterized tests
- `@ValueSource` - Parameter source for parameterized tests
- `@ExtendWith(MockitoExtension.class)` - Mockito support

### Mockito Annotations Used
- `@Mock` - Creates a mock object
- `@InjectMocks` - Injects mocks into system under test
- `when(...).thenReturn(...)` - Stubbing
- `when(...).thenAnswer(...)` - Complex stubbing
- `verify(...)` - Verification of method calls
- `ArgumentMatchers` - Flexible matching

### AssertJ Methods Used
- `assertThat(value).isEqualTo(expected)`
- `assertThat(value).isNotNull()`
- `assertThat(value).isInstanceOf(Type.class)`
- `assertThat(set).contains(item)`
- `assertThat(value).matches(regex)`
- `assertThatThrownBy(() -> code()).isInstanceOf(Exception.class)`
- `assertThat(list).hasSize(n)`

---

## Test Maintenance

### Adding new tests to existing class:
1. Follow existing test naming pattern: `should_X_When_Y()`
2. Add `@Test` and `@DisplayName("description")`
3. Use Arrange-Act-Assert pattern
4. Group related tests together
5. Update this index if adding new test class

### Updating tests after code changes:
1. Run affected test class: `mvn test -Dtest=ClassName`
2. Fix assertion expectations if behavior changed
3. Add new test case if new behavior added
4. Verify coverage still meets 80% target

---

## Coverage Report

Generate coverage report:
```bash
mvn clean test jacoco:report
# Report at: target/site/jacoco/index.html
```

View in browser:
```bash
open target/site/jacoco/index.html
```

Expected coverage:
- Domain Layer: 90-95%
- Application Layer: 85-90%
- Infrastructure Layer: 88-95%
- Overall: 80%+

---

## Notes

All test files are located in `/home/sebi/git/effigenix/src/test/java/` directory structure mirroring the main source code at `/home/sebi/git/effigenix/src/main/java/`.

Test files follow the naming convention: `{ClassName}Test.java`

Each test class is independent and can run in any order.
