Install
$ agentstack add skill-nearform-unwind-uw-analyze-integration-tests ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
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("test@example.com", "hash");
userRepository.save(user);
Optional found = userRepository.findByEmail("test@example.com");
assertThat(found).isPresent();
assertThat(found.get().getEmail()).isEqualTo("test@example.com");
}
@Test
void findByStatus_multipleUsers_returnsFiltered() {
userRepository.save(new User("active@example.com", "hash", UserStatus.ACTIVE));
userRepository.save(new User("suspended@example.com", "hash", UserStatus.SUSPENDED));
List active = userRepository.findByStatus(UserStatus.ACTIVE);
assertThat(active).hasSize(1);
assertThat(active.get(0).getEmail()).isEqualTo("active@example.com");
}
}
[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("new@example.com", "password123", "New User");
ResponseEntity response = restTemplate.postForEntity(
"/api/v1/users", request, UserResponse.class);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED);
assertThat(response.getBody().email()).isEqualTo("new@example.com");
}
}
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 kafkaTemplate;
@Test
void publishOrderCreated_sendsToKafka() {
Order order = createTestOrder();
publisher.publishOrderCreated(order);
// Verify message received
ConsumerRecord 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`.
## Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [nearform](https://github.com/nearform)
- **Source:** [nearform/unwind](https://github.com/nearform/unwind)
- **License:** MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.