112 lines
3.5 KiB
C#
112 lines
3.5 KiB
C#
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");
|
|
}
|
|
}
|