using EntKube.Clusters.Domain; using EntKube.Clusters.Features.SetProvider; using EntKube.Clusters.Infrastructure; using EntKube.SharedKernel.Domain; using FluentAssertions; namespace EntKube.Clusters.Tests.Features; public class SetProviderHandlerTests { private readonly SetProviderHandler handler; private readonly InMemoryClusterRepository repository; public SetProviderHandlerTests() { repository = new InMemoryClusterRepository(); handler = new SetProviderHandler(repository); } [Fact] public async Task HandleAsync_SetCleura_StoresProviderOnCluster() { // Arrange — A cluster is already registered with no provider. // The user now wants to link it to their Cleura account. KubernetesCluster cluster = KubernetesCluster.Register( "cleura-cluster", "https://k8s.cleura.cloud", "kubeconfig", Guid.NewGuid(), "ctx", Guid.NewGuid()); await repository.AddAsync(cluster); SetProviderRequest request = new(cluster.Id, "Cleura", "my-user", "my-password", "Sto2"); // Act Result result = await handler.HandleAsync(request); // Assert — The provider and credentials should be persisted on the cluster. result.IsSuccess.Should().BeTrue(); KubernetesCluster? updated = await repository.GetByIdAsync(cluster.Id); updated!.Provider.Should().Be(CloudProvider.Cleura); updated.ProviderCredentials!.Username.Should().Be("my-user"); updated.ProviderCredentials.Region.Should().Be("Sto2"); } [Fact] public async Task HandleAsync_SetNone_ClearsProvider() { // Arrange — A cluster currently linked to Cleura. The user wants to unlink it. KubernetesCluster cluster = KubernetesCluster.Register( "test", "https://k8s.example.com", "kubeconfig", Guid.NewGuid(), "ctx", Guid.NewGuid()); cluster.SetProvider(CloudProvider.Cleura, new ProviderCredentials("u", "p", "Fra1")); await repository.AddAsync(cluster); SetProviderRequest request = new(cluster.Id, "None", null, null, null); // Act Result result = await handler.HandleAsync(request); // Assert result.IsSuccess.Should().BeTrue(); KubernetesCluster? updated = await repository.GetByIdAsync(cluster.Id); updated!.Provider.Should().Be(CloudProvider.None); updated.ProviderCredentials.Should().BeNull(); } [Fact] public async Task HandleAsync_ClusterNotFound_ReturnsFailure() { // Arrange — Non-existent cluster ID. SetProviderRequest request = new(Guid.NewGuid(), "Cleura", "u", "p", "Sto2"); // Act Result result = await handler.HandleAsync(request); // Assert result.IsFailure.Should().BeTrue(); result.Error.Should().Contain("not found"); } [Fact] public async Task HandleAsync_InvalidProvider_ReturnsFailure() { // Arrange — An unrecognized provider name. KubernetesCluster cluster = KubernetesCluster.Register( "test", "https://k8s.example.com", "kubeconfig", Guid.NewGuid(), "ctx", Guid.NewGuid()); await repository.AddAsync(cluster); SetProviderRequest request = new(cluster.Id, "UnknownCloud", "u", "p", "eu-west-1"); // Act Result result = await handler.HandleAsync(request); // Assert result.IsFailure.Should().BeTrue(); result.Error.Should().Contain("Unsupported provider"); } }