Procházet zdrojové kódy

Service tests written

James před 3 měsíci
rodič
revize
1b4276ba40

+ 47 - 0
Tests/EndToEnd/ServiceTests/ServiceCommandTests.cs

@@ -0,0 +1,47 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class ServiceCommandTests(TempYamlCliFixture fs, ITestOutputHelper outputHelper)
+    : IClassFixture<TempYamlCliFixture>
+{
+    private async Task<(string output, string yaml)> 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("services", "add", "svc01");
+        // ToDo Introduce CIDR validation and enforce it in the test 
+        await ExecuteAsync("services", "set", "svc01", "--ip", "1.2.3.4");
+
+        var (output, _) = await ExecuteAsync("services", "describe", "svc01");
+
+        Assert.Contains("svc01", output);
+        Assert.Contains("1.2.3.4", output);
+    }
+
+    [Fact]
+    public async Task help_commands_do_not_throw()
+    {
+        Assert.Contains("Manage services", (await ExecuteAsync("services", "--help")).output);
+        Assert.Contains("Add a new service", (await ExecuteAsync("services", "add", "--help")).output);
+        Assert.Contains("List all services", (await ExecuteAsync("services", "list", "--help")).output);
+        Assert.Contains("Retrieve a service", (await ExecuteAsync("services", "get", "--help")).output);
+        Assert.Contains("Show detailed information", (await ExecuteAsync("services", "describe", "--help")).output);
+        Assert.Contains("Update properties", (await ExecuteAsync("services", "set", "--help")).output);
+        Assert.Contains("Delete a service", (await ExecuteAsync("services", "del", "--help")).output);
+        Assert.Contains("List subnets", (await ExecuteAsync("services", "subnets", "--help")).output);
+    }
+}

+ 63 - 0
Tests/EndToEnd/ServiceTests/ServiceErrorTests.cs

@@ -0,0 +1,63 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class ServiceErrorTests(TempYamlCliFixture fs, ITestOutputHelper outputHelper)
+    : IClassFixture<TempYamlCliFixture>
+{
+    private async Task<(string output, string yaml)> 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_service_returns_error()
+    {
+        await ExecuteAsync("services", "add", "svc01");
+        var (output, _) = await ExecuteAsync("services", "add", "svc01");
+        Assert.Contains("already exists", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task get_missing_service_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("services", "get", "ghost");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task set_missing_service_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("services", "set", "ghost", "--ip", "1.2.3.4");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task delete_missing_service_returns_error()
+    {
+        var (output, _) = await ExecuteAsync("services", "del", "ghost");
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+
+    [Fact]
+    public async Task set_runs_on_missing_system_returns_error()
+    {
+        await ExecuteAsync("services", "add", "svc01");
+
+        var (output, _) = await ExecuteAsync(
+            "services", "set", "svc01",
+            "--runs-on", "ghost"
+        );
+
+        Assert.Contains("not found", output, StringComparison.OrdinalIgnoreCase);
+    }
+}

+ 125 - 0
Tests/EndToEnd/ServiceTests/ServiceWorkflowTests.cs

@@ -0,0 +1,125 @@
+using Tests.EndToEnd.Infra;
+using Xunit.Abstractions;
+
+namespace Tests.EndToEnd;
+
+[Collection("Yaml CLI tests")]
+public class ServiceWorkflowTests(TempYamlCliFixture fs, ITestOutputHelper outputHelper)
+    : IClassFixture<TempYamlCliFixture>
+{
+    private async Task<(string output, string yaml)> 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 services_cli_workflow_test()
+    {
+        await File.WriteAllTextAsync(Path.Combine(fs.Root, "config.yaml"), "");
+
+        // Add parent system
+        await ExecuteAsync("systems", "add", "sys01");
+
+        // Add service
+        var (output, yaml) = await ExecuteAsync("services", "add", "svc01");
+        Assert.Equal("Service 'svc01' added.\n", output);
+        Assert.Contains("name: svc01", yaml);
+
+        // Update service
+        (output, yaml) = await ExecuteAsync(
+            "services", "set", "svc01",
+            "--ip", "10.0.0.5",
+            "--port", "8080",
+            "--protocol", "http",
+            "--url", "http://10.0.0.5:8080",
+            "--runs-on", "sys01"
+        );
+        Assert.Equal("Service 'svc01' updated.\n", output);
+
+        Assert.Equal("""
+                     version: 1
+                     resources:
+                     - kind: System
+                       name: sys01
+                     - kind: Service
+                       network:
+                         ip: 10.0.0.5
+                         port: 8080
+                         protocol: http
+                         url: http://10.0.0.5:8080
+                       name: svc01
+                       runsOn: sys01
+
+                     """, yaml);
+
+        // Get service
+        (output, yaml) = await ExecuteAsync("services", "get", "svc01");
+        Assert.Equal("svc01  Ip: 10.0.0.5, Port: 8080, Protocol: http, Url: http://10.0.0.5:8080, \nRunsOn: sys01\n", output);
+
+        // List services (strict table)
+        (output, yaml) = await ExecuteAsync("services", "list");
+        Assert.Equal("""
+                     ╭───────┬──────────┬──────┬──────────┬──────────────────────┬─────────╮
+                     │ Name  │ Ip       │ Port │ Protocol │ Url                  │ Runs On │
+                     ├───────┼──────────┼──────┼──────────┼──────────────────────┼─────────┤
+                     │ svc01 │ 10.0.0.5 │ 8080 │ http     │ http://10.0.0.5:8080 │ sys01   │
+                     ╰───────┴──────────┴──────┴──────────┴──────────────────────┴─────────╯
+
+                     """, output);
+
+        // Summary (strict table)
+        (output, yaml) = await ExecuteAsync("services", "summary");
+        Assert.Equal("""
+                     ╭───────┬──────────┬──────┬──────────┬──────────────────────┬─────────╮
+                     │ Name  │ Ip       │ Port │ Protocol │ Url                  │ Runs On │
+                     ├───────┼──────────┼──────┼──────────┼──────────────────────┼─────────┤
+                     │ svc01 │ 10.0.0.5 │ 8080 │ http     │ http://10.0.0.5:8080 │ sys01   │
+                     ╰───────┴──────────┴──────┴──────────┴──────────────────────┴─────────╯
+
+                     """, output);
+
+        // Subnets (strict)
+        (output, yaml) = await ExecuteAsync("services", "subnets");
+        Assert.Equal("""
+                        ╭─────────────┬──────────┬───────────────────────────────────╮
+                        │ Subnet      │ Services │ Utilization                       │
+                        ├─────────────┼──────────┼───────────────────────────────────┤
+                        │ 10.0.0.0/24 │ 1        │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0% │
+                        ╰─────────────┴──────────┴───────────────────────────────────╯
+                        
+                        """, output);
+
+        // Describe (strict)
+        (output, yaml) = await ExecuteAsync("services", "describe", "svc01");
+        Assert.Equal("""
+                     ╭─Service─────────────────────────────────╮
+                     │ Name:      svc01                        │
+                     │ Ip:        10.0.0.5                     │
+                     │ Port:      8080                         │
+                     │ Protocol:  http                         │
+                     │ Url:       http://10.0.0.5:8080         │
+                     │ Runs On:   sys01                        │
+                     ╰─────────────────────────────────────────╯
+                     
+                     """,output);
+                     
+        
+        // Delete service
+        (output, yaml) = await ExecuteAsync("services", "del", "svc01");
+        Assert.Equal("""
+                     Service 'svc01' deleted.
+
+                     """, output);
+    }
+}

+ 0 - 1
Tests/Tests.csproj

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