From a6703de9f3f8c4335d5d731418087384ce310dab Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Fri, 31 Jan 2025 22:32:57 +0100 Subject: [PATCH 1/6] Add Testcontainers.Weaviate --- Testcontainers.sln | 14 +++++ Testcontainers.sln.DotSettings | 3 +- .../Testcontainers.Weaviate.csproj | 12 +++++ .../WeaviateBuilder.cs | 51 ++++++++++++++++++ .../WeaviateConfiguration.cs | 53 +++++++++++++++++++ .../WeaviateContainer.cs | 7 +++ .../Testcontainers.Weaviate.Tests.csproj | 19 +++++++ .../WeaviateContainerTest.cs | 28 ++++++++++ 8 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj create mode 100644 src/Testcontainers.Weaviate/WeaviateBuilder.cs create mode 100644 src/Testcontainers.Weaviate/WeaviateConfiguration.cs create mode 100644 src/Testcontainers.Weaviate/WeaviateContainer.cs create mode 100644 tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj create mode 100644 tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs diff --git a/Testcontainers.sln b/Testcontainers.sln index 58609127f..d80132be5 100644 --- a/Testcontainers.sln +++ b/Testcontainers.sln @@ -205,6 +205,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.WebDriver.Te EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Xunit.Tests", "tests\Testcontainers.Xunit.Tests\Testcontainers.Xunit.Tests.csproj", "{E901DF14-6F05-4FC2-825A-3055FAD33561}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Weaviate", "src\Testcontainers.Weaviate\Testcontainers.Weaviate.csproj", "{68F8600D-24E9-4E03-9E25-5F6EB338EAC1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Weaviate.Tests", "tests\Testcontainers.Weaviate.Tests\Testcontainers.Weaviate.Tests.csproj", "{DDB41BC8-5826-4D97-9C5F-001151E3FFD6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -598,6 +602,14 @@ Global {E901DF14-6F05-4FC2-825A-3055FAD33561}.Debug|Any CPU.Build.0 = Debug|Any CPU {E901DF14-6F05-4FC2-825A-3055FAD33561}.Release|Any CPU.ActiveCfg = Release|Any CPU {E901DF14-6F05-4FC2-825A-3055FAD33561}.Release|Any CPU.Build.0 = Release|Any CPU + {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Release|Any CPU.Build.0 = Release|Any CPU + {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {5365F780-0E6C-41F0-B1B9-7DC34368F80C} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} @@ -696,5 +708,7 @@ Global {27CDB869-A150-4593-958F-6F26E5391E7C} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {E901DF14-6F05-4FC2-825A-3055FAD33561} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} + {68F8600D-24E9-4E03-9E25-5F6EB338EAC1} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} + {DDB41BC8-5826-4D97-9C5F-001151E3FFD6} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} EndGlobalSection EndGlobal diff --git a/Testcontainers.sln.DotSettings b/Testcontainers.sln.DotSettings index c9af9ff53..537f48f61 100644 --- a/Testcontainers.sln.DotSettings +++ b/Testcontainers.sln.DotSettings @@ -1,4 +1,4 @@ - + False OS @@ -48,4 +48,5 @@ DO_NOT_SHOW DO_NOT_SHOW DO_NOT_SHOW + True diff --git a/src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj b/src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj new file mode 100644 index 000000000..18ce31aae --- /dev/null +++ b/src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj @@ -0,0 +1,12 @@ + + + net8.0;net9.0;netstandard2.0;netstandard2.1 + latest + + + + + + + + diff --git a/src/Testcontainers.Weaviate/WeaviateBuilder.cs b/src/Testcontainers.Weaviate/WeaviateBuilder.cs new file mode 100644 index 000000000..aed368fff --- /dev/null +++ b/src/Testcontainers.Weaviate/WeaviateBuilder.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft. All rights reserved. + +using Docker.DotNet.Models; +using DotNet.Testcontainers.Builders; +using DotNet.Testcontainers.Configurations; + +namespace Testcontainers.Weaviate; + +public sealed class WeaviateBuilder : ContainerBuilder +{ + public const string WeaviateImage = "semitechnologies/weaviate:1.26.14"; + + public const ushort WeaviateHttpPort = 8080; + + public const ushort WeaviateGrpcPort = 50051; + + public WeaviateBuilder() : this(new WeaviateConfiguration()) + => DockerResourceConfiguration = Init().DockerResourceConfiguration; + + private WeaviateBuilder(WeaviateConfiguration dockerResourceConfiguration) : base(dockerResourceConfiguration) + => DockerResourceConfiguration = dockerResourceConfiguration; + + public override WeaviateContainer Build() + { + Validate(); + return new WeaviateContainer(DockerResourceConfiguration); + } + + protected override WeaviateBuilder Init() + => base.Init() + .WithImage(WeaviateImage) + .WithPortBinding(WeaviateHttpPort, true) + .WithPortBinding(WeaviateGrpcPort, true) + .WithEnvironment("AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED", "true") + .WithEnvironment("PERSISTENCE_DATA_PATH", "/var/lib/weaviate") + .WithWaitStrategy(Wait.ForUnixContainer() + .UntilPortIsAvailable(WeaviateHttpPort) + .UntilPortIsAvailable(WeaviateGrpcPort) + .UntilHttpRequestIsSucceeded(r => r.ForPath("/v1/.well-known/ready").ForPort(WeaviateHttpPort))); + + protected override WeaviateBuilder Clone(IResourceConfiguration resourceConfiguration) + => Merge(DockerResourceConfiguration, new WeaviateConfiguration(resourceConfiguration)); + + protected override WeaviateBuilder Merge(WeaviateConfiguration oldValue, WeaviateConfiguration newValue) + => new(new WeaviateConfiguration(oldValue, newValue)); + + protected override WeaviateConfiguration DockerResourceConfiguration { get; } + + protected override WeaviateBuilder Clone(IContainerConfiguration resourceConfiguration) + => Merge(DockerResourceConfiguration, new WeaviateConfiguration(resourceConfiguration)); +} diff --git a/src/Testcontainers.Weaviate/WeaviateConfiguration.cs b/src/Testcontainers.Weaviate/WeaviateConfiguration.cs new file mode 100644 index 000000000..a1d930a6e --- /dev/null +++ b/src/Testcontainers.Weaviate/WeaviateConfiguration.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft. All rights reserved. + +using Docker.DotNet.Models; +using DotNet.Testcontainers.Configurations; + +namespace Testcontainers.Weaviate; + +public sealed class WeaviateConfiguration : ContainerConfiguration +{ + /// + /// Initializes a new instance of the class. + /// + public WeaviateConfiguration() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The Docker resource configuration. + public WeaviateConfiguration(IResourceConfiguration resourceConfiguration) + : base(resourceConfiguration) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The Docker resource configuration. + public WeaviateConfiguration(IContainerConfiguration resourceConfiguration) + : base(resourceConfiguration) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The Docker resource configuration. + public WeaviateConfiguration(WeaviateConfiguration resourceConfiguration) + : this(new WeaviateConfiguration(), resourceConfiguration) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The old Docker resource configuration. + /// The new Docker resource configuration. + public WeaviateConfiguration(WeaviateConfiguration oldValue, WeaviateConfiguration newValue) + : base(oldValue, newValue) + { + } +} diff --git a/src/Testcontainers.Weaviate/WeaviateContainer.cs b/src/Testcontainers.Weaviate/WeaviateContainer.cs new file mode 100644 index 000000000..7575dd630 --- /dev/null +++ b/src/Testcontainers.Weaviate/WeaviateContainer.cs @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft. All rights reserved. + +using DotNet.Testcontainers.Containers; + +namespace Testcontainers.Weaviate; + +public class WeaviateContainer(WeaviateConfiguration configuration) : DockerContainer(configuration); diff --git a/tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj b/tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj new file mode 100644 index 000000000..74d40ee93 --- /dev/null +++ b/tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj @@ -0,0 +1,19 @@ + + + net9.0 + false + false + + + + + + + + + + + + + + diff --git a/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs b/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs new file mode 100644 index 000000000..695b32c60 --- /dev/null +++ b/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs @@ -0,0 +1,28 @@ +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using DotNet.Testcontainers.Commons; +using Xunit; + +namespace Testcontainers.Weaviate; + +public sealed class PostgreSqlContainerTest : IAsyncLifetime +{ + // # --8<-- [start:UseWeaviateContainer] + private readonly WeaviateContainer _weaviateContainer = new WeaviateBuilder().Build(); + + public Task InitializeAsync() => _weaviateContainer.StartAsync(); + public Task DisposeAsync() => _weaviateContainer.DisposeAsync().AsTask(); + + [Fact] + [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] + public async Task ListCollections() + { + var client = new HttpClient(); + var response = await client.GetAsync( + $"http://{_weaviateContainer.Hostname}:{_weaviateContainer.GetMappedPublicPort(WeaviateBuilder.WeaviateHttpPort)}/v1/schema"); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + // # --8<-- [end:UseWeaviateContainer] +} From bd5da22368625865ff39f691dc2b8536dff13174 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Sat, 1 Feb 2025 09:31:13 +0100 Subject: [PATCH 2/6] Address review comments --- .github/workflows/cicd.yml | 1 + tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index f2e1e531b..642ce1a33 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -79,6 +79,7 @@ jobs: { name: "Testcontainers.Redis", runs-on: "ubuntu-22.04" }, { name: "Testcontainers.Redpanda", runs-on: "ubuntu-22.04" }, { name: "Testcontainers.ServiceBus", runs-on: "ubuntu-22.04" }, + { name: "Testcontainers.Weaviate", runs-on: "ubuntu-22.04" }, { name: "Testcontainers.WebDriver", runs-on: "ubuntu-22.04" }, { name: "Testcontainers.Xunit", runs-on: "ubuntu-22.04" } ] diff --git a/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs b/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs index 695b32c60..41e9b9521 100644 --- a/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs +++ b/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs @@ -6,7 +6,7 @@ namespace Testcontainers.Weaviate; -public sealed class PostgreSqlContainerTest : IAsyncLifetime +public sealed class WeaviateContainerTest : IAsyncLifetime { // # --8<-- [start:UseWeaviateContainer] private readonly WeaviateContainer _weaviateContainer = new WeaviateBuilder().Build(); From 4d061ed62d0c1e3512afe35a804dae7f6b45d265 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Sat, 1 Feb 2025 15:21:49 +0100 Subject: [PATCH 3/6] Switch to global usings --- src/Testcontainers.Weaviate/Usings.cs | 6 ++++++ src/Testcontainers.Weaviate/WeaviateBuilder.cs | 4 ---- src/Testcontainers.Weaviate/WeaviateConfiguration.cs | 3 --- src/Testcontainers.Weaviate/WeaviateContainer.cs | 2 -- tests/Testcontainers.Weaviate.Tests/Usings.cs | 5 +++++ .../Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs | 6 ------ 6 files changed, 11 insertions(+), 15 deletions(-) create mode 100644 src/Testcontainers.Weaviate/Usings.cs create mode 100644 tests/Testcontainers.Weaviate.Tests/Usings.cs diff --git a/src/Testcontainers.Weaviate/Usings.cs b/src/Testcontainers.Weaviate/Usings.cs new file mode 100644 index 000000000..3dff3789f --- /dev/null +++ b/src/Testcontainers.Weaviate/Usings.cs @@ -0,0 +1,6 @@ +global using Docker.DotNet.Models; +global using DotNet.Testcontainers.Builders; +global using DotNet.Testcontainers.Configurations; +global using DotNet.Testcontainers.Containers; + + diff --git a/src/Testcontainers.Weaviate/WeaviateBuilder.cs b/src/Testcontainers.Weaviate/WeaviateBuilder.cs index aed368fff..c033a3322 100644 --- a/src/Testcontainers.Weaviate/WeaviateBuilder.cs +++ b/src/Testcontainers.Weaviate/WeaviateBuilder.cs @@ -1,9 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. -using Docker.DotNet.Models; -using DotNet.Testcontainers.Builders; -using DotNet.Testcontainers.Configurations; - namespace Testcontainers.Weaviate; public sealed class WeaviateBuilder : ContainerBuilder diff --git a/src/Testcontainers.Weaviate/WeaviateConfiguration.cs b/src/Testcontainers.Weaviate/WeaviateConfiguration.cs index a1d930a6e..4c3688da7 100644 --- a/src/Testcontainers.Weaviate/WeaviateConfiguration.cs +++ b/src/Testcontainers.Weaviate/WeaviateConfiguration.cs @@ -1,8 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. -using Docker.DotNet.Models; -using DotNet.Testcontainers.Configurations; - namespace Testcontainers.Weaviate; public sealed class WeaviateConfiguration : ContainerConfiguration diff --git a/src/Testcontainers.Weaviate/WeaviateContainer.cs b/src/Testcontainers.Weaviate/WeaviateContainer.cs index 7575dd630..b5b738a7f 100644 --- a/src/Testcontainers.Weaviate/WeaviateContainer.cs +++ b/src/Testcontainers.Weaviate/WeaviateContainer.cs @@ -1,7 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. -using DotNet.Testcontainers.Containers; - namespace Testcontainers.Weaviate; public class WeaviateContainer(WeaviateConfiguration configuration) : DockerContainer(configuration); diff --git a/tests/Testcontainers.Weaviate.Tests/Usings.cs b/tests/Testcontainers.Weaviate.Tests/Usings.cs new file mode 100644 index 000000000..04c249c1a --- /dev/null +++ b/tests/Testcontainers.Weaviate.Tests/Usings.cs @@ -0,0 +1,5 @@ +global using System.Net; +global using System.Net.Http; +global using System.Threading.Tasks; +global using DotNet.Testcontainers.Commons; +global using Xunit; diff --git a/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs b/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs index 41e9b9521..90eb256da 100644 --- a/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs +++ b/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs @@ -1,9 +1,3 @@ -using System.Net; -using System.Net.Http; -using System.Threading.Tasks; -using DotNet.Testcontainers.Commons; -using Xunit; - namespace Testcontainers.Weaviate; public sealed class WeaviateContainerTest : IAsyncLifetime From 718772a657438ca7609476a39867444ebafb2761 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Sun, 2 Feb 2025 09:37:36 +0100 Subject: [PATCH 4/6] chore: Remove UTF-8 BOM --- Testcontainers.dic | 3 +- Testcontainers.sln | 28 +++++++++---------- Testcontainers.sln.DotSettings | 14 +++++----- .../Testcontainers.Weaviate.csproj | 2 +- .../Testcontainers.Weaviate.Tests.csproj | 2 +- 5 files changed, 25 insertions(+), 24 deletions(-) diff --git a/Testcontainers.dic b/Testcontainers.dic index 041996980..df1f16915 100644 --- a/Testcontainers.dic +++ b/Testcontainers.dic @@ -34,4 +34,5 @@ testcontainer testcontainers tlsverify toml -vstest \ No newline at end of file +vstest +weaviate \ No newline at end of file diff --git a/Testcontainers.sln b/Testcontainers.sln index d80132be5..444bdb1c3 100644 --- a/Testcontainers.sln +++ b/Testcontainers.sln @@ -97,6 +97,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Redpanda", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.ServiceBus", "src\Testcontainers.ServiceBus\Testcontainers.ServiceBus.csproj", "{2E39E532-B81E-4B48-A004-FAE18EDF9E79}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Weaviate", "src\Testcontainers.Weaviate\Testcontainers.Weaviate.csproj", "{68F8600D-24E9-4E03-9E25-5F6EB338EAC1}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.WebDriver", "src\Testcontainers.WebDriver\Testcontainers.WebDriver.csproj", "{64A87DE5-29B0-4A54-9E74-560484D8C7C0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Xunit", "src\Testcontainers.Xunit\Testcontainers.Xunit.csproj", "{380BB29B-F556-404D-B13B-CA250599C565}" @@ -201,14 +203,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.ServiceBus.T EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Tests", "tests\Testcontainers.Tests\Testcontainers.Tests.csproj", "{27CDB869-A150-4593-958F-6F26E5391E7C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Weaviate.Tests", "tests\Testcontainers.Weaviate.Tests\Testcontainers.Weaviate.Tests.csproj", "{DDB41BC8-5826-4D97-9C5F-001151E3FFD6}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.WebDriver.Tests", "tests\Testcontainers.WebDriver.Tests\Testcontainers.WebDriver.Tests.csproj", "{EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Xunit.Tests", "tests\Testcontainers.Xunit.Tests\Testcontainers.Xunit.Tests.csproj", "{E901DF14-6F05-4FC2-825A-3055FAD33561}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Weaviate", "src\Testcontainers.Weaviate\Testcontainers.Weaviate.csproj", "{68F8600D-24E9-4E03-9E25-5F6EB338EAC1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testcontainers.Weaviate.Tests", "tests\Testcontainers.Weaviate.Tests\Testcontainers.Weaviate.Tests.csproj", "{DDB41BC8-5826-4D97-9C5F-001151E3FFD6}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -386,6 +386,10 @@ Global {2E39E532-B81E-4B48-A004-FAE18EDF9E79}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E39E532-B81E-4B48-A004-FAE18EDF9E79}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E39E532-B81E-4B48-A004-FAE18EDF9E79}.Release|Any CPU.Build.0 = Release|Any CPU + {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Release|Any CPU.Build.0 = Release|Any CPU {64A87DE5-29B0-4A54-9E74-560484D8C7C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {64A87DE5-29B0-4A54-9E74-560484D8C7C0}.Debug|Any CPU.Build.0 = Debug|Any CPU {64A87DE5-29B0-4A54-9E74-560484D8C7C0}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -594,6 +598,10 @@ Global {27CDB869-A150-4593-958F-6F26E5391E7C}.Debug|Any CPU.Build.0 = Debug|Any CPU {27CDB869-A150-4593-958F-6F26E5391E7C}.Release|Any CPU.ActiveCfg = Release|Any CPU {27CDB869-A150-4593-958F-6F26E5391E7C}.Release|Any CPU.Build.0 = Release|Any CPU + {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Release|Any CPU.Build.0 = Release|Any CPU {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}.Debug|Any CPU.Build.0 = Debug|Any CPU {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -602,14 +610,6 @@ Global {E901DF14-6F05-4FC2-825A-3055FAD33561}.Debug|Any CPU.Build.0 = Debug|Any CPU {E901DF14-6F05-4FC2-825A-3055FAD33561}.Release|Any CPU.ActiveCfg = Release|Any CPU {E901DF14-6F05-4FC2-825A-3055FAD33561}.Release|Any CPU.Build.0 = Release|Any CPU - {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {68F8600D-24E9-4E03-9E25-5F6EB338EAC1}.Release|Any CPU.Build.0 = Release|Any CPU - {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DDB41BC8-5826-4D97-9C5F-001151E3FFD6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {5365F780-0E6C-41F0-B1B9-7DC34368F80C} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} @@ -654,6 +654,7 @@ Global {BFDA179A-40EB-4CEB-B8E9-0DF32C65E2C5} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {45D6F69C-4D87-4130-AA90-0DB2F7460DAE} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {2E39E532-B81E-4B48-A004-FAE18EDF9E79} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} + {68F8600D-24E9-4E03-9E25-5F6EB338EAC1} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {64A87DE5-29B0-4A54-9E74-560484D8C7C0} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {380BB29B-F556-404D-B13B-CA250599C565} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} {84911C93-C2A9-46E9-AE5E-D567306589E5} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} @@ -706,9 +707,8 @@ Global {9E8E6AA5-65D1-498F-BEAB-BA34723A0050} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {232DD918-46ED-4BA8-B383-1A9146D83064} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {27CDB869-A150-4593-958F-6F26E5391E7C} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} + {DDB41BC8-5826-4D97-9C5F-001151E3FFD6} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {EBA72C3B-57D5-43FF-A5B4-3D55B3B6D4C2} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} {E901DF14-6F05-4FC2-825A-3055FAD33561} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} - {68F8600D-24E9-4E03-9E25-5F6EB338EAC1} = {673F23AE-7694-4BB9-ABD4-136D6C13634E} - {DDB41BC8-5826-4D97-9C5F-001151E3FFD6} = {7164F1FB-7F24-444A-ACD2-2C329C2B3CCF} EndGlobalSection EndGlobal diff --git a/Testcontainers.sln.DotSettings b/Testcontainers.sln.DotSettings index 537f48f61..ff93162f2 100644 --- a/Testcontainers.sln.DotSettings +++ b/Testcontainers.sln.DotSettings @@ -1,4 +1,4 @@ - + False OS @@ -6,9 +6,9 @@ BlockScoped True True - True True True + True True True True @@ -42,11 +42,11 @@ True True True - True + True True - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW + True + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW DO_NOT_SHOW - True diff --git a/src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj b/src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj index 18ce31aae..55fed7d86 100644 --- a/src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj +++ b/src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj @@ -1,4 +1,4 @@ - + net8.0;net9.0;netstandard2.0;netstandard2.1 latest diff --git a/tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj b/tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj index 74d40ee93..1fcdd2293 100644 --- a/tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj +++ b/tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj @@ -1,4 +1,4 @@ - + net9.0 false From 0c5d82b55ec66a70e9f0d253433bc2555ef139ab Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Sun, 2 Feb 2025 10:06:07 +0100 Subject: [PATCH 5/6] chore: Align with repo standards --- src/Testcontainers.Weaviate/.editorconfig | 1 + .../Testcontainers.Weaviate.csproj | 22 +++++------ src/Testcontainers.Weaviate/Usings.cs | 4 +- .../WeaviateBuilder.cs | 38 +++++++++++++------ .../WeaviateConfiguration.cs | 9 +++-- .../WeaviateContainer.cs | 16 ++++++-- .../.editorconfig | 1 + tests/Testcontainers.Weaviate.Tests/Usings.cs | 3 +- .../WeaviateContainerTest.cs | 18 +++++---- 9 files changed, 73 insertions(+), 39 deletions(-) create mode 100644 src/Testcontainers.Weaviate/.editorconfig create mode 100644 tests/Testcontainers.Weaviate.Tests/.editorconfig diff --git a/src/Testcontainers.Weaviate/.editorconfig b/src/Testcontainers.Weaviate/.editorconfig new file mode 100644 index 000000000..6f066619d --- /dev/null +++ b/src/Testcontainers.Weaviate/.editorconfig @@ -0,0 +1 @@ +root = true \ No newline at end of file diff --git a/src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj b/src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj index 55fed7d86..9a25b9c4d 100644 --- a/src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj +++ b/src/Testcontainers.Weaviate/Testcontainers.Weaviate.csproj @@ -1,12 +1,12 @@ - - net8.0;net9.0;netstandard2.0;netstandard2.1 - latest - - - - - - - - + + net8.0;net9.0;netstandard2.0;netstandard2.1 + latest + + + + + + + + \ No newline at end of file diff --git a/src/Testcontainers.Weaviate/Usings.cs b/src/Testcontainers.Weaviate/Usings.cs index 3dff3789f..79fd3af9b 100644 --- a/src/Testcontainers.Weaviate/Usings.cs +++ b/src/Testcontainers.Weaviate/Usings.cs @@ -1,6 +1,6 @@ +global using System; global using Docker.DotNet.Models; global using DotNet.Testcontainers.Builders; global using DotNet.Testcontainers.Configurations; global using DotNet.Testcontainers.Containers; - - +global using JetBrains.Annotations; \ No newline at end of file diff --git a/src/Testcontainers.Weaviate/WeaviateBuilder.cs b/src/Testcontainers.Weaviate/WeaviateBuilder.cs index c033a3322..92d56dcaa 100644 --- a/src/Testcontainers.Weaviate/WeaviateBuilder.cs +++ b/src/Testcontainers.Weaviate/WeaviateBuilder.cs @@ -1,7 +1,7 @@ -// Copyright (c) Microsoft. All rights reserved. - namespace Testcontainers.Weaviate; +/// +[PublicAPI] public sealed class WeaviateBuilder : ContainerBuilder { public const string WeaviateImage = "semitechnologies/weaviate:1.26.14"; @@ -10,18 +10,30 @@ public sealed class WeaviateBuilder : ContainerBuilder + /// Initializes a new instance of the class. + /// public WeaviateBuilder() : this(new WeaviateConfiguration()) - => DockerResourceConfiguration = Init().DockerResourceConfiguration; + => DockerResourceConfiguration = Init().DockerResourceConfiguration; + + /// + /// Initializes a new instance of the class. + /// + /// The Docker resource configuration. + private WeaviateBuilder(WeaviateConfiguration resourceConfiguration) : base(resourceConfiguration) + => DockerResourceConfiguration = resourceConfiguration; - private WeaviateBuilder(WeaviateConfiguration dockerResourceConfiguration) : base(dockerResourceConfiguration) - => DockerResourceConfiguration = dockerResourceConfiguration; + /// + protected override WeaviateConfiguration DockerResourceConfiguration { get; } + /// public override WeaviateContainer Build() { Validate(); return new WeaviateContainer(DockerResourceConfiguration); } + /// protected override WeaviateBuilder Init() => base.Init() .WithImage(WeaviateImage) @@ -32,16 +44,18 @@ protected override WeaviateBuilder Init() .WithWaitStrategy(Wait.ForUnixContainer() .UntilPortIsAvailable(WeaviateHttpPort) .UntilPortIsAvailable(WeaviateGrpcPort) - .UntilHttpRequestIsSucceeded(r => r.ForPath("/v1/.well-known/ready").ForPort(WeaviateHttpPort))); + .UntilHttpRequestIsSucceeded(request => + request.ForPath("/v1/.well-known/ready").ForPort(WeaviateHttpPort))); + /// protected override WeaviateBuilder Clone(IResourceConfiguration resourceConfiguration) => Merge(DockerResourceConfiguration, new WeaviateConfiguration(resourceConfiguration)); - protected override WeaviateBuilder Merge(WeaviateConfiguration oldValue, WeaviateConfiguration newValue) - => new(new WeaviateConfiguration(oldValue, newValue)); - - protected override WeaviateConfiguration DockerResourceConfiguration { get; } - + /// protected override WeaviateBuilder Clone(IContainerConfiguration resourceConfiguration) => Merge(DockerResourceConfiguration, new WeaviateConfiguration(resourceConfiguration)); -} + + /// + protected override WeaviateBuilder Merge(WeaviateConfiguration oldValue, WeaviateConfiguration newValue) + => new(new WeaviateConfiguration(oldValue, newValue)); +} \ No newline at end of file diff --git a/src/Testcontainers.Weaviate/WeaviateConfiguration.cs b/src/Testcontainers.Weaviate/WeaviateConfiguration.cs index 4c3688da7..87d42c016 100644 --- a/src/Testcontainers.Weaviate/WeaviateConfiguration.cs +++ b/src/Testcontainers.Weaviate/WeaviateConfiguration.cs @@ -1,7 +1,7 @@ -// Copyright (c) Microsoft. All rights reserved. - namespace Testcontainers.Weaviate; +/// +[PublicAPI] public sealed class WeaviateConfiguration : ContainerConfiguration { /// @@ -18,6 +18,7 @@ public WeaviateConfiguration() public WeaviateConfiguration(IResourceConfiguration resourceConfiguration) : base(resourceConfiguration) { + // Passes the configuration upwards to the base implementations to create an updated immutable copy. } /// @@ -27,6 +28,7 @@ public WeaviateConfiguration(IResourceConfiguration r public WeaviateConfiguration(IContainerConfiguration resourceConfiguration) : base(resourceConfiguration) { + // Passes the configuration upwards to the base implementations to create an updated immutable copy. } /// @@ -36,6 +38,7 @@ public WeaviateConfiguration(IContainerConfiguration resourceConfiguration) public WeaviateConfiguration(WeaviateConfiguration resourceConfiguration) : this(new WeaviateConfiguration(), resourceConfiguration) { + // Passes the configuration upwards to the base implementations to create an updated immutable copy. } /// @@ -47,4 +50,4 @@ public WeaviateConfiguration(WeaviateConfiguration oldValue, WeaviateConfigurati : base(oldValue, newValue) { } -} +} \ No newline at end of file diff --git a/src/Testcontainers.Weaviate/WeaviateContainer.cs b/src/Testcontainers.Weaviate/WeaviateContainer.cs index b5b738a7f..6eba03c0d 100644 --- a/src/Testcontainers.Weaviate/WeaviateContainer.cs +++ b/src/Testcontainers.Weaviate/WeaviateContainer.cs @@ -1,5 +1,15 @@ -// Copyright (c) Microsoft. All rights reserved. - namespace Testcontainers.Weaviate; -public class WeaviateContainer(WeaviateConfiguration configuration) : DockerContainer(configuration); +/// +[PublicAPI] +public sealed class WeaviateContainer(WeaviateConfiguration configuration) : DockerContainer(configuration) +{ + /// + /// Gets the Weaviate base address. + /// + /// The Weaviate base address. + public string GetBaseAddress() + { + return new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(WeaviateBuilder.WeaviateHttpPort)).ToString(); + } +} \ No newline at end of file diff --git a/tests/Testcontainers.Weaviate.Tests/.editorconfig b/tests/Testcontainers.Weaviate.Tests/.editorconfig new file mode 100644 index 000000000..6f066619d --- /dev/null +++ b/tests/Testcontainers.Weaviate.Tests/.editorconfig @@ -0,0 +1 @@ +root = true \ No newline at end of file diff --git a/tests/Testcontainers.Weaviate.Tests/Usings.cs b/tests/Testcontainers.Weaviate.Tests/Usings.cs index 04c249c1a..dc15b5753 100644 --- a/tests/Testcontainers.Weaviate.Tests/Usings.cs +++ b/tests/Testcontainers.Weaviate.Tests/Usings.cs @@ -1,5 +1,6 @@ +global using System; global using System.Net; global using System.Net.Http; global using System.Threading.Tasks; global using DotNet.Testcontainers.Commons; -global using Xunit; +global using Xunit; \ No newline at end of file diff --git a/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs b/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs index 90eb256da..0ff94e161 100644 --- a/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs +++ b/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs @@ -2,21 +2,25 @@ namespace Testcontainers.Weaviate; public sealed class WeaviateContainerTest : IAsyncLifetime { - // # --8<-- [start:UseWeaviateContainer] private readonly WeaviateContainer _weaviateContainer = new WeaviateBuilder().Build(); public Task InitializeAsync() => _weaviateContainer.StartAsync(); + public Task DisposeAsync() => _weaviateContainer.DisposeAsync().AsTask(); [Fact] [Trait(nameof(DockerCli.DockerPlatform), nameof(DockerCli.DockerPlatform.Linux))] - public async Task ListCollections() + public async Task GetSchemaReturnsHttpStatusCodeOk() { - var client = new HttpClient(); - var response = await client.GetAsync( - $"http://{_weaviateContainer.Hostname}:{_weaviateContainer.GetMappedPublicPort(WeaviateBuilder.WeaviateHttpPort)}/v1/schema"); + // Given + using var httpClient = new HttpClient(); + httpClient.BaseAddress = new Uri(_weaviateContainer.GetBaseAddress()); + + // When + using var response = await httpClient.GetAsync("v1/schema") + .ConfigureAwait(true); + // Then Assert.Equal(HttpStatusCode.OK, response.StatusCode); } - // # --8<-- [end:UseWeaviateContainer] -} +} \ No newline at end of file From eabc1fde195962bac301927c33a501cf984f1ace Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Sun, 2 Feb 2025 10:14:19 +0100 Subject: [PATCH 6/6] chore: Update csproj --- .../Testcontainers.Weaviate.Tests.csproj | 34 +++++++++---------- .../WeaviateContainerTest.cs | 4 +-- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj b/tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj index 1fcdd2293..3d19526bb 100644 --- a/tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj +++ b/tests/Testcontainers.Weaviate.Tests/Testcontainers.Weaviate.Tests.csproj @@ -1,19 +1,17 @@ - - net9.0 - false - false - - - - - - - - - - - - - - + + net9.0 + false + false + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs b/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs index 0ff94e161..76b96a50f 100644 --- a/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs +++ b/tests/Testcontainers.Weaviate.Tests/WeaviateContainerTest.cs @@ -17,10 +17,10 @@ public async Task GetSchemaReturnsHttpStatusCodeOk() httpClient.BaseAddress = new Uri(_weaviateContainer.GetBaseAddress()); // When - using var response = await httpClient.GetAsync("v1/schema") + using var httpResponse = await httpClient.GetAsync("v1/schema") .ConfigureAwait(true); // Then - Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal(HttpStatusCode.OK, httpResponse.StatusCode); } } \ No newline at end of file