using System; using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using MesaFabApproval.Client.Services; using MesaFabApproval.Shared.Models; using Microsoft.Extensions.Caching.Memory; using Moq; using Moq.Protected; using Xunit; namespace MesaFabApproval.Client.Test; public class ApprovalServiceTests { private readonly Mock _cacheMock; private readonly Mock _httpClientFactoryMock; private readonly ApprovalService _approvalService; public ApprovalServiceTests() { _cacheMock = new Mock(); _httpClientFactoryMock = new Mock(); _approvalService = new ApprovalService(_cacheMock.Object, _httpClientFactoryMock.Object); } [Fact] public async Task DeleteApproval_ValidApprovalID_DeletesApproval() { int approvalID = 1; Mock handlerMock = new Mock(); handlerMock .Protected() .Setup>( "SendAsync", ItExpr.Is(req => req.Method == HttpMethod.Delete), ItExpr.IsAny() ) .ReturnsAsync(new HttpResponseMessage { StatusCode = HttpStatusCode.OK, }); HttpClient httpClient = new HttpClient(handlerMock.Object) { BaseAddress = new Uri("https://localhost:5000") }; _httpClientFactoryMock.Setup(_ => _.CreateClient(It.IsAny())).Returns(httpClient); await _approvalService.DeleteApproval(approvalID); handlerMock.Protected().Verify( "SendAsync", Times.Once(), ItExpr.Is(req => req.Method == HttpMethod.Delete), ItExpr.IsAny() ); } [Fact] public async Task DeleteApproval_InvalidApprovalID_ThrowsArgumentException() { int approvalID = 0; await Assert.ThrowsAsync(() => _approvalService.DeleteApproval(approvalID)); } [Fact] public async Task DeleteApproval_DeletionFails_ThrowsException() { int approvalID = 1; Mock handlerMock = new Mock(); handlerMock .Protected() .Setup>( "SendAsync", ItExpr.Is(req => req.Method == HttpMethod.Delete), ItExpr.IsAny() ) .ReturnsAsync(new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = "Bad Request" }); HttpClient httpClient = new HttpClient(handlerMock.Object) { BaseAddress = new Uri("https://localhost:5000") }; _httpClientFactoryMock.Setup(_ => _.CreateClient(It.IsAny())).Returns(httpClient); await Assert.ThrowsAsync(() => _approvalService.DeleteApproval(approvalID)); } }