using EntKube.Clusters.Infrastructure.Cleura; using FluentAssertions; using System.Text.Json; namespace EntKube.Clusters.Tests.Features; public class CleuraObjectStorageTests { [Fact] public void ParseKeystoneTokenResponse_ExtractsUserId() { // After authenticating with Keystone, the response includes the user ID // which is needed to create EC2 credentials. string json = """ { "token": { "user": { "id": "abc123", "name": "testuser", "domain": { "id": "domainid", "name": "CCP_Domain_1_268" } }, "catalog": [], "expires_at": "2026-05-08T12:00:00Z" } } """; KeystoneTokenResponse? response = JsonSerializer.Deserialize(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); response.Should().NotBeNull(); response!.Token.User.Id.Should().Be("abc123"); response.Token.User.Name.Should().Be("testuser"); } [Fact] public void ParseEc2CredentialResponse_ExtractsAccessAndSecret() { // Creating EC2 credentials returns the access/secret key pair // that serves as S3-compatible credentials. string json = """ { "credential": { "access": "AKIAIOSFODNN7EXAMPLE", "secret": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "user_id": "abc123", "project_id": "project456", "tenant_id": "project456" } } """; Ec2CredentialResponse? response = JsonSerializer.Deserialize(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); response.Should().NotBeNull(); response!.Credential.Access.Should().Be("AKIAIOSFODNN7EXAMPLE"); response.Credential.Secret.Should().Be("wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"); response.Credential.ProjectId.Should().Be("project456"); } [Fact] public void S3EndpointUrl_ForRegion_FormatsCorrectly() { // Cleura S3 endpoints follow the pattern https://s3-{region}.citycloud.com string endpoint = CleuraS3Client.GetS3Endpoint("Sto2"); endpoint.Should().Be("https://s3-sto2.citycloud.com"); } [Fact] public void S3EndpointUrl_ForFra1_FormatsCorrectly() { string endpoint = CleuraS3Client.GetS3Endpoint("Fra1"); endpoint.Should().Be("https://s3-fra1.citycloud.com"); } [Fact] public void ParseEc2CredentialListResponse_ReturnsMultiple() { // Listing credentials returns all existing EC2 credential pairs for the user/project. string json = """ { "credentials": [ { "access": "KEY1", "secret": "SECRET1", "user_id": "u1", "project_id": "p1", "tenant_id": "p1" }, { "access": "KEY2", "secret": "SECRET2", "user_id": "u1", "project_id": "p2", "tenant_id": "p2" } ] } """; Ec2CredentialListResponse? response = JsonSerializer.Deserialize(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); response.Should().NotBeNull(); response!.Credentials.Should().HaveCount(2); response.Credentials[0].Access.Should().Be("KEY1"); response.Credentials[1].ProjectId.Should().Be("p2"); } }