Skip to content

Commit

Permalink
CSP-1763: FAT Outer API endpoint GET /Courses/routes (#1907)
Browse files Browse the repository at this point in the history
* added AgreementNotSigned

* 1. In case of closed vacancy, the response object could not be cast into GetApprenticeshipVacancyItemResponse
This results in a vacancy item response as null. If the Email tokens are empty, then the email is not sent.

2.  Vacancy service => Separation of Concerns rule violation split this implementation as separate methods GetVacancy from FAA Api & Closed Vacancy from RAA Api

* Included NHS Vacancies count in the search Results

* Update SFA.DAS.FindAnApprenticeship.csproj

* Updated SFA.DAS.VacancyServices.Wage to version 1.0.35

* Saved Search Email alert Across England wording change

* added failed requests alert and updated app connection string

* WIP

* CSP-1763: Levels controller method to return levels from courses api.

---------

Co-authored-by: Paul Graham <[email protected]>
Co-authored-by: Balaji Jambulingam <[email protected]>
Co-authored-by: Liam Crossley <[email protected]>
Co-authored-by: Siji Odunlami <[email protected]>
Co-authored-by: Calum Rees <[email protected]>
Co-authored-by: harsh-dfe <[email protected]>
Co-authored-by: Calum Rees <[email protected]>
Co-authored-by: Najam Muhammad <[email protected]>
  • Loading branch information
9 people authored Jan 28, 2025
1 parent 39adda2 commit 3448f43
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Moq;
using NUnit.Framework;
using SFA.DAS.FindApprenticeshipTraining.Api.Controllers;
using SFA.DAS.FindApprenticeshipTraining.Application.Courses.Queries.GetCourseRoutes;
using SFA.DAS.SharedOuterApi.InnerApi.Responses;
using SFA.DAS.Testing.AutoFixture;
using System.Net;
using System.Threading;
using System.Threading.Tasks;

namespace SFA.DAS.FindApprenticeshipTraining.Api.UnitTests.Controllers.Courses;

public sealed class WhenQueryingCourseRoutes
{
[Test]
[MoqAutoData]
public async Task Then_Passes_Query_To_Mediator_And_Returns_Routes(
GetRoutesListResponse expectedResponse
)
{
Mock<IMediator> mockMediator = new Mock<IMediator>();
mockMediator
.Setup(mediator => mediator.Send(
It.IsAny<GetCourseRoutesQuery>(),
It.IsAny<CancellationToken>()
))
.ReturnsAsync(expectedResponse);

var sut = new CoursesController(mockMediator.Object);

var result = await sut.GetCourseRoutes() as ObjectResult;

Assert.Multiple(() =>
{
Assert.That(result, Is.Not.Null);
Assert.That(result.StatusCode, Is.EqualTo((int)HttpStatusCode.OK));

var model = result.Value as GetRoutesListResponse;
Assert.That(model, Is.Not.Null);
Assert.That(model, Is.EqualTo(expectedResponse));
});
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
using MediatR;
using Microsoft.AspNetCore.Mvc;
using SFA.DAS.FindApprenticeshipTraining.Application.Courses.Queries.GetCourseLevels;
using SFA.DAS.FindApprenticeshipTraining.Application.Courses.Queries.GetCourseRoutes;
using System.Threading.Tasks;

namespace SFA.DAS.FindApprenticeshipTraining.Api.Controllers;

[ApiController]
[Route("[controller]/")]
public class CoursesController(IMediator _mediator) : ControllerBase
public sealed class CoursesController(IMediator _mediator) : ControllerBase
{
[HttpGet]
[Route("levels")]
Expand All @@ -16,4 +17,12 @@ public async Task<IActionResult> GetCourseLevels()
var response = await _mediator.Send(new GetCourseLevelsQuery());
return Ok(response);
}

[HttpGet]
[Route("routes")]
public async Task<IActionResult> GetCourseRoutes()
{
var result = await _mediator.Send(new GetCourseRoutesQuery());
return Ok(result);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using AutoFixture.NUnit3;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using SFA.DAS.FindApprenticeshipTraining.Application.Courses.Queries.GetCourseRoutes;
using SFA.DAS.SharedOuterApi.Configuration;
using SFA.DAS.SharedOuterApi.InnerApi.Requests;
using SFA.DAS.SharedOuterApi.InnerApi.Responses;
using SFA.DAS.SharedOuterApi.Interfaces;
using SFA.DAS.Testing.AutoFixture;
using System.Threading;
using System.Threading.Tasks;

namespace SFA.DAS.FindApprenticeshipTraining.UnitTests.Application.Courses.Queries.GetCourseRoutes;

public sealed class WhenGettingCourseRoutes
{
[Test]
[MoqAutoData]
public async Task Then_Gets_Routes_From_Courses_Api(
GetCourseRoutesQuery query,
GetRoutesListResponse response,
[Frozen] Mock<ICoursesApiClient<CoursesApiConfiguration>> _mockCoursesApiClient,
GetCourseRoutesQueryHandler sut
)
{
_mockCoursesApiClient.Setup(client =>
client.Get<GetRoutesListResponse>(
It.IsAny<GetRoutesListRequest>()
)
)
.ReturnsAsync(response);

var result = await sut.Handle(query, CancellationToken.None);

result.Routes.Should().Equal(response.Routes);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
using MediatR;
using SFA.DAS.SharedOuterApi.InnerApi.Responses;

namespace SFA.DAS.FindApprenticeshipTraining.Application.Courses.Queries.GetCourseRoutes;

public sealed class GetCourseRoutesQuery : IRequest<GetRoutesListResponse>;
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using MediatR;
using SFA.DAS.SharedOuterApi.Configuration;
using SFA.DAS.SharedOuterApi.InnerApi.Requests;
using SFA.DAS.SharedOuterApi.InnerApi.Responses;
using SFA.DAS.SharedOuterApi.Interfaces;
using System.Threading;
using System.Threading.Tasks;

namespace SFA.DAS.FindApprenticeshipTraining.Application.Courses.Queries.GetCourseRoutes;

public sealed class GetCourseRoutesQueryHandler(ICoursesApiClient<CoursesApiConfiguration> _coursesApiClient) : IRequestHandler<GetCourseRoutesQuery, GetRoutesListResponse>
{
public async Task<GetRoutesListResponse> Handle(GetCourseRoutesQuery request, CancellationToken cancellationToken)
{
return await _coursesApiClient.Get<GetRoutesListResponse>(new GetRoutesListRequest());
}
}

0 comments on commit 3448f43

Please sign in to comment.