RemoveDriveUseCaseTests.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using NSubstitute;
  2. using RackPeek.Domain.Resources.Hardware;
  3. using RackPeek.Domain.Resources.Hardware.Models;
  4. using RackPeek.Domain.Resources.Hardware.Server.Drive;
  5. using Xunit;
  6. namespace Tests.Hardware;
  7. public class RemoveDriveUseCaseTests
  8. {
  9. [Fact]
  10. public async Task ExecuteAsync_Removes_drive_when_index_is_valid()
  11. {
  12. // Arrange
  13. var repo = Substitute.For<IHardwareRepository>();
  14. var server = new Server
  15. {
  16. Name = "node01",
  17. Drives = new List<Drive>
  18. {
  19. new Drive { Type = "NVMe", Size = 2000 },
  20. new Drive { Type = "SATA", Size = 500 }
  21. }
  22. };
  23. // ❗ FIXED: return the server, not null
  24. repo.GetByNameAsync("node01").Returns(server);
  25. var sut = new RemoveDriveUseCase(repo);
  26. // Act
  27. await sut.ExecuteAsync("node01", index: 0);
  28. // Assert
  29. Assert.Single(server.Drives);
  30. Assert.Equal("SATA", server.Drives[0].Type);
  31. await repo.Received(1).UpdateAsync(Arg.Is<Server>(s =>
  32. s.Name == "node01" &&
  33. s.Drives.Count == 1 &&
  34. s.Drives[0].Type == "SATA"
  35. ));
  36. }
  37. [Fact]
  38. public async Task ExecuteAsync_Throws_if_index_out_of_range()
  39. {
  40. // Arrange
  41. var repo = Substitute.For<IHardwareRepository>();
  42. var server = new Server
  43. {
  44. Name = "node01",
  45. Drives = new List<Drive>
  46. {
  47. new Drive { Type = "NVMe", Size = 2000 }
  48. }
  49. };
  50. repo.GetByNameAsync("node01").Returns(server);
  51. var sut = new RemoveDriveUseCase(repo);
  52. // Act & Assert
  53. await Assert.ThrowsAsync<ArgumentOutOfRangeException>(async () =>
  54. await sut.ExecuteAsync("node01", index: 1)
  55. );
  56. await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
  57. }
  58. [Fact]
  59. public async Task ExecuteAsync_Does_nothing_when_server_does_not_exist()
  60. {
  61. // Arrange
  62. var repo = Substitute.For<IHardwareRepository>();
  63. repo.GetByNameAsync("node01")
  64. .Returns((RackPeek.Domain.Resources.Hardware.Models.Hardware?)null);
  65. var sut = new RemoveDriveUseCase(repo);
  66. // Act
  67. await sut.ExecuteAsync("node01", index: 0);
  68. // Assert
  69. await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
  70. }
  71. }