RemoveGpuUseCaseTests.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using NSubstitute;
  2. using RackPeek.Domain.Resources.Hardware;
  3. using RackPeek.Domain.Resources.Hardware.Servers.Gpus;
  4. using RackPeek.Domain.Resources.Models;
  5. namespace Tests.HardwareResources;
  6. public class RemoveGpuUseCaseTests
  7. {
  8. [Fact]
  9. public async Task ExecuteAsync_Removes_gpu_when_index_is_valid()
  10. {
  11. // Arrange
  12. var repo = Substitute.For<IHardwareRepository>();
  13. var server = new Server
  14. {
  15. Name = "node01",
  16. Gpus = new List<Gpu>
  17. {
  18. new() { Model = "RTX 4090", Vram = 24 },
  19. new() { Model = "RTX 3080", Vram = 10 }
  20. }
  21. };
  22. repo.GetByNameAsync("node01").Returns(server);
  23. var sut = new RemoveGpuUseCase(repo);
  24. // Act
  25. await sut.ExecuteAsync("node01", 0);
  26. // Assert
  27. Assert.Single(server.Gpus);
  28. Assert.Equal("RTX 3080", server.Gpus[0].Model);
  29. await repo.Received(1).UpdateAsync(Arg.Is<Server>(s =>
  30. s.Name == "node01" &&
  31. s.Gpus.Count == 1 &&
  32. s.Gpus[0].Model == "RTX 3080"
  33. ));
  34. }
  35. [Fact]
  36. public async Task ExecuteAsync_Throws_if_index_out_of_range()
  37. {
  38. // Arrange
  39. var repo = Substitute.For<IHardwareRepository>();
  40. var server = new Server
  41. {
  42. Name = "node01",
  43. Gpus = new List<Gpu>
  44. {
  45. new() { Model = "RTX 4090", Vram = 24 }
  46. }
  47. };
  48. repo.GetByNameAsync("node01").Returns(server);
  49. var sut = new RemoveGpuUseCase(repo);
  50. // Act & Assert
  51. await Assert.ThrowsAsync<ArgumentOutOfRangeException>(async () =>
  52. await sut.ExecuteAsync("node01", 1)
  53. );
  54. await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
  55. }
  56. [Fact]
  57. public async Task ExecuteAsync_Does_nothing_when_server_does_not_exist()
  58. {
  59. // Arrange
  60. var repo = Substitute.For<IHardwareRepository>();
  61. repo.GetByNameAsync("node01")
  62. .Returns((Hardware?)null);
  63. var sut = new RemoveGpuUseCase(repo);
  64. // Act
  65. await sut.ExecuteAsync("node01", 0);
  66. // Assert
  67. await repo.DidNotReceive().UpdateAsync(Arg.Any<Server>());
  68. }
  69. }