AddSystemDriveUseCaseTests.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. using System.ComponentModel.DataAnnotations;
  2. using NSubstitute;
  3. using RackPeek.Domain.Helpers;
  4. using RackPeek.Domain.Resources.Hardware.Models;
  5. using RackPeek.Domain.Resources.SystemResources;
  6. using RackPeek.Domain.Resources.SystemResources.UseCases;
  7. namespace Tests.HardwareResources.Systems;
  8. public class AddSystemDriveUseCaseTests
  9. {
  10. [Fact]
  11. public async Task ExecuteAsync_Adds_drive_when_system_exists()
  12. {
  13. // Arrange
  14. var repo = Substitute.For<ISystemRepository>();
  15. var system = new SystemResource
  16. {
  17. Name = "sys1",
  18. Drives = new List<Drive>()
  19. };
  20. repo.GetByNameAsync("sys1").Returns(system);
  21. var sut = new AddSystemDriveUseCase(repo);
  22. // Act
  23. await sut.ExecuteAsync("sys1", "ssd", 512);
  24. // Assert
  25. Assert.Single(system.Drives);
  26. Assert.Equal("ssd", system.Drives[0].Type);
  27. Assert.Equal(512, system.Drives[0].Size);
  28. await repo.Received(1).UpdateAsync(Arg.Is<SystemResource>(s =>
  29. s.Name == "sys1" &&
  30. s.Drives.Count == 1 &&
  31. s.Drives[0].Type == "ssd" &&
  32. s.Drives[0].Size == 512
  33. ));
  34. }
  35. [Fact]
  36. public async Task ExecuteAsync_Initializes_drive_list_when_null()
  37. {
  38. // Arrange
  39. var repo = Substitute.For<ISystemRepository>();
  40. var system = new SystemResource
  41. {
  42. Name = "sys1",
  43. Drives = null
  44. };
  45. repo.GetByNameAsync("sys1").Returns(system);
  46. var sut = new AddSystemDriveUseCase(repo);
  47. // Act
  48. await sut.ExecuteAsync("sys1", "sata", 500);
  49. // Assert
  50. Assert.NotNull(system.Drives);
  51. Assert.Single(system.Drives);
  52. await repo.Received(1).UpdateAsync(Arg.Is<SystemResource>(s =>
  53. s.Drives != null &&
  54. s.Drives.Count == 1 &&
  55. s.Drives[0].Type == "sata"
  56. ));
  57. }
  58. [Fact]
  59. public async Task ExecuteAsync_Throws_when_system_not_found()
  60. {
  61. // Arrange
  62. var repo = Substitute.For<ISystemRepository>();
  63. repo.GetByNameAsync("sys1").Returns((SystemResource?)null);
  64. var sut = new AddSystemDriveUseCase(repo);
  65. // Act + Assert
  66. await Assert.ThrowsAsync<NotFoundException>(() =>
  67. sut.ExecuteAsync("sys1", "ssd", 512)
  68. );
  69. }
  70. [Fact]
  71. public async Task ExecuteAsync_Throws_when_drive_already_exists()
  72. {
  73. // Arrange
  74. var repo = Substitute.For<ISystemRepository>();
  75. var system = new SystemResource
  76. {
  77. Name = "sys1",
  78. Drives = new List<Drive> { new() { Type = "ssd", Size = 256 } }
  79. };
  80. repo.GetByNameAsync("sys1").Returns(system);
  81. var sut = new AddSystemDriveUseCase(repo);
  82. // Act + Assert
  83. await Assert.ThrowsAsync<ConflictException>(() =>
  84. sut.ExecuteAsync("sys1", "ssd", 512)
  85. );
  86. }
  87. [Fact]
  88. public async Task ExecuteAsync_Throws_when_type_invalid()
  89. {
  90. var repo = Substitute.For<ISystemRepository>();
  91. var sut = new AddSystemDriveUseCase(repo);
  92. await Assert.ThrowsAsync<ValidationException>(() =>
  93. sut.ExecuteAsync("sys1", "", 512)
  94. );
  95. }
  96. [Fact]
  97. public async Task ExecuteAsync_Throws_when_size_negative()
  98. {
  99. var repo = Substitute.For<ISystemRepository>();
  100. var sut = new AddSystemDriveUseCase(repo);
  101. await Assert.ThrowsAsync<ValidationException>(() =>
  102. sut.ExecuteAsync("sys1", "ssd", -1)
  103. );
  104. }
  105. }