Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove reference data api from AdminAAN #1962

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using System.Net;
using AutoFixture.NUnit3;
using FluentAssertions;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Moq;
using SFA.DAS.AdminAan.Api.HealthCheck;
using SFA.DAS.SharedOuterApi.Configuration;
using SFA.DAS.SharedOuterApi.InnerApi.Requests;
using SFA.DAS.SharedOuterApi.Interfaces;
using SFA.DAS.Testing.AutoFixture;

namespace SFA.DAS.AdminAan.Api.UnitTests.HealthCheck;

public class EducationalOrganisationApiHealthChecksTests : HealthChecksTestsBase
{
[Test, MoqAutoData]
public async Task CheckHealthAsync_ValidQueryResult_ReturnsHealthyStatus(
[Frozen] Mock<IEducationalOrganisationApiClient<EducationalOrganisationApiConfiguration>> apiClient,
HealthCheckContext healthCheckContext,
EducationalOrganisationApiHealthCheck healthCheck,
CancellationToken cancellationToken)
{
// Arrange
apiClient
.Setup(x => x.GetResponseCode(It.IsAny<GetPingRequest>()))
.ReturnsAsync(HttpStatusCode.OK);

// Act
var actual = await healthCheck.CheckHealthAsync(healthCheckContext, cancellationToken);

// Assert
actual.Status.Should().Be(HealthStatus.Healthy);
}

[Test, MoqAutoData]
public async Task CheckHealthAsync_NotValidQueryResult_ReturnsUnHealthyStatus(
[Frozen] Mock<IEducationalOrganisationApiClient<EducationalOrganisationApiConfiguration>> apiClient,
HealthCheckContext healthCheckContext,
EducationalOrganisationApiHealthCheck healthCheck)
{
apiClient.Setup(x => x.GetResponseCode(It.IsAny<GetPingRequest>()))
.ReturnsAsync(HttpStatusCode.BadRequest);

var actual = await healthCheck.CheckHealthAsync(healthCheckContext, CancellationToken.None);

Assert.That(actual.Status, Is.EqualTo(HealthStatus.Unhealthy));
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public static IServiceCollection AddServiceRegistration(this IServiceCollection

services.AddHttpClient();
AddAanHubApiClient(services, configuration);
AddReferenceDataApiClient(services, configuration);
AddEducationalOrganisationApiClient(services, configuration);
AddLocationApiClient(services, configuration);
AddCommitmentsV2ApiClient(services, configuration);
AddCoursesApiClient(services, configuration);
Expand Down Expand Up @@ -81,22 +81,22 @@ public static IServiceCollection AddServiceHealthChecks(this IServiceCollection
services.AddHealthChecks()
.AddCheck<AanHubApiHealthCheck>(AanHubApiHealthCheck.HealthCheckResultDescription,
failureStatus: HealthStatus.Unhealthy,
tags: new[] { Ready })
tags: [Ready])
.AddCheck<CommitmentsV2InnerApiHealthCheck>(CommitmentsV2InnerApiHealthCheck.HealthCheckResultDescription,
failureStatus: HealthStatus.Unhealthy,
tags: new[] { Ready })
tags: [Ready])
.AddCheck<ApprenticeAccountsApiHealthCheck>(ApprenticeAccountsApiHealthCheck.HealthCheckResultDescription,
failureStatus: HealthStatus.Unhealthy,
tags: new[] { Ready })
tags: [Ready])
.AddCheck<CoursesApiHealthCheck>(CoursesApiHealthCheck.HealthCheckResultDescription,
failureStatus: HealthStatus.Unhealthy,
tags: new[] { Ready })
.AddCheck<ReferenceDataApiHealthCheck>(ReferenceDataApiHealthCheck.HealthCheckResultDescription,
tags: [Ready])
.AddCheck<EducationalOrganisationApiHealthCheck>(EducationalOrganisationApiHealthCheck.HealthCheckResultDescription,
failureStatus: HealthStatus.Unhealthy,
tags: new[] { Ready })
tags: [Ready])
.AddCheck<LocationsApiHealthCheck>(LocationsApiHealthCheck.HealthCheckResultDescription,
failureStatus: HealthStatus.Unhealthy,
tags: new[] { Ready });
tags: [Ready]);

return services;
}
Expand All @@ -109,13 +109,11 @@ private static void AddAanHubApiClient(IServiceCollection services, IConfigurati
services.AddRestEaseClient<IAanHubRestApiClient>(apiConfig.Url)
.AddHttpMessageHandler(() => new InnerApiAuthenticationHeaderHandler(new AzureClientCredentialHelper(), apiConfig.Identifier));
}
private static void AddReferenceDataApiClient(IServiceCollection services, IConfigurationRoot configuration)
private static void AddEducationalOrganisationApiClient(IServiceCollection services, IConfigurationRoot configuration)
{
var apiConfig = GetApiConfiguration(configuration, "ReferenceDataApiConfiguration");

services
.AddRestEaseClient<IReferenceDataApiClient>(apiConfig.Url)
.AddHttpMessageHandler(() => new InnerApiAuthenticationHeaderHandler(new AzureClientCredentialHelper(), apiConfig.Identifier));
services.Configure<EducationalOrganisationApiConfiguration>(configuration.GetSection(nameof(EducationalOrganisationApiConfiguration)));
services.AddSingleton(cfg => cfg.GetService<IOptions<EducationalOrganisationApiConfiguration>>().Value);
services.AddTransient<IEducationalOrganisationApiClient<EducationalOrganisationApiConfiguration>, EducationalOrganisationApiClient>();
}

private static void AddLocationApiClient(IServiceCollection services, IConfiguration configuration)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,13 @@

namespace SFA.DAS.AdminAan.Api.HealthCheck;

public class CoursesApiHealthCheck : IHealthCheck
public class CoursesApiHealthCheck(ICoursesApiClient coursesApiClient) : IHealthCheck
{
public const string HealthCheckResultDescription = "Courses API Health Check";

private readonly ICoursesApiClient _coursesApiClient;

public CoursesApiHealthCheck(ICoursesApiClient coursesApiClient)
{
_coursesApiClient = coursesApiClient;
}

public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = new())
{
var response = await _coursesApiClient.GetHealth(cancellationToken);
var response = await coursesApiClient.GetHealth(cancellationToken);
return response.IsSuccessStatusCode
? HealthCheckResult.Healthy(HealthCheckResultDescription)
: HealthCheckResult.Unhealthy(HealthCheckResultDescription);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Microsoft.Extensions.Diagnostics.HealthChecks;
using SFA.DAS.SharedOuterApi.Configuration;
using SFA.DAS.SharedOuterApi.Infrastructure.HealthCheck;
using SFA.DAS.SharedOuterApi.Interfaces;

namespace SFA.DAS.AdminAan.Api.HealthCheck;

public class EducationalOrganisationApiHealthCheck(
IEducationalOrganisationApiClient<EducationalOrganisationApiConfiguration> apiClient,
ILogger<EducationalOrganisationApiHealthCheck> logger)
: ApiHealthCheck<EducationalOrganisationApiConfiguration>(HealthCheckDescription, HealthCheckResultDescription,
apiClient, logger), IHealthCheck
{
private static readonly string HealthCheckDescription = "Educational Organisations API";
public static string HealthCheckResultDescription => $"{HealthCheckDescription} check";
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
using AutoFixture;
using System.Net;
using AutoFixture;
using FluentAssertions;
using Moq;
using RestEase;
using SFA.DAS.AdminAan.Application.CalendarEvents.Queries.GetCalendarEvent;
using SFA.DAS.AdminAan.Application.Regions.Queries.GetRegions;
using SFA.DAS.AdminAan.Application.Schools.Queries;
using SFA.DAS.AdminAan.Domain.InnerApi.AanHubApi.Responses;
using SFA.DAS.AdminAan.Infrastructure;
using SFA.DAS.SharedOuterApi.Configuration;
using SFA.DAS.SharedOuterApi.InnerApi.Requests.EducationalOrganisations;
using SFA.DAS.SharedOuterApi.InnerApi.Responses.EducationalOrganisation;
using SFA.DAS.SharedOuterApi.Interfaces;
using SFA.DAS.SharedOuterApi.Models;

namespace SFA.DAS.AdminAan.UnitTests.Application.CalendarEvents.Queries.GetCalendarEvent;

Expand All @@ -23,9 +28,9 @@ public async Task Handle_ReturnCalendarEvents_WithRegionName(int? regionId, stri
{
var fixture = new Fixture();

var cancellationToken = new CancellationToken();
var cancellationToken = CancellationToken.None;
var aanHubRestApiClientMock = new Mock<IAanHubRestApiClient>();
var referenceDataApiClient = new Mock<IReferenceDataApiClient>();
var educationalOrgsApiClientMock = new Mock<IEducationalOrganisationApiClient<EducationalOrganisationApiConfiguration>>();
var apiResponse = fixture.Create<GetCalendarEventByIdApiResponse>();
var requestedByMemberId = Guid.NewGuid();
var calendarEventId = Guid.NewGuid();
Expand All @@ -44,7 +49,7 @@ public async Task Handle_ReturnCalendarEvents_WithRegionName(int? regionId, stri
aanHubRestApiClientMock.Setup(x => x.GetCalendarEvent(requestedByMemberId, calendarEventId, cancellationToken))
.ReturnsAsync(apiResponse);

var handler = new GetCalendarEventQueryHandler(aanHubRestApiClientMock.Object, referenceDataApiClient.Object);
var handler = new GetCalendarEventQueryHandler(aanHubRestApiClientMock.Object, educationalOrgsApiClientMock.Object);
var query = new GetCalendarEventQuery(requestedByMemberId, calendarEventId);

var actual = await handler.Handle(query, cancellationToken);
Expand All @@ -53,7 +58,8 @@ public async Task Handle_ReturnCalendarEvents_WithRegionName(int? regionId, stri
var callCount = regionId == null ? 0 : 1;
aanHubRestApiClientMock.Verify(x => x.GetRegions(cancellationToken), Times.Exactly(callCount));
aanHubRestApiClientMock.Verify(x => x.GetCalendarEvent(requestedByMemberId, calendarEventId, cancellationToken), Times.Once);
referenceDataApiClient.Verify(x => x.GetSchoolFromUrn(It.IsAny<string>(), It.IsAny<int>(), It.IsAny<CancellationToken>()), Times.Never);
educationalOrgsApiClientMock
.Verify(x => x.GetWithResponseCode<GetLatestDetailsForEducationalOrgResponse>(It.IsAny<GetLatestDetailsForEducationalOrgRequest>()), Times.Never);
}

[TestCase(null, null, false)]
Expand All @@ -64,10 +70,10 @@ public async Task Handle_ReturnCalendarEvents_WithSchoolName(long? urn, string?
var fixture = new Fixture();

const int OrganisationEducationType = 4;
var cancellationToken = new CancellationToken();
var cancellationToken = CancellationToken.None;
var aanHubRestApiClientMock = new Mock<IAanHubRestApiClient>();
var apiResponse = fixture.Create<GetCalendarEventByIdApiResponse>();
var referenceDataApiClient = new Mock<IReferenceDataApiClient>();
var educationalOrgsApiClientMock = new Mock<IEducationalOrganisationApiClient<EducationalOrganisationApiConfiguration>>();
var requestedByMemberId = Guid.NewGuid();
var calendarEventId = Guid.NewGuid();

Expand All @@ -82,30 +88,39 @@ public async Task Handle_ReturnCalendarEvents_WithSchoolName(long? urn, string?
{
var schoolResult = new GetSchoolApiResult(schoolName!);

var status = System.Net.HttpStatusCode.OK;
var status = HttpStatusCode.OK;
if (schoolApiReturnsBadRequest)
{
status = System.Net.HttpStatusCode.BadRequest;
status = HttpStatusCode.BadRequest;
}

var response = new Response<GetSchoolApiResult>(
"not used",
new HttpResponseMessage(status),
() => schoolResult);

referenceDataApiClient.Setup(x => x.GetSchoolFromUrn(urn.Value.ToString(), OrganisationEducationType, cancellationToken))
.ReturnsAsync(response);
var response = new ApiResponse<GetLatestDetailsForEducationalOrgResponse>(
new GetLatestDetailsForEducationalOrgResponse
{
EducationalOrganisation = new()
{
Name = schoolName!
}
},
status,
string.Empty);

educationalOrgsApiClientMock
.Setup(x => x.GetWithResponseCode<GetLatestDetailsForEducationalOrgResponse>(
It.Is<GetLatestDetailsForEducationalOrgRequest>(x => x.Identifier == urn.Value.ToString())))
.ReturnsAsync(response)
.Verifiable();
}

var handler = new GetCalendarEventQueryHandler(aanHubRestApiClientMock.Object, referenceDataApiClient.Object);
var handler = new GetCalendarEventQueryHandler(aanHubRestApiClientMock.Object, educationalOrgsApiClientMock.Object);
var query = new GetCalendarEventQuery(requestedByMemberId, calendarEventId);

var actual = await handler.Handle(query, cancellationToken);
actual.Should().BeEquivalentTo(apiResponse, options => options.ExcludingMissingMembers());
actual?.SchoolName.Should().Be(schoolName);
actual.SchoolName.Should().Be(schoolName);
aanHubRestApiClientMock.Verify(x => x.GetRegions(cancellationToken), Times.Never);
aanHubRestApiClientMock.Verify(x => x.GetCalendarEvent(requestedByMemberId, calendarEventId, cancellationToken), Times.Once);
var callCount = urn == null ? 0 : 1;
referenceDataApiClient.Verify(x => x.GetSchoolFromUrn(It.IsAny<string>(), OrganisationEducationType, cancellationToken), Times.Exactly(callCount));
educationalOrgsApiClientMock.Verify();
educationalOrgsApiClientMock.VerifyNoOtherCalls();
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
using MediatR;
using SFA.DAS.AdminAan.Infrastructure;
using SFA.DAS.SharedOuterApi.Configuration;
using SFA.DAS.SharedOuterApi.InnerApi.Requests.EducationalOrganisations;
using SFA.DAS.SharedOuterApi.InnerApi.Responses.EducationalOrganisation;
using SFA.DAS.SharedOuterApi.Interfaces;
using static SFA.DAS.AdminAan.Application.CalendarEvents.Queries.GetCalendarEvent.GetCalendarEventQueryResult;

namespace SFA.DAS.AdminAan.Application.CalendarEvents.Queries.GetCalendarEvent;
public class GetCalendarEventQueryHandler(IAanHubRestApiClient apiClient, IReferenceDataApiClient apiReferenceDataApiClient)
public class GetCalendarEventQueryHandler(IAanHubRestApiClient apiClient, IEducationalOrganisationApiClient<EducationalOrganisationApiConfiguration> educationalOrganisationApiClient)
: IRequestHandler<GetCalendarEventQuery, GetCalendarEventQueryResult>
{
private const int OrganisationTypeEducational = 4;

public async Task<GetCalendarEventQueryResult> Handle(GetCalendarEventQuery request, CancellationToken cancellationToken)
{
var apiResponse = await apiClient.GetCalendarEvent(request.RequestedByMemberId, request.CalendarEventId, cancellationToken);
Expand Down Expand Up @@ -49,12 +51,13 @@ public async Task<GetCalendarEventQueryResult> Handle(GetCalendarEventQuery requ

if (string.IsNullOrEmpty(result.Urn.ToString())) return result;

var response = await apiReferenceDataApiClient.GetSchoolFromUrn(result.Urn.ToString()!,
OrganisationTypeEducational, cancellationToken);
var response =
await educationalOrganisationApiClient.GetWithResponseCode<GetLatestDetailsForEducationalOrgResponse>(
new GetLatestDetailsForEducationalOrgRequest(identifier: result.Urn.ToString()));

if (response.ResponseMessage.StatusCode == System.Net.HttpStatusCode.OK)
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
result.SchoolName = response.GetContent().Name;
result.SchoolName = response.Body.EducationalOrganisation.Name;
}

return result;
Expand Down

This file was deleted.

Loading