Jelajahi Sumber

Add end-to-end CLI tests for 'rpk other' commands

Mirrors the UPS test suite: command output/describe/help/rename
tests, error-path tests, and a full add/set/get/list/summary/del
workflow test asserting the persisted YAML.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Tim Jones 17 jam lalu
induk
melakukan
d649c499e9

+ 69 - 0
Tests/EndToEnd/OtherTests/OtherCommandTests.cs

@@ -0,0 +1,69 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd.OtherTests;
+
+[Collection("Yaml CLI tests")]
+public class OtherCommandTests(TempYamlCliFixture fs, ITestOutputHelper outputHelper)
+    : IClassFixture<TempYamlCliFixture> {
+    private async Task<(string, string)> ExecuteAsync(params string[] args) {
+        var output = await YamlCliTestHost.RunAsync(
+            args,
+            fs.Root,
+            outputHelper,
+            "config.yaml");
+
+        var yaml = await File.ReadAllTextAsync(Path.Combine(fs.Root, "config.yaml"));
+        return (output, yaml);
+    }
+
+    [Fact]
+    public async Task describe_returns_detailed_information() {
+        // given
+        await ExecuteAsync("other", "add", "radio01");
+        await ExecuteAsync("other", "set", "radio01", "--model", "Building Bridge XG", "--description", "Microwave radio bridge");
+
+        // when
+        (var output, var _) = await ExecuteAsync("other", "describe", "radio01");
+
+        // then
+        Assert.Contains("Name:", output);
+        Assert.Contains("radio01", output);
+
+        Assert.Contains("Model:", output);
+        Assert.Contains("Building Bridge XG", output);
+
+        Assert.Contains("Description:", output);
+        Assert.Contains("Microwave radio bridge", output);
+    }
+
+    [Fact]
+    public async Task help_outputs_do_not_throw() {
+        (var rootHelp, var _) = await ExecuteAsync("other", "--help");
+        Assert.Contains("Manage other hardware", rootHelp);
+
+        (var addHelp, var _) = await ExecuteAsync("other", "add", "--help");
+        Assert.Contains("Add new other hardware", addHelp);
+
+        (var setHelp, var _) = await ExecuteAsync("other", "set", "--help");
+        Assert.Contains("Update properties", setHelp);
+
+        (var describeHelp, var _) = await ExecuteAsync("other", "describe", "--help");
+        Assert.Contains("Show detailed information", describeHelp);
+
+        (var delHelp, var _) = await ExecuteAsync("other", "del", "--help");
+        Assert.Contains("Delete other hardware", delHelp);
+        (var renameHelp, var _) = await ExecuteAsync("other", "rename", "--help");
+        Assert.Contains("Rename other hardware", renameHelp);
+    }
+
+    [Fact]
+    public async Task rename_successfully_updates_name() {
+        await ExecuteAsync("other", "add", "radio01");
+
+        (var output, var yaml) = await ExecuteAsync("other", "rename", "radio01", "radio01-new");
+
+        Assert.Equal("Other hardware 'radio01' renamed to 'radio01-new'.\n", output);
+        Assert.Contains("name: radio01-new", yaml);
+    }
+}

+ 60 - 0
Tests/EndToEnd/OtherTests/OtherErrorTests.cs

@@ -0,0 +1,60 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd.OtherTests;
+
+[Collection("Yaml CLI tests")]
+public class OtherErrorTests(TempYamlCliFixture fs, ITestOutputHelper outputHelper)
+    : IClassFixture<TempYamlCliFixture> {
+    private async Task<(string, string)> ExecuteAsync(params string[] args) {
+        var output = await YamlCliTestHost.RunAsync(
+            args,
+            fs.Root,
+            outputHelper,
+            "config.yaml");
+
+        var yaml = await File.ReadAllTextAsync(Path.Combine(fs.Root, "config.yaml"));
+        return (output, yaml);
+    }
+
+    [Fact]
+    public async Task adding_duplicate_other_returns_error() {
+        await ExecuteAsync("other", "add", "radio01");
+
+        (var output, var _) = await ExecuteAsync("other", "add", "radio01");
+
+        Assert.Contains("already exists", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task get_missing_other_returns_error() {
+        (var output, var _) = await ExecuteAsync("other", "get", "ghost");
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task set_missing_other_returns_error() {
+        (var output, var _) = await ExecuteAsync(
+            "other", "set", "ghost",
+            "--model", "X",
+            "--description", "Y"
+        );
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task delete_missing_other_returns_error() {
+        (var output, var _) = await ExecuteAsync("other", "del", "ghost");
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task rename_missing_other_returns_error() {
+        (var output, var _) = await ExecuteAsync("other", "rename", "ghost", "ghost-new");
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+}

+ 104 - 0
Tests/EndToEnd/OtherTests/OtherWorkflowTests.cs

@@ -0,0 +1,104 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd.OtherTests;
+
+[Collection("Yaml CLI tests")]
+public class OtherWorkflowTests(TempYamlCliFixture fs, ITestOutputHelper outputHelper)
+    : IClassFixture<TempYamlCliFixture> {
+    private async Task<(string, string)> ExecuteAsync(params string[] args) {
+        outputHelper.WriteLine($"rpk {string.Join(" ", args)}");
+
+        var output = await YamlCliTestHost.RunAsync(
+            args,
+            fs.Root,
+            outputHelper,
+            "config.yaml");
+
+        outputHelper.WriteLine(output);
+
+        var yaml = await File.ReadAllTextAsync(Path.Combine(fs.Root, "config.yaml"));
+        return (output, yaml);
+    }
+
+    [Fact]
+    public async Task other_cli_workflow_test() {
+        // Add other hardware
+        (var output, var yaml) = await ExecuteAsync("other", "add", "radio01");
+        Assert.Equal("Other hardware 'radio01' added.\n", output);
+        Assert.Contains("name: radio01", yaml);
+
+        // Update other hardware
+        (output, yaml) = await ExecuteAsync(
+            "other", "set", "radio01",
+            "--model", "Building-Bridge-XG",
+            "--description", "Microwave radio bridge"
+        );
+        Assert.Equal("Other hardware 'radio01' updated.\n", output);
+
+        Assert.Equal("""
+                     version: 3
+                     resources:
+                     - kind: Other
+                       model: Building-Bridge-XG
+                       description: Microwave radio bridge
+                       name: radio01
+                     connections: []
+
+                     """, yaml);
+
+        // Add second other hardware
+        (output, yaml) = await ExecuteAsync("other", "add", "bridge01");
+        Assert.Equal("Other hardware 'bridge01' added.\n", output);
+
+        (output, yaml) = await ExecuteAsync(
+            "other", "set", "bridge01",
+            "--model", "Interop-Bridge-2",
+            "--description", "Radio interoperability bridge"
+        );
+        Assert.Equal("Other hardware 'bridge01' updated.\n", output);
+
+        Assert.Equal("""
+                     version: 3
+                     resources:
+                     - kind: Other
+                       model: Building-Bridge-XG
+                       description: Microwave radio bridge
+                       name: radio01
+                     - kind: Other
+                       model: Interop-Bridge-2
+                       description: Radio interoperability bridge
+                       name: bridge01
+                     connections: []
+
+                     """, yaml);
+
+        // Get other hardware
+        (output, yaml) = await ExecuteAsync("other", "get", "radio01");
+        Assert.Contains("radio01", output);
+        Assert.Contains("Building-Bridge-XG", output);
+        Assert.Contains("Microwave radio bridge", output);
+
+        // List other hardware
+        (output, yaml) = await ExecuteAsync("other", "list");
+        Assert.Contains("radio01", output);
+        Assert.Contains("bridge01", output);
+
+        // Summary
+        (output, yaml) = await ExecuteAsync("other", "summary");
+        Assert.Contains("radio01", output);
+        Assert.Contains("bridge01", output);
+
+        // Delete other hardware
+        (output, yaml) = await ExecuteAsync("other", "del", "bridge01");
+        Assert.Equal("""
+                     Other hardware 'bridge01' deleted.
+
+                     """, output);
+
+        // List again
+        (output, yaml) = await ExecuteAsync("other", "list");
+        Assert.Contains("radio01", output);
+        Assert.DoesNotContain("bridge01", output);
+    }
+}