LabelsYamlTests.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using RackPeek.Domain.Persistence;
  2. using RackPeek.Domain.Persistence.Yaml;
  3. using RackPeek.Domain.Resources.Servers;
  4. namespace Tests.Yaml;
  5. /// <summary>
  6. /// Tests YAML serialization and deserialization of resource labels.
  7. /// </summary>
  8. public class LabelsYamlTests
  9. {
  10. private static async Task<IResourceCollection> CreateSut(string yaml)
  11. {
  12. var tempDir = Path.Combine(
  13. Path.GetTempPath(),
  14. "RackPeekTests",
  15. Guid.NewGuid().ToString("N"));
  16. Directory.CreateDirectory(tempDir);
  17. var filePath = Path.Combine(tempDir, "config.yaml");
  18. await File.WriteAllTextAsync(filePath, yaml);
  19. var yamlResourceCollection =
  20. new YamlResourceCollection(filePath, new PhysicalTextFileStore(), new ResourceCollection());
  21. await yamlResourceCollection.LoadAsync();
  22. return yamlResourceCollection;
  23. }
  24. [Fact]
  25. public async Task deserialize_yaml_with_labels__resource_has_labels()
  26. {
  27. // Given
  28. var yaml = @"
  29. resources:
  30. - kind: Server
  31. name: web-01
  32. labels:
  33. env: production
  34. owner: team-a
  35. ";
  36. var sut = await CreateSut(yaml);
  37. // When
  38. var server = await sut.GetByNameAsync<Server>("web-01");
  39. // Then
  40. Assert.NotNull(server);
  41. Assert.Equal(2, server.Labels.Count);
  42. Assert.Equal("production", server.Labels["env"]);
  43. Assert.Equal("team-a", server.Labels["owner"]);
  44. }
  45. [Fact]
  46. public async Task deserialize_yaml_without_labels__resource_has_empty_labels()
  47. {
  48. // Given - legacy YAML without labels section
  49. var yaml = @"
  50. resources:
  51. - kind: Server
  52. name: web-01
  53. ";
  54. var sut = await CreateSut(yaml);
  55. // When
  56. var server = await sut.GetByNameAsync<Server>("web-01");
  57. // Then
  58. Assert.NotNull(server);
  59. Assert.NotNull(server.Labels);
  60. Assert.Empty(server.Labels);
  61. }
  62. [Fact]
  63. public async Task round_trip_labels__persisted_and_loaded()
  64. {
  65. // Given - add server with labels via collection, save, reload
  66. var tempDir = Path.Combine(
  67. Path.GetTempPath(),
  68. "RackPeekTests",
  69. Guid.NewGuid().ToString("N"));
  70. Directory.CreateDirectory(tempDir);
  71. var filePath = Path.Combine(tempDir, "config.yaml");
  72. await File.WriteAllTextAsync(filePath, "");
  73. var collection = new ResourceCollection();
  74. var yamlCollection = new YamlResourceCollection(filePath, new PhysicalTextFileStore(), collection);
  75. await yamlCollection.LoadAsync();
  76. var server = new Server
  77. {
  78. Name = "web-01",
  79. Labels = new Dictionary<string, string> { ["env"] = "production", ["owner"] = "team-a" }
  80. };
  81. await yamlCollection.AddAsync(server);
  82. // When - reload from file
  83. var reloaded = new YamlResourceCollection(filePath, new PhysicalTextFileStore(), new ResourceCollection());
  84. await reloaded.LoadAsync();
  85. var loaded = await reloaded.GetByNameAsync<Server>("web-01");
  86. // Then
  87. Assert.NotNull(loaded);
  88. Assert.Equal(2, loaded.Labels.Count);
  89. Assert.Equal("production", loaded.Labels["env"]);
  90. Assert.Equal("team-a", loaded.Labels["owner"]);
  91. }
  92. }