using RackPeek.Domain.Persistence; using RackPeek.Domain.Persistence.Yaml; using RackPeek.Domain.Resources.Servers; namespace Tests.Yaml; /// /// Tests YAML serialization and deserialization of resource labels. /// public class LabelsYamlTests { private static async Task CreateSut(string yaml) { var tempDir = Path.Combine( Path.GetTempPath(), "RackPeekTests", Guid.NewGuid().ToString("N")); Directory.CreateDirectory(tempDir); var filePath = Path.Combine(tempDir, "config.yaml"); await File.WriteAllTextAsync(filePath, yaml); var yamlResourceCollection = new YamlResourceCollection(filePath, new PhysicalTextFileStore(), new ResourceCollection()); await yamlResourceCollection.LoadAsync(); return yamlResourceCollection; } [Fact] public async Task deserialize_yaml_with_labels__resource_has_labels() { // Given var yaml = @" resources: - kind: Server name: web-01 labels: env: production owner: team-a "; var sut = await CreateSut(yaml); // When var server = await sut.GetByNameAsync("web-01"); // Then Assert.NotNull(server); Assert.Equal(2, server.Labels.Count); Assert.Equal("production", server.Labels["env"]); Assert.Equal("team-a", server.Labels["owner"]); } [Fact] public async Task deserialize_yaml_without_labels__resource_has_empty_labels() { // Given - legacy YAML without labels section var yaml = @" resources: - kind: Server name: web-01 "; var sut = await CreateSut(yaml); // When var server = await sut.GetByNameAsync("web-01"); // Then Assert.NotNull(server); Assert.NotNull(server.Labels); Assert.Empty(server.Labels); } [Fact] public async Task round_trip_labels__persisted_and_loaded() { // Given - add server with labels via collection, save, reload var tempDir = Path.Combine( Path.GetTempPath(), "RackPeekTests", Guid.NewGuid().ToString("N")); Directory.CreateDirectory(tempDir); var filePath = Path.Combine(tempDir, "config.yaml"); await File.WriteAllTextAsync(filePath, ""); var collection = new ResourceCollection(); var yamlCollection = new YamlResourceCollection(filePath, new PhysicalTextFileStore(), collection); await yamlCollection.LoadAsync(); var server = new Server { Name = "web-01", Labels = new Dictionary { ["env"] = "production", ["owner"] = "team-a" } }; await yamlCollection.AddAsync(server); // When - reload from file var reloaded = new YamlResourceCollection(filePath, new PhysicalTextFileStore(), new ResourceCollection()); await reloaded.LoadAsync(); var loaded = await reloaded.GetByNameAsync("web-01"); // Then Assert.NotNull(loaded); Assert.Equal(2, loaded.Labels.Count); Assert.Equal("production", loaded.Labels["env"]); Assert.Equal("team-a", loaded.Labels["owner"]); } }