Просмотр исходного кода

Desktop test written - ToDo added to fix the desktop tree command - RAM add command also missing from CLI

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

+ 1 - 1
RackPeek/RackPeek.csproj

@@ -5,7 +5,7 @@
         <TargetFramework>net10.0</TargetFramework>
         <ImplicitUsings>enable</ImplicitUsings>
         <Nullable>enable</Nullable>
-        <AssemblyVersion>v0.0.11</AssemblyVersion>
+        <AssemblyVersion>0.0.11</AssemblyVersion>
     </PropertyGroup>
 
     <ItemGroup>

+ 66 - 0
Tests/EndToEnd/Desktops/DesktopCommandTests.cs

@@ -0,0 +1,66 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class DesktopCommandTests(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("desktops", "add", "workstation01");
+        await ExecuteAsync("desktops", "set", "workstation01", "--model", "Dell Precision 7960");
+
+        // then
+        var (output, _) = await ExecuteAsync("desktops", "describe", "workstation01");
+
+        // when
+        Assert.Contains("Name:", output);
+        Assert.Contains("workstation01", output);
+        Assert.Contains("Model:", output);
+        Assert.Contains("Dell Precision 7960", output);
+    }
+
+    [Fact]
+    public async Task help_outputs_do_not_throw()
+    {
+        Assert.Contains("Manage desktop computers", (await ExecuteAsync("desktops", "--help")).Item1);
+        Assert.Contains("Add a new desktop", (await ExecuteAsync("desktops", "add", "--help")).Item1);
+        Assert.Contains("Retrieve a desktop", (await ExecuteAsync("desktops", "get", "--help")).Item1);
+        Assert.Contains("Show detailed information", (await ExecuteAsync("desktops", "describe", "--help")).Item1);
+        Assert.Contains("Update properties", (await ExecuteAsync("desktops", "set", "--help")).Item1);
+        Assert.Contains("Delete a desktop", (await ExecuteAsync("desktops", "del", "--help")).Item1);
+        Assert.Contains("summarized hardware report", (await ExecuteAsync("desktops", "summary", "--help")).Item1);
+        Assert.Contains("dependency tree", (await ExecuteAsync("desktops", "tree", "--help")).Item1);
+
+        // Component help
+        Assert.Contains("Manage CPUs", (await ExecuteAsync("desktops", "cpu", "--help")).Item1);
+        Assert.Contains("Add a CPU", (await ExecuteAsync("desktops", "cpu", "add", "--help")).Item1);
+        Assert.Contains("Update a desktop CPU", (await ExecuteAsync("desktops", "cpu", "set", "--help")).Item1);
+
+        Assert.Contains("Manage storage drives", (await ExecuteAsync("desktops", "drive", "--help")).Item1);
+        Assert.Contains("Add a drive", (await ExecuteAsync("desktops", "drive", "add", "--help")).Item1);
+
+        Assert.Contains("Manage GPUs", (await ExecuteAsync("desktops", "gpu", "--help")).Item1);
+        Assert.Contains("Add a GPU", (await ExecuteAsync("desktops", "gpu", "add", "--help")).Item1);
+
+        Assert.Contains("Manage network interface cards", (await ExecuteAsync("desktops", "nic", "--help")).Item1);
+        Assert.Contains("Add a NIC", (await ExecuteAsync("desktops", "nic", "add", "--help")).Item1);
+    }
+}

+ 125 - 0
Tests/EndToEnd/Desktops/DesktopErrorTests.cs

@@ -0,0 +1,125 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class DesktopErrorTests(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_desktop_returns_error()
+    {
+        await ExecuteAsync("desktops", "add", "workstation01");
+        var (output, _) = await ExecuteAsync("desktops", "add", "workstation01");
+        Assert.Contains("already exists", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task get_missing_desktop_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("desktops", "get", "ghost");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task set_missing_desktop_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("desktops", "set", "ghost", "--model", "X");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task delete_missing_desktop_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("desktops", "del", "ghost");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task tree_missing_desktop_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("desktops", "tree", "ghost");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    // CPU errors
+    [Fact]
+    public async Task cpu_add_missing_desktop_returns_error()
+    {
+        var (output, _) = await ExecuteAsync(
+            "desktops", "cpu", "add", "ghost",
+            "--model", "Xeon",
+            "--cores", "8",
+            "--threads", "16"
+        );
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task cpu_set_invalid_index_returns_error()
+    {
+        await ExecuteAsync("desktops", "add", "workstation01");
+
+        var (output, _) = await ExecuteAsync(
+            "desktops", "cpu", "set", "workstation01", "5",
+            "--model", "Xeon"
+        );
+
+        Assert.Contains("invalid", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    // Drive errors
+    [Fact]
+    public async Task drive_add_missing_desktop_returns_error()
+    {
+        var (output, _) = await ExecuteAsync(
+            "desktops", "drive", "add", "ghost",
+            "--type", "ssd",
+            "--size", "1000"
+        );
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    // GPU errors
+    [Fact]
+    public async Task gpu_add_missing_desktop_returns_error()
+    {
+        var (output, _) = await ExecuteAsync(
+            "desktops", "gpu", "add", "ghost",
+            "--model", "RTX 4090",
+            "--vram", "24"
+        );
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    // NIC errors
+    [Fact]
+    public async Task nic_add_missing_desktop_returns_error()
+    {
+        var (output, _) = await ExecuteAsync(
+            "desktops", "nic", "add", "ghost",
+            "--type", "rj45",
+            "--speed", "10",
+            "--ports", "2"
+        );
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+}

+ 179 - 0
Tests/EndToEnd/Desktops/DesktopWorkflowTests.cs

@@ -0,0 +1,179 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class DesktopWorkflowTests(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 desktops_cli_workflow_test()
+    {
+        await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
+
+        // Add desktop
+        var (output, yaml) = await ExecuteAsync("desktops", "add", "workstation01");
+        Assert.Equal("Desktop 'workstation01' added.\n", output);
+        Assert.Contains("name: workstation01", yaml);
+
+        // Update desktop
+        (output, yaml) = await ExecuteAsync(
+            "desktops", "set", "workstation01",
+            "--model", "Dell Precision 7960"
+        );
+        Assert.Equal("Desktop 'workstation01' updated.\n", output);
+        Assert.Contains("model: Dell Precision 7960", yaml);
+
+        // Add CPU
+        (output, yaml) = await ExecuteAsync(
+            "desktops", "cpu", "add", "workstation01",
+            "--model", "Intel Xeon W7-2495X",
+            "--cores", "24",
+            "--threads", "48"
+        );
+        Assert.Equal("CPU added to desktop 'workstation01'.\n", output);
+
+        // Add Drive
+        (output, yaml) = await ExecuteAsync(
+            "desktops", "drive", "add", "workstation01",
+            "--type", "ssd",
+            "--size", "2000"
+        );
+        Assert.Equal("Drive added to desktop 'workstation01'.\n", output);
+
+        // Add GPU
+        (output, yaml) = await ExecuteAsync(
+            "desktops", "gpu", "add", "workstation01",
+            "--model", "NVIDIA RTX 4090",
+            "--vram", "24"
+        );
+        Assert.Equal("GPU added to desktop 'workstation01'.\n", output);
+
+        // Add NIC
+        (output, yaml) = await ExecuteAsync(
+            "desktops", "nic", "add", "workstation01",
+            "--type", "rj45",
+            "--speed", "10",
+            "--ports", "2"
+        );
+        Assert.Equal("NIC added to desktop 'workstation01'.\n", output);
+
+        // List desktops
+        (output, yaml) = await ExecuteAsync("desktops", "list");
+        Assert.Contains("workstation01", output);
+
+        // Summary
+        (output, yaml) = await ExecuteAsync("desktops", "summary");
+
+        // Describe
+        (output, yaml) = await ExecuteAsync("desktops", "describe", "workstation01");
+
+        // Identity
+        Assert.Contains("Desktop", output);
+        Assert.Contains("workstation01", output);
+
+        // Model
+        Assert.Contains("Dell Precision 7960", output);
+
+        // CPU summary
+        Assert.Contains("CPUs:", output);
+        Assert.Contains("1", output);
+        
+        // RAM summary
+        Assert.Contains("RAM:", output);
+        Assert.Contains("1", output);
+
+        // Drive summary
+        Assert.Contains("Drives:", output);
+        Assert.Contains("1", output);
+
+        // NIC summary
+        Assert.Contains("NICs:", output);
+        Assert.Contains("1", output);
+
+        // GPU summary
+        Assert.Contains("GPUs:", output);
+        Assert.Contains("1", output);
+
+        // ToDo Tree command not currently working as intended
+        
+        // Tree 
+        (output, yaml) = await ExecuteAsync("desktops", "tree", "workstation01");
+        Assert.Contains("workstation01", output);
+        Assert.Contains("CPU:", output);
+        Assert.Contains("RAM:", output);
+        Assert.Contains("Drive:", output);
+        Assert.Contains("GPU:", output);
+        Assert.Contains("NIC:", output);
+
+        // Delete desktop
+        (output, yaml) = await ExecuteAsync("desktops", "del", "workstation01");
+        Assert.Equal("""
+                     Desktop 'workstation01' deleted.
+
+                     """, output);
+    }
+
+    [Fact]
+    public async Task desktops_tree_cli_workflow_test()
+    {
+        await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
+
+        // Add desktop
+        var (output, yaml) = await ExecuteAsync("desktops", "add", "workstation01");
+        Assert.Equal("Desktop 'workstation01' added.\n", output);
+
+        // Add systems
+        (output, yaml) = await ExecuteAsync("systems", "add", "sys01");
+        Assert.Equal("System 'sys01' added.\n", output);
+
+        (output, yaml) = await ExecuteAsync("systems", "add", "sys02");
+        Assert.Equal("System 'sys02' added.\n", output);
+
+        (output, yaml) = await ExecuteAsync("systems", "add", "sys03");
+        Assert.Equal("System 'sys03' added.\n", output);
+
+        // Attach systems
+        await ExecuteAsync("systems", "set", "sys01", "--runs-on", "workstation01");
+        await ExecuteAsync("systems", "set", "sys02", "--runs-on", "workstation01");
+        await ExecuteAsync("systems", "set", "sys03", "--runs-on", "workstation01");
+
+        // Add services
+        await ExecuteAsync("services", "add", "immich");
+        await ExecuteAsync("services", "add", "paperless");
+
+        // Attach services
+        await ExecuteAsync("services", "set", "immich", "--runs-on", "sys01");
+        await ExecuteAsync("services", "set", "paperless", "--runs-on", "sys01");
+
+        // Render tree
+        (output, yaml) = await ExecuteAsync("desktops", "tree", "workstation01");
+        Assert.Equal("""
+                     workstation01
+                     ├── System: sys01
+                     │   ├── Service: immich
+                     │   └── Service: paperless
+                     ├── System: sys02
+                     └── System: sys03
+
+                     """, output);
+    }
+}