James 1 месяц назад
Родитель
Сommit
360e2100ce

+ 1 - 1
Shared.Rcl/Commands/Routers/RouterSetCommand.cs

@@ -33,7 +33,7 @@ public class RouterSetCommand(
             settings.Managed,
             settings.Poe);
 
-        AnsiConsole.MarkupLine($"[green]Server '{settings.Name}' updated.[/]");
+        AnsiConsole.MarkupLine($"[green]Router '{settings.Name}' updated.[/]");
         return 0;
     }
 }

+ 4 - 4
Tests/EndToEnd/LaptopTests/LaptopWorkflowTests.cs

@@ -74,19 +74,19 @@ public class LaptopWorkflowTests(TempYamlCliFixture fs, ITestOutputHelper output
             output
         );
 
-        // List laptops (strict table)
+        // List laptops 
         (output, yaml) = await ExecuteAsync("laptops", "list");
         Assert.Contains("lap01", output);
 
-        // Summary (strict table)
+        // Summary 
         (output, yaml) = await ExecuteAsync("laptops", "summary");
         Assert.Contains("lap01", output);
 
-        // Describe (loose)
+        // Describe 
         (output, yaml) = await ExecuteAsync("laptops", "describe", "lap01");
         Assert.Contains("lap01", output);
 
-        // Tree (loose)
+        // Tree 
         (output, yaml) = await ExecuteAsync("laptops", "tree", "lap01");
         Assert.Contains("lap01", output);
 

+ 54 - 0
Tests/EndToEnd/RouterTests/RouterCommandTests.cs

@@ -0,0 +1,54 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class RouterCommandTests(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_outputs_expected_information()
+    {
+        await ExecuteAsync("routers", "add", "rt01");
+        await ExecuteAsync("routers", "set", "rt01", "--Model", "Ubiquiti EdgeRouter 4");
+
+        var (output, _) = await ExecuteAsync("routers", "describe", "rt01");
+
+        Assert.Contains("rt01", output);
+        Assert.Contains("Ubiquiti EdgeRouter 4", output);
+        Assert.Contains("Managed", output);
+        Assert.Contains("PoE", output);
+    }
+
+    [Fact]
+    public async Task help_commands_do_not_throw()
+    {
+        Assert.Contains("Manage network routers", (await ExecuteAsync("routers", "--help")).Item1);
+        Assert.Contains("Add a new network router", (await ExecuteAsync("routers", "add", "--help")).Item1);
+        Assert.Contains("List all routers", (await ExecuteAsync("routers", "list", "--help")).Item1);
+        Assert.Contains("Retrieve details", (await ExecuteAsync("routers", "get", "--help")).Item1);
+        Assert.Contains("Show detailed information", (await ExecuteAsync("routers", "describe", "--help")).Item1);
+        Assert.Contains("Update properties", (await ExecuteAsync("routers", "set", "--help")).Item1);
+        Assert.Contains("Delete a router", (await ExecuteAsync("routers", "del", "--help")).Item1);
+
+        // Port help
+        Assert.Contains("Manage ports", (await ExecuteAsync("routers", "port", "--help")).Item1);
+        Assert.Contains("Add a port", (await ExecuteAsync("routers", "port", "add", "--help")).Item1);
+        Assert.Contains("Update a router port", (await ExecuteAsync("routers", "port", "set", "--help")).Item1);
+        Assert.Contains("Remove a port", (await ExecuteAsync("routers", "port", "del", "--help")).Item1);
+    }
+}

+ 92 - 0
Tests/EndToEnd/RouterTests/RouterErrorTests.cs

@@ -0,0 +1,92 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class RouterErrorTests(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_router_returns_error()
+    {
+        await ExecuteAsync("routers", "add", "rt01");
+        var (output, _) = await ExecuteAsync("routers", "add", "rt01");
+        Assert.Contains("already exists", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task get_missing_router_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("routers", "get", "ghost");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task set_missing_router_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("routers", "set", "ghost", "--Model", "X");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task delete_missing_router_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("routers", "del", "ghost");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    // Port errors
+    [Fact]
+    public async Task port_add_missing_router_returns_error()
+    {
+        var (output, _) = await ExecuteAsync(
+            "routers", "port", "add", "ghost",
+            "--type", "rj45",
+            "--speed", "1",
+            "--count", "8"
+        );
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task port_set_invalid_index_returns_error()
+    {
+        await ExecuteAsync("routers", "add", "rt01");
+
+        var (output, _) = await ExecuteAsync(
+            "routers", "port", "set", "rt01",
+            "--index", "5",
+            "--type", "rj45"
+        );
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task port_del_invalid_index_returns_error()
+    {
+        await ExecuteAsync("routers", "add", "rt01");
+
+        var (output, _) = await ExecuteAsync(
+            "routers", "port", "del", "rt01",
+            "--index", "3"
+        );
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+}

+ 124 - 0
Tests/EndToEnd/RouterTests/RouterWorkflowTests.cs

@@ -0,0 +1,124 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class RouterWorkflowTests(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 routers_cli_workflow_test()
+    {
+        await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
+
+        // Add router
+        var (output, yaml) = await ExecuteAsync("routers", "add", "rt01");
+        Assert.Equal("Router 'rt01' added.\n", output);
+        Assert.Contains("name: rt01", yaml);
+
+        // Update router
+        (output, yaml) = await ExecuteAsync(
+            "routers", "set", "rt01",
+            "--Model", "Ubiquiti EdgeRouter 4",
+            "--managed", "true",
+            "--poe", "false"
+        );
+        Assert.Equal("Router 'rt01' updated.\n", output);
+
+        Assert.Equal("""
+                     version: 1
+                     resources:
+                     - kind: Router
+                       model: Ubiquiti EdgeRouter 4
+                       managed: true
+                       poe: false
+                       name: rt01
+
+                     """, yaml);
+
+        // Add second router
+        (output, yaml) = await ExecuteAsync("routers", "add", "rt02");
+        Assert.Equal("Router 'rt02' added.\n", output);
+
+        (output, yaml) = await ExecuteAsync(
+            "routers", "set", "rt02",
+            "--Model", "TP-Link ER605",
+            "--managed", "false",
+            "--poe", "false"
+        );
+        Assert.Equal("Router 'rt02' updated.\n", output);
+
+        Assert.Equal("""
+                     version: 1
+                     resources:
+                     - kind: Router
+                       model: Ubiquiti EdgeRouter 4
+                       managed: true
+                       poe: false
+                       name: rt01
+                     - kind: Router
+                       model: TP-Link ER605
+                       managed: false
+                       poe: false
+                       name: rt02
+
+                     """, yaml);
+
+        // Get router
+        (output, yaml) = await ExecuteAsync("routers", "get", "rt01");
+        Assert.Equal("rt01  Model: Ubiquiti EdgeRouter 4, Managed: Yes, PoE: No\n", output);
+
+        // List routers (strict table)
+        (output, yaml) = await ExecuteAsync("routers", "list");
+        Assert.Equal("""
+                     ╭──────┬───────────────────────┬─────────┬─────┬───────┬──────────────╮
+                     │ Name │ Model                 │ Managed │ PoE │ Ports │ Port Summary │
+                     ├──────┼───────────────────────┼─────────┼─────┼───────┼──────────────┤
+                     │ rt01 │ Ubiquiti EdgeRouter 4 │ yes     │ no  │ 0     │ Unknown      │
+                     │ rt02 │ TP-Link ER605         │ no      │ no  │ 0     │ Unknown      │
+                     ╰──────┴───────────────────────┴─────────┴─────┴───────┴──────────────╯
+
+                     """, output);
+
+        // Summary
+        (output, yaml) = await ExecuteAsync("routers", "summary");
+        Assert.Contains("rt01", output);
+        Assert.Contains("rt02", output);
+
+        // Delete router
+        (output, yaml) = await ExecuteAsync("routers", "del", "rt02");
+        Assert.Equal("""
+                     Router 'rt02' deleted.
+
+                     """, output);
+
+        // List again
+        (output, yaml) = await ExecuteAsync("routers", "list");
+        Assert.Equal("""
+                     ╭──────┬───────────────────────┬─────────┬─────┬───────┬──────────────╮
+                     │ Name │ Model                 │ Managed │ PoE │ Ports │ Port Summary │
+                     ├──────┼───────────────────────┼─────────┼─────┼───────┼──────────────┤
+                     │ rt01 │ Ubiquiti EdgeRouter 4 │ yes     │ no  │ 0     │ Unknown      │
+                     ╰──────┴───────────────────────┴─────────┴─────┴───────┴──────────────╯
+
+                     """, output);
+    }
+}

+ 0 - 1
Tests/Tests.csproj

@@ -27,7 +27,6 @@
     </ItemGroup>
 
     <ItemGroup>
-      <Folder Include="EndToEnd\RouterTests\" />
       <Folder Include="EndToEnd\ServerTests\" />
       <Folder Include="EndToEnd\ServiceTests\" />
     </ItemGroup>