Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions docs/modules/cyrus.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Cyrus

!!! note
This module is INCUBATING. While it is ready for use and operational in the current version of Testcontainers, it is possible that it may receive breaking changes in the future. See [our contributing guidelines](/contributing/#incubating-modules) for more information on our incubating modules policy.

Testcontainers module for [Cyrus Docker Test Server](https://github.com/cyrusimap/cyrus-docker-test-server).

## CyrusContainer usage example

You can start a Cyrus container instance from any Java application by using:

<!--codeinclude-->
[Create a CyrusContainer](../../modules/cyrus/src/test/java/org/testcontainers/cyrus/CyrusContainerTest.java) inside_block:container
<!--/codeinclude-->

The container exposes helpers for:

* protocol endpoints (`IMAP`, `POP3`, `HTTP/JMAP`, `LMTP`, `SIEVE`)
* strict management operations (`exportUser`, `importUser`, `deleteUser`)
* idempotent runtime helpers (`userExists`, `deleteUserIfExists`, `exportUserIfExists`, `createUserIfMissing`)
* startup user seeding (`withSeedEmptyUser`, `withSeedUser`, `withSeedUsers`) with deterministic replace behavior
* official image environment variables (`REFRESH`, `CYRUS_VERSION`, `DEFAULTDOMAIN`, `SERVERNAME`, `RELAYHOST`, `RELAYAUTH`)

## User Builder

Create a default empty user payload with `CyrusUser.builder(...)`:

<!--codeinclude-->
[Build a default Cyrus user](../../modules/cyrus/src/test/java/org/testcontainers/cyrus/CyrusUserTest.java) inside_block:userBuilder
<!--/codeinclude-->

## Startup Seeding

Seed users during container startup:

<!--codeinclude-->
[Seed users at startup](../../modules/cyrus/src/test/java/org/testcontainers/cyrus/CyrusContainerTest.java) inside_block:startupSeeding
<!--/codeinclude-->

When the same user is seeded multiple times, the last declaration wins.

## Runtime User Management

Use strict methods when missing users should fail fast, and idempotent methods when they should not:

* strict: `exportUser`, `importUser`, `deleteUser`
* idempotent: `userExists`, `deleteUserIfExists`, `exportUserIfExists`, `createUserIfMissing`

## Adding this module to your project dependencies

Add the following dependency to your `pom.xml`/`build.gradle` file:

=== "Gradle"
```groovy
testImplementation "org.testcontainers:testcontainers-cyrus:{{latest_version}}"
```

=== "Maven"
```xml
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-cyrus</artifactId>
<version>{{latest_version}}</version>
<scope>test</scope>
</dependency>
```
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ nav:
- modules/azure.md
- modules/chromadb.md
- modules/consul.md
- modules/cyrus.md
- modules/docker_compose.md
- modules/docker_mcp_gateway.md
- modules/docker_model_runner.md
Expand Down
6 changes: 6 additions & 0 deletions modules/cyrus/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
description = "Testcontainers :: Cyrus"

dependencies {
api project(':testcontainers')
testImplementation 'com.sun.mail:jakarta.mail:2.0.1'
}
287 changes: 287 additions & 0 deletions modules/cyrus/hs_err_pid28384.log

Large diffs are not rendered by default.

Loading