Browse Source

Remove and update tests added

James 2 months ago
parent
commit
59e9c05b52

+ 0 - 0
RackPeek.Domain/Resources/Hardware/Server/Drive/AddDrivesUseCase.cs → RackPeek.Domain/Resources/Hardware/Server/Drive/AddDriveUseCase.cs


+ 0 - 0
RackPeek.Domain/Resources/Hardware/Server/Drive/RemoveDrivesUseCase.cs → RackPeek.Domain/Resources/Hardware/Server/Drive/RemoveDriveUseCase.cs


+ 0 - 0
RackPeek.Domain/Resources/Hardware/Server/Drive/UpdateDrivesUseCase.cs → RackPeek.Domain/Resources/Hardware/Server/Drive/UpdateDriveUseCase.cs


+ 89 - 0
Tests/Hardware/RemoveDriveUseCaseTests.cs

@@ -0,0 +1,89 @@
+using NSubstitute;
+using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.Models;
+using RackPeek.Domain.Resources.Hardware.Server.Drive;
+using Xunit;
+
+namespace Tests.Hardware;
+
+public class RemoveDriveUseCaseTests
+{
+    [Fact]
+    public async Task ExecuteAsync_Removes_drive_when_index_is_valid()
+    {
+        // Arrange
+        var repo = Substitute.For<IHardwareRepository>();
+        var server = new Server
+        {
+            Name = "node01",
+            Drives = new List<Drive>
+            {
+                new Drive { Type = "NVMe", Size = 2000 },
+                new Drive { Type = "SATA", Size = 500 }
+            }
+        };
+
+        // ❗ FIXED: return the server, not null
+        repo.GetByNameAsync("node01").Returns(server);
+
+        var sut = new RemoveDriveUseCase(repo);
+
+        // Act
+        await sut.ExecuteAsync("node01", index: 0);
+
+        // Assert
+        Assert.Single(server.Drives);
+        Assert.Equal("SATA", server.Drives[0].Type);
+
+        await repo.Received(1).UpdateAsync(Arg.Is<Server>(s =>
+            s.Name == "node01" &&
+            s.Drives.Count == 1 &&
+            s.Drives[0].Type == "SATA"
+        ));
+    }
+
+    [Fact]
+    public async Task ExecuteAsync_Throws_if_index_out_of_range()
+    {
+        // Arrange
+        var repo = Substitute.For<IHardwareRepository>();
+        var server = new Server
+        {
+            Name = "node01",
+            Drives = new List<Drive>
+            {
+                new Drive { Type = "NVMe", Size = 2000 }
+            }
+        };
+
+        repo.GetByNameAsync("node01").Returns(server);
+
+        var sut = new RemoveDriveUseCase(repo);
+
+        // Act & Assert
+        await Assert.ThrowsAsync<ArgumentOutOfRangeException>(async () =>
+            await sut.ExecuteAsync("node01", index: 1)
+        );
+
+        await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
+    }
+
+    [Fact]
+    public async Task ExecuteAsync_Does_nothing_when_server_does_not_exist()
+    {
+        // Arrange
+        var repo = Substitute.For<IHardwareRepository>();
+
+        
+        repo.GetByNameAsync("node01")
+            .Returns((RackPeek.Domain.Resources.Hardware.Models.Hardware?)null);
+
+        var sut = new RemoveDriveUseCase(repo);
+
+        // Act
+        await sut.ExecuteAsync("node01", index: 0);
+
+        // Assert
+        await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
+    }
+}

+ 102 - 0
Tests/Hardware/UpdateDriveUseCaseTests.cs

@@ -0,0 +1,102 @@
+using NSubstitute;
+using RackPeek.Domain.Resources.Hardware;
+using RackPeek.Domain.Resources.Hardware.Models;
+using RackPeek.Domain.Resources.Hardware.Server.Drive;
+using Xunit;
+
+namespace Tests.Hardware;
+
+public class UpdateDriveUseCaseTests
+{
+    [Fact]
+    public async Task ExecuteAsync_Updates_drive_when_index_is_valid()
+    {
+        // Arrange
+        var repo = Substitute.For<IHardwareRepository>();
+        var server = new Server
+        {
+            Name = "node01",
+            Drives = new List<Drive>
+            {
+                new Drive { Type = "NVMe", Size = 2000 }
+            }
+        };
+
+        repo.GetByNameAsync("node01").Returns(server);
+
+        var sut = new UpdateDriveUseCase(repo);
+
+        // Act
+        await sut.ExecuteAsync(
+            serverName: "node01",
+            index: 0,
+            type: "SATA",
+            size: 500
+        );
+
+        // Assert
+        Assert.Equal("SATA", server.Drives[0].Type);
+        Assert.Equal(500, server.Drives[0].Size);
+
+        await repo.Received(1).UpdateAsync(Arg.Is<Server>(s =>
+            s.Name == "node01" &&
+            s.Drives.Count == 1 &&
+            s.Drives[0].Type == "SATA" &&
+            s.Drives[0].Size == 500
+        ));
+    }
+
+    [Fact]
+    public async Task ExecuteAsync_Throws_if_index_out_of_range()
+    {
+        // Arrange
+        var repo = Substitute.For<IHardwareRepository>();
+        var server = new Server
+        {
+            Name = "node01",
+            Drives = new List<Drive>
+            {
+                new Drive { Type = "NVMe", Size = 2000 }
+            }
+        };
+
+        repo.GetByNameAsync("node01").Returns(server);
+
+        var sut = new UpdateDriveUseCase(repo);
+
+        // Act & Assert
+        await Assert.ThrowsAsync<ArgumentOutOfRangeException>(async () =>
+            await sut.ExecuteAsync(
+                serverName: "node01",
+                index: 1,
+                type: "SATA",
+                size: 500
+            )
+        );
+
+        await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
+    }
+
+    [Fact]
+    public async Task ExecuteAsync_Does_nothing_when_server_does_not_exist()
+    {
+        // Arrange
+        var repo = Substitute.For<IHardwareRepository>();
+
+        repo.GetByNameAsync("node01")
+            .Returns((RackPeek.Domain.Resources.Hardware.Models.Hardware?)null);
+
+        var sut = new UpdateDriveUseCase(repo);
+
+        // Act
+        await sut.ExecuteAsync(
+            serverName: "node01",
+            index: 0,
+            type: "SATA",
+            size: 500
+        );
+
+        // Assert
+        await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
+    }
+}