1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 12:09:35 +01:00
effigenix/backend/TEST_FILES_INDEX.md
Sebastian Frick c2c48a03e8 refactor: restructure repository with separate backend and frontend directories
- Move Java backend to backend/ directory
- Create frontend/ directory for TypeScript TUI and future WebUI
- Update .gitignore for Node.js and worktrees
- Update README.md with new repository structure
- Copy documentation to backend/
2026-02-17 22:08:51 +01:00

444 lines
15 KiB
Markdown

# 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.