Uw analyze unit tests
Use when analyzing unit test coverage, patterns, and test code for isolated component testingFrom its SKILL.md
npx -y skills add nearform/unwind --skill uw-analyze-unit-testsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 9 stars9 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.5 KB, as published. Nobody here has run it
Analyzing Unit Tests
Output: docs/unwind/layers/unit-tests/ (folder with index.md + section files)
Principles: See analysis-principles.md - completeness, machine-readable, link to source, no commentary, incremental writes.
Output Structure
docs/unwind/layers/unit-tests/
├── index.md # Test summary, coverage overview
├── service-tests.md # Service layer tests
├── domain-tests.md # Domain/entity tests
├── utilities.md # Test utilities, factories
└── coverage-gaps.md # Classes without tests
For large codebases (50+ test files), split by domain:
docs/unwind/layers/unit-tests/
├── index.md
├── users-tests.md
├── orders-tests.md
└── ...
Process (Incremental Writes)
Step 1: Setup
mkdir -p docs/unwind/layers/unit-tests/
Write initial index.md:
# Unit Tests
## Sections
- [Service Tests](service-tests.md) - _pending_
- [Domain Tests](domain-tests.md) - _pending_
- [Test Utilities](utilities.md) - _pending_
- [Coverage Gaps](coverage-gaps.md) - _pending_
## Summary
_Analysis in progress..._
Step 2: Analyze and write service-tests.md
- Find all service layer tests
- Include actual test code showing what is tested
- Write
service-tests.mdimmediately - Update
index.md
Step 3: Analyze and write domain-tests.md
- Find all domain/entity tests
- Write
domain-tests.mdimmediately - Update
index.md
Step 4: Analyze and write utilities.md
- Find test utilities, factories, mocks
- Write
utilities.mdimmediately - Update
index.md
Step 5: Analyze and write coverage-gaps.md
- Identify classes without tests
- Write
coverage-gaps.mdimmediately - Update
index.md
Step 6: Finalize index.md Add coverage summary table
Output Format
# Unit Tests
## Configuration
[pom.xml test dependencies](https://github.com/owner/repo/blob/main/pom.xml#L50-L70)
```xml
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.0.0</version>
<scope>test</scope>
</dependency>
Test Summary
| Layer | Classes | Tested | Coverage |
|---|---|---|---|
| Service | 12 | 10 | 83% |
| Domain | 8 | 8 | 100% |
| Repository | 6 | 4 | 67% |
Service Tests
UserServiceTest
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;
@Mock
private PasswordEncoder passwordEncoder;
@InjectMocks
private UserService userService;
@Test
void createUser_success() {
CreateUserRequest request = new CreateUserRequest("[email protected]", "password", "Test");
when(userRepository.existsByEmail(request.email())).thenReturn(false);
when(passwordEncoder.encode(request.password())).thenReturn("encoded");
when(userRepository.save(any())).thenAnswer(inv -> inv.getArgument(0));
User result = userService.createUser(request);
assertThat(result.getEmail()).isEqualTo("[email protected]");
verify(userRepository).save(any());
}
@Test
void createUser_duplicateEmail_throws() {
CreateUserRequest request = new CreateUserRequest("[email protected]", "password", "Test");
when(userRepository.existsByEmail(request.email())).thenReturn(true);
assertThrows(DuplicateEmailException.class, () -> userService.createUser(request));
}
}
Tests: createUser_success, createUser_duplicateEmail_throws, getUser_success, getUser_notFound_throws
[Continue for ALL test classes...]
Domain Tests
UserTest
class UserTest {
@Test
void suspend_activeUser_setsSuspended() {
User user = new User("[email protected]", "hash");
user.setStatus(UserStatus.ACTIVE);
user.suspend();
assertThat(user.getStatus()).isEqualTo(UserStatus.SUSPENDED);
}
@Test
void suspend_deletedUser_throws() {
User user = new User("[email protected]", "hash");
user.setStatus(UserStatus.DELETED);
assertThrows(IllegalStateException.class, () -> user.suspend());
}
}
Test Utilities
TestDataFactory
public class TestDataFactory {
public static User createUser() {
return new User("[email protected]", "encodedPassword");
}
public static Order createOrder(User user) {
Order order = new Order(user);
order.addItem(createProduct(), 2);
return order;
}
}
Coverage Gaps
Classes without unit tests:
PaymentServiceNotificationServiceLegacyOrderAdapter
Unknowns
- [List anything unclear]
## Refresh Mode
If `docs/unwind/layers/unit-tests/` exists, compare current state and add `## Changes Since Last Review` section to `index.md`.