Wednesday, May 7, 2025

Act Arrnage

using Xunit;

using FakeItEasy;

using System.Net;

using System.Net.Http;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

using Microsoft.Xrm.Sdk;


public class CaspServiceTests

{

    private readonly IDataAccessEnvironmentVariables _envVarMock;

    private readonly ISystemConfigurationService _configServiceMock;

    private readonly ITraceLogger _loggerMock;

    private readonly IHttpClientFactoryWrapper _httpFactoryMock;


    private readonly CaspService _service;


    public CaspServiceTests()

    {

        _envVarMock = A.Fake<IDataAccessEnvironmentVariables>();

        _configServiceMock = A.Fake<ISystemConfigurationService>();

        _loggerMock = A.Fake<ITraceLogger>();

        _httpFactoryMock = A.Fake<IHttpClientFactoryWrapper>();


        _service = new CaspService(

            _envVarMock,

            _configServiceMock,

            _loggerMock,

            _httpFactoryMock

        );

    }


    private HttpClient CreateFakeHttpClient(HttpResponseMessage responseMessage)

    {

        var fakeHandler = A.Fake<HttpMessageHandler>();


        A.CallTo(() => fakeHandler.Send(

            A<HttpRequestMessage>._,

            A<CancellationToken>._))

            .Returns(responseMessage);


        return new HttpClient(fakeHandler);

    }


    [Fact]

    public void GetCaspMedicalData_ShouldThrow_WhenUrlIsMissing()

    {

        // Arrange

        A.CallTo(() => _envVarMock

            .GetEnvironmentVariableValueByDefinitionSchemaName(A<string>._))

            .Returns(null);


        // Act & Assert

        Assert.Throws<InvalidPluginExecutionException>(() =>

            _service.GetCaspMedicalData("123", "DLN456"));

    }


    [Fact]

    public void GetCaspMedicalData_ShouldReturnResponse_WhenSuccessful()

    {

        // Arrange

        var expectedJson = "{\"status\":\"success\"}";

        var fakeHttpResponse = new HttpResponseMessage(HttpStatusCode.OK)

        {

            Content = new StringContent(expectedJson, Encoding.UTF8, "application/json")

        };


        A.CallTo(() => _envVarMock

            .GetEnvironmentVariableValueByDefinitionSchemaName(A<string>._))

            .Returns(new Entity { ["value"] = "https://fake.url.com" });


        A.CallTo(() => _configServiceMock.RetrievePFXSystemConfigRecord())

            .Returns(new Entity("pfx_config"));


        A.CallTo(() => _httpFactoryMock.CreateClient(A<Entity>._))

            .Returns(CreateFakeHttpClient(fakeHttpResponse));


        // Act

        var result = _service.GetCaspMedicalData("123", "DLN456");


        // Assert

        Assert.Equal(expectedJson, result);

    }


    [Fact]

    public void GetCaspMedicalData_ShouldThrow_WhenHttpReturnsNotFound()

    {

        // Arrange

        var response = new HttpResponseMessage(HttpStatusCode.NotFound);


        A.CallTo(() => _envVarMock

            .GetEnvironmentVariableValueByDefinitionSchemaName(A<string>._))

            .Returns(new Entity { ["value"] = "https://fake.url.com" });


        A.CallTo(() => _configServiceMock.RetrievePFXSystemConfigRecord())

            .Returns(new Entity("pfx_config"));


        A.CallTo(() => _httpFactoryMock.CreateClient(A<Entity>._))

            .Returns(CreateFakeHttpClient(response));


        // Act & Assert

        Assert.Throws<HttpRequestException>(() =>

            _service.GetCaspMedicalData("123", "DLN456"));

    }


    [Fact]

    public void GetCaspMedicalData_ShouldReturnEmpty_WhenInternalServerError()

    {

        // Arrange

        var response = new HttpResponseMessage(HttpStatusCode.InternalServerError);


        A.CallTo(() => _envVarMock

            .GetEnvironmentVariableValueByDefinitionSchemaName(A<string>._))

            .Returns(new Entity { ["value"] = "https://fake.url.com" });


        A.CallTo(() => _configServiceMock.RetrievePFXSystemConfigRecord())

            .Returns(new Entity("pfx_config"));


        A.CallTo(() => _httpFactoryMock.CreateClient(A<Entity>._))

            .Returns(CreateFakeHttpClient(response));


        // Act

        var result = _service.GetCaspMedicalData("123", "DLN456");


        // Assert

        Assert.Equal(string.Empty, result);

    }


    [Fact]

    public void GetCaspMedicalData_ShouldLogAndThrow_WhenUnhandledExceptionOccurs()

    {

        // Arrange

        A.CallTo(() => _envVarMock

            .GetEnvironmentVariableValueByDefinitionSchemaName(A<string>._))

            .Returns(new Entity { ["value"] = "https://fake.url.com" });


        A.CallTo(() => _configServiceMock.RetrievePFXSystemConfigRecord())

            .Returns(new Entity("pfx_config"));


        A.CallTo(() => _httpFactoryMock.CreateClient(A<Entity>._))

            .Throws(new Exception("Unexpected failure"));


        // Act & Assert

        Assert.Throws<Exception>(() =>

            _service.GetCaspMedicalData("123", "DLN456"));


        A.CallTo(() => _loggerMock

            .Error(A<string>._, A<string>._, A<Exception>._))

            .MustHaveHappenedOnceExactly();

    }

}


No comments:

Post a Comment