Uw analyze integration tests
Use when analyzing integration tests that verify component interactions, database access, and external service integrationFrom its SKILL.md
npx -y skills add nearform/unwind --skill uw-analyze-integration-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
7.4 KB, as published. Nobody here has run it
Analyzing Integration Tests
Output: docs/unwind/layers/integration-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/integration-tests/
├── index.md # Test summary, infrastructure overview
├── config.md # Test containers, database setup
├── repository-tests.md # Database integration tests
├── api-tests.md # API endpoint tests
├── external-tests.md # External service integration tests
└── messaging-tests.md # Kafka/queue tests
For large codebases, split by integration type:
docs/unwind/layers/integration-tests/
├── index.md
├── config.md
├── database/
├── api/
└── messaging/
Process (Incremental Writes)
Step 1: Setup
mkdir -p docs/unwind/layers/integration-tests/
Write initial index.md:
# Integration Tests
## Sections
- [Configuration](config.md) - _pending_
- [Repository Tests](repository-tests.md) - _pending_
- [API Tests](api-tests.md) - _pending_
- [External Service Tests](external-tests.md) - _pending_
- [Messaging Tests](messaging-tests.md) - _pending_
## Summary
_Analysis in progress..._
Step 2: Analyze and write config.md
- Find test containers, database setup, WireMock config
- Write
config.mdimmediately - Update
index.md
Step 3: Analyze and write repository-tests.md
- Find all database integration tests
- Write
repository-tests.mdimmediately - Update
index.md
Step 4: Analyze and write api-tests.md
- Find all API endpoint tests
- Write
api-tests.mdimmediately - Update
index.md
Step 5: Analyze and write external-tests.md (if applicable)
- Find external service integration tests
- Write
external-tests.mdimmediately - Update
index.md
Step 6: Analyze and write messaging-tests.md (if applicable)
- Find Kafka/queue tests
- Write
messaging-tests.mdimmediately - Update
index.md
Step 7: Finalize index.md Add integration summary table
Output Format
# Integration Tests
## Configuration
### Test Containers
[TestContainersConfig.java](https://github.com/owner/repo/blob/main/src/test/java/config/TestContainersConfig.java)
```java
@TestConfiguration
public class TestContainersConfig {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:14")
.withDatabaseName("testdb")
.withUsername("test")
.withPassword("test");
@Container
static KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.0.0"));
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.kafka.bootstrap-servers", kafka::getBootstrapServers);
}
}
WireMock Setup
@TestConfiguration
public class WireMockConfig {
@Bean
public WireMockServer wireMockServer() {
WireMockServer server = new WireMockServer(WireMockConfiguration.wireMockConfig().dynamicPort());
server.start();
return server;
}
}
Test Summary
| Integration | Tests | Status |
|---|---|---|
| Database | 15 | Passing |
| Kafka | 8 | Passing |
| Stripe API | 5 | Passing |
| Email Service | 3 | Passing |
Repository Integration Tests
UserRepositoryIT
@DataJpaTest
@Testcontainers
@AutoConfigureTestDatabase(replace = NONE)
class UserRepositoryIT {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:14");
@Autowired
private UserRepository userRepository;
@Test
void findByEmail_existingUser_returnsUser() {
User user = new User("[email protected]", "hash");
userRepository.save(user);
Optional<User> found = userRepository.findByEmail("[email protected]");
assertThat(found).isPresent();
assertThat(found.get().getEmail()).isEqualTo("[email protected]");
}
@Test
void findByStatus_multipleUsers_returnsFiltered() {
userRepository.save(new User("[email protected]", "hash", UserStatus.ACTIVE));
userRepository.save(new User("[email protected]", "hash", UserStatus.SUSPENDED));
List<User> active = userRepository.findByStatus(UserStatus.ACTIVE);
assertThat(active).hasSize(1);
assertThat(active.get(0).getEmail()).isEqualTo("[email protected]");
}
}
[Continue for ALL repository tests...]
API Integration Tests
UserControllerIT
@SpringBootTest(webEnvironment = RANDOM_PORT)
@Testcontainers
class UserControllerIT {
@Autowired
private TestRestTemplate restTemplate;
@Test
void createUser_validRequest_returnsCreated() {
CreateUserRequest request = new CreateUserRequest("[email protected]", "password123", "New User");
ResponseEntity<UserResponse> response = restTemplate.postForEntity(
"/api/v1/users", request, UserResponse.class);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED);
assertThat(response.getBody().email()).isEqualTo("[email protected]");
}
}
External Service Tests
StripeClientIT
@SpringBootTest
@AutoConfigureWireMock(port = 0)
class StripeClientIT {
@Autowired
private StripeClient stripeClient;
@Test
void charge_validToken_returnsSuccess() {
stubFor(post(urlEqualTo("/v1/charges"))
.willReturn(aResponse()
.withStatus(200)
.withBody("{\"id\": \"ch_123\", \"status\": \"succeeded\"}")));
PaymentResult result = stripeClient.charge("tok_valid", Money.of(100, USD));
assertThat(result.isSuccess()).isTrue();
}
}
Messaging Tests
OrderEventIT
@SpringBootTest
@EmbeddedKafka(partitions = 1, topics = {"order-events"})
class OrderEventIT {
@Autowired
private OrderEventPublisher publisher;
@Autowired
private KafkaTemplate<String, Object> kafkaTemplate;
@Test
void publishOrderCreated_sendsToKafka() {
Order order = createTestOrder();
publisher.publishOrderCreated(order);
// Verify message received
ConsumerRecord<String, Object> record = KafkaTestUtils.getSingleRecord(consumer, "order-events");
assertThat(record.value()).isInstanceOf(OrderCreatedEvent.class);
}
}
Unknowns
- [List anything unclear]
## Refresh Mode
If `docs/unwind/layers/integration-tests/` exists, compare current state and add `## Changes Since Last Review` section to `index.md`.