MermaidExportTests.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using System.IO;
  2. using System.Threading.Tasks;
  3. using Tests.EndToEnd.Infra;
  4. using Xunit;
  5. using Xunit.Abstractions;
  6. namespace Tests.EndToEnd.MermaidTests;
  7. [Collection("Yaml CLI tests")]
  8. public class MermaidExportCommandTests(TempYamlCliFixture fs, ITestOutputHelper outputHelper)
  9. : IClassFixture<TempYamlCliFixture>
  10. {
  11. private async Task<(string output, string yaml)> ExecuteAsync(params string[] args)
  12. {
  13. outputHelper.WriteLine($"rpk {string.Join(" ", args)}");
  14. var output = await YamlCliTestHost.RunAsync(
  15. args,
  16. fs.Root,
  17. outputHelper,
  18. "config.yaml"
  19. );
  20. var yaml = await File.ReadAllTextAsync(Path.Combine(fs.Root, "config.yaml"));
  21. return (output, yaml);
  22. }
  23. [Fact]
  24. public async Task help_commands_do_not_throw()
  25. {
  26. (var output, var _) = await ExecuteAsync("mermaid", "export", "--help");
  27. Assert.Equal("""
  28. DESCRIPTION:
  29. Generate a Mermaid infrastructure diagram
  30. USAGE:
  31. rpk mermaid export [OPTIONS]
  32. OPTIONS:
  33. -h, --help Prints help information
  34. --include-tags Comma-separated list of tags to include (e.g.
  35. prod,linux)
  36. --diagram-type Mermaid diagram type (default: "flowchart TD")
  37. --no-labels Disable resource label annotations
  38. --no-edges Disable relationship edges
  39. --label-whitelist Comma-separated list of label keys to include
  40. -o, --output Write Mermaid diagram to file instead of stdout
  41. """, output);
  42. outputHelper.WriteLine(output);
  43. (output, _) = await ExecuteAsync("mermaid", "--help");
  44. Assert.Equal("""
  45. DESCRIPTION:
  46. Generate Mermaid diagrams from infrastructure
  47. USAGE:
  48. rpk mermaid [OPTIONS] <COMMAND>
  49. OPTIONS:
  50. -h, --help Prints help information
  51. COMMANDS:
  52. export Generate a Mermaid infrastructure diagram
  53. """, output);
  54. }
  55. [Fact]
  56. public async Task mermaid_export_creates_expected_diagram()
  57. {
  58. // Prepare test resources
  59. await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
  60. // Add resources
  61. await ExecuteAsync("servers", "add", "srv01");
  62. await ExecuteAsync("servers", "add", "srv02");
  63. await ExecuteAsync("switches", "add", "sw01");
  64. await ExecuteAsync("services", "add", "svc01");
  65. await ExecuteAsync("systems", "add", "sys01");
  66. // Define RunsOn relationships
  67. await ExecuteAsync("services", "set", "svc01", "--RunsOn", "sys01");
  68. await ExecuteAsync("systems", "set", "sys01", "--RunsOn", "srv01");
  69. // Export Mermaid
  70. (var output, var _) = await ExecuteAsync("mermaid", "export");
  71. outputHelper.WriteLine(output);
  72. // Assertions: check subgraphs
  73. Assert.Contains("subgraph servers", output);
  74. Assert.Contains("subgraph switches", output);
  75. Assert.Contains("subgraph services", output);
  76. Assert.Contains("subgraph systems", output);
  77. // Assertions: check nodes
  78. Assert.Contains("srv01", output);
  79. Assert.Contains("srv02", output);
  80. Assert.Contains("sw01", output);
  81. Assert.Contains("svc01", output);
  82. Assert.Contains("sys01", output);
  83. // Assertions: check edges
  84. Assert.Contains("svc01 --> sys01", output);
  85. Assert.Contains("sys01 --> srv01", output);
  86. // Ensure diagram type is included
  87. Assert.StartsWith("flowchart TD", output);
  88. }
  89. [Fact]
  90. public async Task mermaid_export_with_tags_and_labels()
  91. {
  92. // Add resources with tags and labels
  93. await ExecuteAsync("servers", "add", "srv03", "--Tags", "db,primary", "--Label", "env:prod");
  94. // Export only resources with tag 'db'
  95. (var output, _) = await ExecuteAsync("mermaid", "export", "--IncludeTags", "db");
  96. outputHelper.WriteLine(output);
  97. // Only srv03 should appear
  98. Assert.Contains("srv03", output);
  99. Assert.DoesNotContain("srv01", output);
  100. Assert.DoesNotContain("srv02", output);
  101. // Label should be included
  102. Assert.Contains("env: prod", output);
  103. }
  104. }