Skip to content
Merged
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
10 changes: 10 additions & 0 deletions src/All.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@
<Project Path="CookieCrumble/src/CookieCrumble.Fusion/CookieCrumble.Fusion.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.HotChocolate.Language/CookieCrumble.HotChocolate.Language.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.HotChocolate/CookieCrumble.HotChocolate.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Resources/CookieCrumble.Resources.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Resources.AzureStorage/CookieCrumble.Resources.AzureStorage.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Resources.Kafka/CookieCrumble.Resources.Kafka.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Resources.Mongo/CookieCrumble.Resources.Mongo.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Resources.Nats/CookieCrumble.Resources.Nats.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Resources.PostgreSql/CookieCrumble.Resources.PostgreSql.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Resources.RabbitMQ/CookieCrumble.Resources.RabbitMQ.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Resources.RavenDB/CookieCrumble.Resources.RavenDB.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Resources.Redis/CookieCrumble.Resources.Redis.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Resources.SqlServer/CookieCrumble.Resources.SqlServer.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Xunit/CookieCrumble.Xunit.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble.Xunit3/CookieCrumble.Xunit3.csproj" />
<Project Path="CookieCrumble/src/CookieCrumble/CookieCrumble.csproj" />
Expand Down
10 changes: 10 additions & 0 deletions src/CookieCrumble/CookieCrumble.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@
<Project Path="src/CookieCrumble.Fusion/CookieCrumble.Fusion.csproj" />
<Project Path="src/CookieCrumble.HotChocolate.Language/CookieCrumble.HotChocolate.Language.csproj" />
<Project Path="src/CookieCrumble.HotChocolate/CookieCrumble.HotChocolate.csproj" />
<Project Path="src/CookieCrumble.Resources/CookieCrumble.Resources.csproj" />
<Project Path="src/CookieCrumble.Resources.AzureStorage/CookieCrumble.Resources.AzureStorage.csproj" />
<Project Path="src/CookieCrumble.Resources.Kafka/CookieCrumble.Resources.Kafka.csproj" />
<Project Path="src/CookieCrumble.Resources.Mongo/CookieCrumble.Resources.Mongo.csproj" />
<Project Path="src/CookieCrumble.Resources.Nats/CookieCrumble.Resources.Nats.csproj" />
<Project Path="src/CookieCrumble.Resources.PostgreSql/CookieCrumble.Resources.PostgreSql.csproj" />
<Project Path="src/CookieCrumble.Resources.RabbitMQ/CookieCrumble.Resources.RabbitMQ.csproj" />
<Project Path="src/CookieCrumble.Resources.RavenDB/CookieCrumble.Resources.RavenDB.csproj" />
<Project Path="src/CookieCrumble.Resources.Redis/CookieCrumble.Resources.Redis.csproj" />
<Project Path="src/CookieCrumble.Resources.SqlServer/CookieCrumble.Resources.SqlServer.csproj" />
<Project Path="src/CookieCrumble.Xunit/CookieCrumble.Xunit.csproj" />
<Project Path="src/CookieCrumble.Xunit3/CookieCrumble.Xunit3.csproj" />
<Project Path="src/CookieCrumble/CookieCrumble.csproj" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Azure.Storage.Blobs;
using Testcontainers.Azurite;

namespace CookieCrumble.Resources;

public class AzureStorageBlobResource : ContainerResource<AzuriteContainer>
{
public string ConnectionString => Container.GetConnectionString();

public BlobServiceClient CreateBlobServiceClient() => new(ConnectionString);

protected override AzuriteContainer Build()
=> Configure(new AzuriteBuilder("mcr.microsoft.com/azure-storage/azurite:3.33.0")).Build();

protected virtual AzuriteBuilder Configure(AzuriteBuilder builder) => builder;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<AssemblyName>CookieCrumble.Resources.AzureStorage</AssemblyName>
<RootNamespace>CookieCrumble.Resources</RootNamespace>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Azure.Storage.Blobs" />
<PackageReference Include="Testcontainers.Azurite" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="../CookieCrumble.Resources/CookieCrumble.Resources.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<AssemblyName>CookieCrumble.Resources.Kafka</AssemblyName>
<RootNamespace>CookieCrumble.Resources</RootNamespace>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Testcontainers.Kafka" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="../CookieCrumble.Resources/CookieCrumble.Resources.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Testcontainers.Kafka;

namespace CookieCrumble.Resources;

public class KafkaResource : ContainerResource<KafkaContainer>
{
public string BootstrapServers => Container.GetBootstrapAddress();

protected override KafkaContainer Build()
=> Configure(new KafkaBuilder("confluentinc/cp-kafka:7.7.0")).Build();

protected virtual KafkaBuilder Configure(KafkaBuilder builder) => builder;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<AssemblyName>CookieCrumble.Resources.Mongo</AssemblyName>
<RootNamespace>CookieCrumble.Resources</RootNamespace>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="MongoDB.Driver" />
<PackageReference Include="Testcontainers.MongoDb" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="../CookieCrumble.Resources/CookieCrumble.Resources.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using MongoDB.Driver;
using Testcontainers.MongoDb;

namespace CookieCrumble.Resources;

public class MongoResource : ContainerResource<MongoDbContainer>
{
private MongoClient? _client;

public IMongoClient Client => _client ??= new MongoClient(ConnectionString);

public string ConnectionString => Container.GetConnectionString();

// Every call without an explicit database creates a new, uniquely named
// database, so callers sharing one container stay isolated.
public IMongoDatabase CreateDatabase(string? name = null)
=> Client.GetDatabase(name ?? $"db_{Guid.NewGuid():N}");

public IMongoCollection<T> CreateCollection<T>(string? name = null)
{
var database = CreateDatabase();
name ??= $"col_{Guid.NewGuid():N}";
database.CreateCollection(name);

return database.GetCollection<T>(name);
}

protected override MongoDbContainer Build()
=> Configure(new MongoDbBuilder("mongo:6.0")).Build();

protected virtual MongoDbBuilder Configure(MongoDbBuilder builder) => builder;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<AssemblyName>CookieCrumble.Resources.Nats</AssemblyName>
<RootNamespace>CookieCrumble.Resources</RootNamespace>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Testcontainers.Nats" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="../CookieCrumble.Resources/CookieCrumble.Resources.csproj" />
</ItemGroup>

</Project>
13 changes: 13 additions & 0 deletions src/CookieCrumble/src/CookieCrumble.Resources.Nats/NatsResource.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Testcontainers.Nats;

namespace CookieCrumble.Resources;

public class NatsResource : ContainerResource<NatsContainer>
{
public string NatsConnectionString => Container.GetConnectionString();

protected override NatsContainer Build()
=> Configure(new NatsBuilder("nats:2.10-alpine")).Build();

protected virtual NatsBuilder Configure(NatsBuilder builder) => builder;
}
Comment thread
glen-84 marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<AssemblyName>CookieCrumble.Resources.PostgreSql</AssemblyName>
<RootNamespace>CookieCrumble.Resources</RootNamespace>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Npgsql" />
<PackageReference Include="Testcontainers.PostgreSql" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="../CookieCrumble.Resources/CookieCrumble.Resources.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using Npgsql;
using Testcontainers.PostgreSql;

namespace CookieCrumble.Resources;

public class PostgreSqlResource : ContainerResource<PostgreSqlContainer>
{
public string ConnectionString => Container.GetConnectionString();

public async Task CreateDatabaseAsync(string name)
{
await using var connection = GetConnection();
await connection.OpenAsync();
await using var command = connection.CreateCommand();
var quotedName = new NpgsqlCommandBuilder().QuoteIdentifier(name);
command.CommandText = $"CREATE DATABASE {quotedName};";
await command.ExecuteNonQueryAsync();
}

public NpgsqlConnection GetConnection(string? database = null)
=> new(database is null ? ConnectionString : GetConnectionString(database));

public string GetConnectionString(string database)
=> new NpgsqlConnectionStringBuilder(ConnectionString) { Database = database }
.ConnectionString;

public async Task RunSqlScriptAsync(string sql, string database)
{
await using var connection = GetConnection(database);
await connection.OpenAsync();
await using var command = connection.CreateCommand();
command.CommandText = sql;
await command.ExecuteNonQueryAsync();
}

protected override PostgreSqlContainer Build()
=> Configure(new PostgreSqlBuilder("postgres:15.1")).Build();

protected virtual PostgreSqlBuilder Configure(PostgreSqlBuilder builder) => builder;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<AssemblyName>CookieCrumble.Resources.RabbitMQ</AssemblyName>
<RootNamespace>CookieCrumble.Resources</RootNamespace>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Testcontainers.RabbitMq" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="../CookieCrumble.Resources/CookieCrumble.Resources.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using Testcontainers.RabbitMq;

namespace CookieCrumble.Resources;

public class RabbitMQResource : ContainerResource<RabbitMqContainer>
{
public string ConnectionString => Container.GetConnectionString();

public string Hostname => Container.Hostname;

public ushort Port => Container.GetMappedPublicPort(RabbitMqBuilder.RabbitMqPort);
Comment thread
glen-84 marked this conversation as resolved.

public async Task<string> InvokeCommandAsync(IEnumerable<string> command)
{
var arguments = command.ToArray();
var result = await Container.ExecAsync(arguments);

if (result.ExitCode != 0)
{
throw new InvalidOperationException(
$"'{string.Join(' ', arguments)}' failed with exit code {result.ExitCode}: "
+ result.Stderr);
}

return result.Stdout;
}
Comment thread
glen-84 marked this conversation as resolved.

protected override RabbitMqContainer Build()
=> Configure(
new RabbitMqBuilder("rabbitmq:3.11")
.WithUsername("guest")
.WithPassword("guest"))
.Build();

protected virtual RabbitMqBuilder Configure(RabbitMqBuilder builder) => builder;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<AssemblyName>CookieCrumble.Resources.RavenDB</AssemblyName>
<RootNamespace>CookieCrumble.Resources</RootNamespace>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="RavenDB.Client" />
<PackageReference Include="Testcontainers.RavenDb" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="../CookieCrumble.Resources/CookieCrumble.Resources.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System.Runtime.InteropServices;
using Raven.Client.Documents;
using Raven.Client.ServerWide;
using Raven.Client.ServerWide.Operations;
using Testcontainers.RavenDb;

namespace CookieCrumble.Resources;

public class RavenDBResource : ContainerResource<RavenDbContainer>
{
public string ConnectionString => Container.GetConnectionString();

public IDocumentStore CreateDatabase(string name)
{
using (var store = GetDocumentStore())
{
store.Maintenance.Server.Send(new CreateDatabaseOperation(new DatabaseRecord(name)));
}

return GetDocumentStore(name);
}

public IDocumentStore GetDocumentStore(string? databaseName = null)
{
var store = new DocumentStore { Urls = [ConnectionString], Database = databaseName };
store.Initialize();

return store;
}

protected override RavenDbContainer Build()
=> Configure(
new RavenDbBuilder(
RuntimeInformation.ProcessArchitecture is Architecture.Arm64
? "ravendb/ravendb:6.2-ubuntu-arm64v8-latest"
: "ravendb/ravendb:6.2-ubuntu-latest"))
.Build();

protected virtual RavenDbBuilder Configure(RavenDbBuilder builder) => builder;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<AssemblyName>CookieCrumble.Resources.Redis</AssemblyName>
<RootNamespace>CookieCrumble.Resources</RootNamespace>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="StackExchange.Redis" />
<PackageReference Include="Testcontainers.Redis" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="../CookieCrumble.Resources/CookieCrumble.Resources.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using StackExchange.Redis;
using Testcontainers.Redis;

namespace CookieCrumble.Resources;

public class RedisResource : ContainerResource<RedisContainer>
{
public string ConnectionString => Container.GetConnectionString();

public ConnectionMultiplexer GetConnection() => ConnectionMultiplexer.Connect(ConnectionString);

protected override RedisContainer Build() => Configure(new RedisBuilder("redis:7.0")).Build();

protected virtual RedisBuilder Configure(RedisBuilder builder) => builder;
}
Comment thread
glen-84 marked this conversation as resolved.
Loading
Loading