AddLabelUseCaseTests.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using NSubstitute;
  2. using RackPeek.Domain.Helpers;
  3. using RackPeek.Domain.Persistence;
  4. using RackPeek.Domain.Resources;
  5. using RackPeek.Domain.Resources.Servers;
  6. using RackPeek.Domain.UseCases.Labels;
  7. namespace Tests.Unit.UseCases.Labels;
  8. public class AddLabelUseCaseTests
  9. {
  10. private readonly IResourceCollection _repo = Substitute.For<IResourceCollection>();
  11. [Fact]
  12. public async Task execute_async__new_label__sets_key_value_and_updates()
  13. {
  14. // Arrange
  15. var server = new Server { Name = "db-01", Labels = new() };
  16. _repo.GetByNameAsync("db-01").Returns(server);
  17. var sut = new AddLabelUseCase<Server>(_repo);
  18. // Act
  19. await sut.ExecuteAsync("db-01", "env", "production");
  20. // Assert
  21. Assert.Equal("production", server.Labels["env"]);
  22. await _repo.Received(1).UpdateAsync(server);
  23. }
  24. [Fact]
  25. public async Task execute_async__existing_key__overwrites_value()
  26. {
  27. // Arrange
  28. var server = new Server
  29. {
  30. Name = "db-01",
  31. Labels = new() { ["env"] = "staging" }
  32. };
  33. _repo.GetByNameAsync("db-01").Returns(server);
  34. var sut = new AddLabelUseCase<Server>(_repo);
  35. // Act
  36. await sut.ExecuteAsync("db-01", "env", "production");
  37. // Assert
  38. Assert.Equal("production", server.Labels["env"]);
  39. }
  40. [Fact]
  41. public async Task execute_async__nonexistent_resource__throws_not_found()
  42. {
  43. // Arrange
  44. _repo.GetByNameAsync("ghost").Returns((Resource?)null);
  45. var sut = new AddLabelUseCase<Server>(_repo);
  46. // Act & Assert
  47. var ex = await Assert.ThrowsAsync<NotFoundException>(
  48. () => sut.ExecuteAsync("ghost", "env", "production"));
  49. Assert.Contains("ghost", ex.Message);
  50. await _repo.DidNotReceive().UpdateAsync(Arg.Any<Resource>());
  51. }
  52. }