Skip to content

Commit 6204838

Browse files
committed
Add Google Pub/Sub emulator integration test
Signed-off-by: Tomasz Maruszak <maruszaktomasz@gmail.com>
1 parent 9334d6e commit 6204838

6 files changed

Lines changed: 129 additions & 0 deletions

File tree

‎.github/workflows/build.yml‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@ jobs:
178178
test_path: "Tests/SlimMessageBus.Host.PostgreSql.Test"
179179
docker_services: ""
180180

181+
- transport: GooglePubSub
182+
name: Google Pub/Sub
183+
filter: "Category=Integration&Transport=GooglePubSub"
184+
test_path: "Tests/SlimMessageBus.Host.GooglePubSub.Test"
185+
docker_services: ""
186+
181187
# Outbox – four parallel sub-legs:
182188
# 1a. Sql.DbContext OutboxTests – AzureSB + Kafka; SQL Server via local docker
183189
- transport: Outbox.SqlDbContext.Tests
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
namespace SlimMessageBus.Host.GooglePubSub.Test;
2+
3+
public sealed class GooglePubSubFixture : IAsyncLifetime
4+
{
5+
private readonly PubSubContainer _container = new PubSubBuilder(
6+
"gcr.io/google.com/cloudsdktool/google-cloud-cli:446.0.1-emulators").Build();
7+
8+
public string EmulatorEndpoint => _container.GetEmulatorEndpoint();
9+
10+
public Task InitializeAsync() => _container.StartAsync();
11+
12+
public async Task DisposeAsync()
13+
{
14+
await _container.DisposeAsync();
15+
}
16+
}
17+
18+
[CollectionDefinition(nameof(GooglePubSubCollection))]
19+
public sealed class GooglePubSubCollection : ICollectionFixture<GooglePubSubFixture>;
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
namespace SlimMessageBus.Host.GooglePubSub.Test;
2+
3+
[Trait("Category", "Integration")]
4+
[Trait("Transport", "GooglePubSub")]
5+
[Collection(nameof(GooglePubSubCollection))]
6+
public class GooglePubSubMessageBusIt(ITestOutputHelper output, GooglePubSubFixture fixture)
7+
: BaseIntegrationTest<GooglePubSubMessageBusIt>(output)
8+
{
9+
private readonly string _topic = $"orders-{Guid.NewGuid():N}";
10+
private readonly string _subscription = $"orders-worker-{Guid.NewGuid():N}";
11+
12+
protected override void SetupServices(ServiceCollection services, IConfigurationRoot configuration)
13+
{
14+
services.AddSlimMessageBus(mbb =>
15+
{
16+
mbb.WithProviderGooglePubSub(settings =>
17+
{
18+
settings.ProjectId = "slim-message-bus-tests";
19+
ConfigureEmulatorClients(settings, fixture.EmulatorEndpoint);
20+
});
21+
mbb.Produce<OrderSubmitted>(x => x.DefaultTopic(_topic));
22+
mbb.Consume<OrderSubmitted>(x => x.Topic(_topic).SubscriptionName(_subscription));
23+
mbb.AddServicesFromAssemblyContaining<OrderSubmittedConsumer>();
24+
mbb.AddJsonSerializer();
25+
});
26+
27+
services.AddSingleton<TestEventCollector<OrderSubmitted>>();
28+
}
29+
30+
[Fact]
31+
public async Task ProvisionsTopologyAndDeliversPublishedMessage()
32+
{
33+
var messageBus = ServiceProvider.GetRequiredService<IMessageBus>();
34+
var consumedMessages = ServiceProvider.GetRequiredService<TestEventCollector<OrderSubmitted>>();
35+
var message = new OrderSubmitted(Guid.NewGuid(), 42);
36+
37+
await EnsureConsumersStarted();
38+
await messageBus.Publish(message, headers: new Dictionary<string, object> { ["source"] = "integration-test" });
39+
await consumedMessages.WaitUntilArriving(newMessagesTimeout: 30, expectedCount: 1);
40+
41+
consumedMessages.Snapshot().Should().ContainSingle().Which.Should().Be(message);
42+
}
43+
44+
private static void ConfigureEmulatorClients(GooglePubSubMessageBusSettings settings, string endpoint)
45+
{
46+
settings.PublisherClientFactory = (_, topic, cancellationToken) => new PublisherClientBuilder
47+
{
48+
TopicName = topic,
49+
Endpoint = endpoint,
50+
ChannelCredentials = ChannelCredentials.Insecure
51+
}.BuildAsync(cancellationToken);
52+
settings.SubscriberClientFactory = (_, subscription, cancellationToken) => new SubscriberClientBuilder
53+
{
54+
SubscriptionName = subscription,
55+
Endpoint = endpoint,
56+
ChannelCredentials = ChannelCredentials.Insecure
57+
}.BuildAsync(cancellationToken);
58+
settings.PublisherServiceApiClientFactory = (_, cancellationToken) => new PublisherServiceApiClientBuilder
59+
{
60+
Endpoint = endpoint,
61+
ChannelCredentials = ChannelCredentials.Insecure
62+
}.BuildAsync(cancellationToken);
63+
settings.SubscriberServiceApiClientFactory = (_, cancellationToken) => new SubscriberServiceApiClientBuilder
64+
{
65+
Endpoint = endpoint,
66+
ChannelCredentials = ChannelCredentials.Insecure
67+
}.BuildAsync(cancellationToken);
68+
}
69+
70+
public record OrderSubmitted(Guid OrderId, int Quantity);
71+
72+
public class OrderSubmittedConsumer(TestEventCollector<OrderSubmitted> messages) : IConsumer<OrderSubmitted>
73+
{
74+
public Task OnHandle(OrderSubmitted message, CancellationToken cancellationToken)
75+
{
76+
messages.Add(message);
77+
return Task.CompletedTask;
78+
}
79+
}
80+
}

‎src/Tests/SlimMessageBus.Host.GooglePubSub.Test/SlimMessageBus.Host.GooglePubSub.Test.csproj‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,20 @@
33
<Import Project="../Host.Test.Properties.xml" />
44

55
<ItemGroup>
6+
<ProjectReference Include="..\SlimMessageBus.Host.Test.Common\SlimMessageBus.Host.Test.Common.csproj" />
67
<ProjectReference Include="..\..\SlimMessageBus.Host.GooglePubSub\SlimMessageBus.Host.GooglePubSub.csproj" />
78
<ProjectReference Include="..\..\SlimMessageBus.Host\SlimMessageBus.Host.csproj" />
9+
<ProjectReference Include="..\..\SlimMessageBus.Host.Serialization.SystemTextJson\SlimMessageBus.Host.Serialization.SystemTextJson.csproj" />
10+
</ItemGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="Testcontainers.PubSub" Version="4.14.0" />
14+
</ItemGroup>
15+
16+
<ItemGroup>
17+
<None Update="appsettings.json">
18+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
19+
</None>
820
</ItemGroup>
921

1022
</Project>

‎src/Tests/SlimMessageBus.Host.GooglePubSub.Test/Usings.cs‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,23 @@
22

33
global using Google.Cloud.PubSub.V1;
44

5+
global using Grpc.Core;
6+
7+
global using Microsoft.Extensions.Configuration;
8+
global using Microsoft.Extensions.DependencyInjection;
59
global using Microsoft.Extensions.Logging.Abstractions;
610

711
global using Moq;
812

13+
global using SlimMessageBus;
14+
global using SlimMessageBus.Host;
915
global using SlimMessageBus.Host.Collections;
1016
global using SlimMessageBus.Host.Interceptor;
1117
global using SlimMessageBus.Host.Serialization;
18+
global using SlimMessageBus.Host.Serialization.SystemTextJson;
19+
global using SlimMessageBus.Host.Test.Common.IntegrationTest;
20+
21+
global using Testcontainers.PubSub;
1222

1323
global using Xunit;
24+
global using Xunit.Abstractions;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{}

0 commit comments

Comments
 (0)