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

Appman 906 call companies house #1529

Open
wants to merge 4 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
Expand Up @@ -3,6 +3,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using SFA.DAS.Api.Common.Configuration;
using SFA.DAS.EmployerAccounts.Configuration;
using SFA.DAS.SharedOuterApi.Configuration;

namespace SFA.DAS.EmployerAccounts.Api.AppStart;
Expand Down Expand Up @@ -35,5 +36,7 @@ public static void AddConfigurationOptions(this IServiceCollection services, ICo
services.AddSingleton(cfg => cfg.GetService<IOptions<EducationalOrganisationApiConfiguration>>().Value);
services.Configure<PublicSectorOrganisationApiConfiguration>(configuration.GetSection(nameof(PublicSectorOrganisationApiConfiguration)));
services.AddSingleton(cfg => cfg.GetService<IOptions<PublicSectorOrganisationApiConfiguration>>().Value);
services.Configure<CompaniesHouseApiConfiguration>(configuration.GetSection(nameof(CompaniesHouseApiConfiguration)));
services.AddSingleton(cfg => cfg.GetService<IOptions<CompaniesHouseApiConfiguration>>().Value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
using Microsoft.Extensions.DependencyInjection;
using SFA.DAS.Api.Common.Infrastructure;
using SFA.DAS.Api.Common.Interfaces;
using SFA.DAS.EmployerAccounts.Configuration;
using SFA.DAS.EmployerAccounts.ExternalApi;
using SFA.DAS.EmployerAccounts.Strategies;
using SFA.DAS.SharedOuterApi.Configuration;
using SFA.DAS.SharedOuterApi.Infrastructure;
Expand Down Expand Up @@ -34,6 +36,7 @@ public static void AddServiceRegistration(this IServiceCollection services)
services.AddTransient<IReferenceDataApiClient<ReferenceDataApiConfiguration>, ReferenceDataApiClient>();
services.AddTransient<IEducationalOrganisationApiClient<EducationalOrganisationApiConfiguration>, EducationalOrganisationApiClient>();
services.AddTransient<IPublicSectorOrganisationApiClient<PublicSectorOrganisationApiConfiguration>, PublicSectorOrganisationApiClient>();
services.AddTransient<ICompaniesHouseApiClient<CompaniesHouseApiConfiguration>, CompaniesHouseApiClient<CompaniesHouseApiConfiguration>>();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using AutoFixture.NUnit3;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using SFA.DAS.EmployerAccounts.Application.Queries.SearchOrganisations;
using SFA.DAS.EmployerAccounts.Configuration;
using SFA.DAS.EmployerAccounts.ExternalApi;
using SFA.DAS.EmployerAccounts.ExternalApi.Requests;
using SFA.DAS.EmployerAccounts.ExternalApi.Responses;
using SFA.DAS.SharedOuterApi.Configuration;
using SFA.DAS.SharedOuterApi.InnerApi.Requests.EducationalOrganisations;
using SFA.DAS.SharedOuterApi.InnerApi.Requests.PublicSectorOrganisations;
Expand Down Expand Up @@ -73,9 +75,11 @@ public class WhenCallingHandler
[Frozen] Mock<IEducationalOrganisationApiClient<EducationalOrganisationApiConfiguration>> mockEduOrgApiClient,
[Frozen] Mock<IPublicSectorOrganisationApiClient<PublicSectorOrganisationApiConfiguration>> mockPSOrgApiClient,
[Frozen] Mock<IReferenceDataApiClient<ReferenceDataApiConfiguration>> mockRefApiClient,
[Frozen] Mock<ICompaniesHouseApiClient<CompaniesHouseApiConfiguration>> mockCompaniesHouseApi,
GetSearchOrganisationsResponse refApiOrgs,
EducationalOrganisationResponse eduOrgApiResponse,
PublicSectorOrganisationsResponse psOrgApiResponse,
SearchCompaniesResponse searchCompaniesResponse,
SearchOrganisationsQueryHandler handler)
{
var query = new SearchOrganisationsQuery
Expand All @@ -101,8 +105,105 @@ public class WhenCallingHandler
p.SearchTerm == query.SearchTerm && p.MaximumResults == query.MaximumResults)))
.ReturnsAsync(refApiOrgs);

mockCompaniesHouseApi
.Setup(client => client.Get<SearchCompaniesResponse>(It.Is<SearchCompanyInformationRequest>(p =>
p.SearchTerm == query.SearchTerm && p.MaximumResults == query.MaximumResults)))
.ReturnsAsync(searchCompaniesResponse);

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

result.Organisations.Count.Should().Be(query.MaximumResults);
}
}

[Test, MoqAutoData]
public async Task Then_Company_Number_Should_Return_One_Company(
[Frozen] Mock<IEducationalOrganisationApiClient<EducationalOrganisationApiConfiguration>> mockEduOrgApiClient,
[Frozen] Mock<IPublicSectorOrganisationApiClient<PublicSectorOrganisationApiConfiguration>> mockPSOrgApiClient,
[Frozen] Mock<IReferenceDataApiClient<ReferenceDataApiConfiguration>> mockRefApiClient,
[Frozen] Mock<ICompaniesHouseApiClient<CompaniesHouseApiConfiguration>> mockCompaniesHouseApi,
GetSearchOrganisationsResponse refApiOrgs,
GetCompanyInfoResponse companyInfoResponse,
EducationalOrganisationResponse eduOrgApiResponse,
PublicSectorOrganisationsResponse psOrgApiResponse,
SearchOrganisationsQueryHandler handler)
{
var query = new SearchOrganisationsQuery
{
SearchTerm = "AB123456",
MaximumResults = 100
};

mockEduOrgApiClient
.Setup(client => client.Get<EducationalOrganisationResponse>(
It.Is<SearchEducationalOrganisationsRequest>(p =>
p.SearchTerm == query.SearchTerm && p.MaximumResults == query.MaximumResults)))
.ReturnsAsync(eduOrgApiResponse);

mockPSOrgApiClient
.Setup(client =>
client.Get<PublicSectorOrganisationsResponse>(
It.Is<SearchPublicSectorOrganisationsRequest>(p => p.SearchTerm == query.SearchTerm)))
.ReturnsAsync(psOrgApiResponse);

mockRefApiClient
.Setup(client => client.Get<GetSearchOrganisationsResponse>(It.Is<GetSearchOrganisationsRequest>(p =>
p.SearchTerm == query.SearchTerm && p.MaximumResults == query.MaximumResults)))
.ReturnsAsync(refApiOrgs);

mockCompaniesHouseApi
.Setup(client => client.Get<GetCompanyInfoResponse>(It.Is<GetCompanyInformationRequest>(p =>
p.Id == query.SearchTerm)))
.ReturnsAsync(companyInfoResponse);

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

result.Organisations.Where(x => x.Type == OrganisationType.Company).Count().Should().Be(1);
}


[Test, MoqAutoData]
public async Task Then_StringSearchTerm_Should_Search_For_Multiple_Companies(
[Frozen] Mock<IEducationalOrganisationApiClient<EducationalOrganisationApiConfiguration>> mockEduOrgApiClient,
[Frozen] Mock<IPublicSectorOrganisationApiClient<PublicSectorOrganisationApiConfiguration>> mockPSOrgApiClient,
[Frozen] Mock<IReferenceDataApiClient<ReferenceDataApiConfiguration>> mockRefApiClient,
[Frozen] Mock<ICompaniesHouseApiClient<CompaniesHouseApiConfiguration>> mockCompaniesHouseApi,
GetSearchOrganisationsResponse refApiOrgs,
EducationalOrganisationResponse eduOrgApiResponse,
PublicSectorOrganisationsResponse psOrgApiResponse,
SearchCompaniesResponse searchCompaniesResponse,
SearchOrganisationsQueryHandler handler)
{
var query = new SearchOrganisationsQuery
{
SearchTerm = "Organisation Name",
MaximumResults = 100
};

mockEduOrgApiClient
.Setup(client => client.Get<EducationalOrganisationResponse>(
It.Is<SearchEducationalOrganisationsRequest>(p =>
p.SearchTerm == query.SearchTerm && p.MaximumResults == query.MaximumResults)))
.ReturnsAsync(eduOrgApiResponse);

mockPSOrgApiClient
.Setup(client =>
client.Get<PublicSectorOrganisationsResponse>(
It.Is<SearchPublicSectorOrganisationsRequest>(p => p.SearchTerm == query.SearchTerm)))
.ReturnsAsync(psOrgApiResponse);

mockRefApiClient
.Setup(client => client.Get<GetSearchOrganisationsResponse>(It.Is<GetSearchOrganisationsRequest>(p =>
p.SearchTerm == query.SearchTerm && p.MaximumResults == query.MaximumResults)))
.ReturnsAsync(refApiOrgs);

mockCompaniesHouseApi
.Setup(client => client.Get<SearchCompaniesResponse>(It.Is<SearchCompanyInformationRequest>(p =>
p.SearchTerm == query.SearchTerm.ToUpper()
&& p.MaximumResults == query.MaximumResults)))
.ReturnsAsync(searchCompaniesResponse);

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

result.Organisations.Where(x => x.Type == OrganisationType.Company).Count().Should().Be(searchCompaniesResponse.Companies.Count());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using AutoFixture.NUnit3;
using FluentAssertions;
using NUnit.Framework;
using SFA.DAS.EmployerAccounts.ExternalApi.Requests;

namespace SFA.DAS.EmployerAccounts.UnitTests.ExternalApi.Requests
{
public class WhenBuildingGetCompanyInformationRequest
{
[Test, AutoData]
public void Then_The_Request_Is_Correctly_Build(string id)
{
var actual = new GetCompanyInformationRequest(id);

var expected = $"company/{id.ToUpper()}";

actual.GetUrl.Should().Be(expected);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System.Web;
using AutoFixture.NUnit3;
using FluentAssertions;
using NUnit.Framework;
using SFA.DAS.EmployerAccounts.ExternalApi.Requests;

namespace SFA.DAS.EmployerAccounts.UnitTests.ExternalApi.Requests
{
public class WhenBuildingSearchCompanyInformationRequest
{
[Test, AutoData]
public void Then_The_Request_Is_Correctly_Build(string searchTerm, int maximumResults)
{
var actual = new SearchCompanyInformationRequest(searchTerm, maximumResults);

var expected = $"search/companies/?q={HttpUtility.UrlEncode(searchTerm.ToUpper())}&items_per_page={maximumResults}";

actual.GetUrl.Should().Be(expected);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using AutoFixture;
using FluentAssertions;
using NUnit.Framework;
using SFA.DAS.EmployerAccounts.Helpers;

namespace SFA.DAS.EmployerAccounts.UnitTests.Helpers
{
[TestFixture]
public class RegexHelperTests
{
private Fixture _fixture;

[SetUp]
public void SetUp()
{
_fixture = new Fixture();
}

[Test]
[TestCase("AB123456", true)]
[TestCase("12345678", true)]
[TestCase("ABCD1234", false)]
[TestCase("XY78901Z", false)]
public void CheckCompaniesHouseReference_ShouldReturnExpectedResult(string input, bool expectedResult)
{
// Act
var result = RegexHelper.CheckCompaniesHouseReference(input);

// Assert
result.Should().Be(expectedResult);
}

[Test]
public void CheckCompaniesHouseReference_ShouldReturnFalseForEmptyInput()
{
// Act
var result = RegexHelper.CheckCompaniesHouseReference(string.Empty);

// Assert
result.Should().BeFalse();
}

[Test]
public void CheckCompaniesHouseReference_ShouldReturnFalseForInvalidFormat()
{
// Arrange
var invalidInput = _fixture.Create<string>();

// Act
var result = RegexHelper.CheckCompaniesHouseReference(invalidInput);

// Assert
result.Should().BeFalse();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,35 @@ namespace SFA.DAS.EmployerAccounts.UnitTests.Strategies
{
public class OrganisationApiStrategyFactoryTests
{

[Test, MoqAutoData]
public void CreateStrategy_ShouldReturnCompaniesHouseApiStrategy_ForCompany(
OrganisationApiStrategyFactory factory)
{
var orgType = OrganisationType.Company;

// Act
var strategy = factory.CreateStrategy(orgType);

// Assert
strategy.Should().BeOfType<CompaniesHouseApiStrategy>();
}


[Test, MoqAutoData]
public void CreateStrategy_ShouldReturnReferenceDataApiStrategy_ForCompanyCharity(
public void CreateStrategy_ShouldReturnReferenceDataApiStrategy_ForCharity(
OrganisationApiStrategyFactory factory)
{
var organisationTypes = new[] { OrganisationType.Company, OrganisationType.Charity };
var orgType = OrganisationType.Charity;

foreach (var orgType in organisationTypes)
{
// Act
var strategy = factory.CreateStrategy(orgType);
// Act
var strategy = factory.CreateStrategy(orgType);

// Assert
strategy.Should().BeOfType<ReferenceDataApiStrategy>();
}
// Assert
strategy.Should().BeOfType<ReferenceDataApiStrategy>();
}


[Test, MoqAutoData]
public void CreateStrategy_ShouldReturnEducationOrganisationApiStrategy_ForEducationOrganisation(
OrganisationApiStrategyFactory factory)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using SFA.DAS.EmployerAccounts.ExternalApi.Responses;
using SFA.DAS.SharedOuterApi.InnerApi.Responses.EducationalOrganisation;
using SFA.DAS.SharedOuterApi.InnerApi.Responses.PublicSectorOrganisation;
using SFA.DAS.SharedOuterApi.InnerApi.Responses.ReferenceData;
Expand Down Expand Up @@ -90,6 +91,61 @@ public class OrganisationResult
};
}

public static implicit operator OrganisationResult(GetCompanyInfoResponse source)
{
if (source == null)
{
return null;
}

return new OrganisationResult
{
Name = source.CompanyName,
Type = OrganisationType.Company,
SubType = OrganisationSubType.None,
Code = source.CompanyNumber,
RegistrationDate = source.DateOfIncorporation,
Address = new Address
{
Line1 = source.RegisteredAddress.Line1,
Line2 = source.RegisteredAddress.Line2,
Line3 = source.RegisteredAddress.Line3,
Line4 = source.RegisteredAddress.TownOrCity,
Line5 = source.RegisteredAddress.County,
Postcode = source.RegisteredAddress.PostCode
},
Sector = null,
OrganisationStatus = MapCompanyToOrganisationStatus(source.CompanyStatus)
};
}

public static implicit operator OrganisationResult(CompanySearchResultsItem source)
{
if (source == null)
{
return null;
}

return new OrganisationResult
{
Name = source.CompanyName,
Type = OrganisationType.Company,
SubType = OrganisationSubType.None,
Code = source.CompanyNumber,
RegistrationDate = source.DateOfIncorporation,
Address = new Address
{
Line1 = source.Address.Line1,
Line2 = source.Address.Line2,
Line3 = source.Address.Line3,
Line4 = source.Address.TownOrCity,
Line5 = source.Address.County,
Postcode = source.Address.PostCode
},
Sector = null,
OrganisationStatus = MapCompanyToOrganisationStatus(source.CompanyStatus)
};
}

public static OrganisationSubType MapToOrganisationSubType(string value)
{
Expand All @@ -101,4 +157,10 @@ public static OrganisationSubType MapToOrganisationSubType(string value)
_ => OrganisationSubType.None
};
}
private static OrganisationStatus MapCompanyToOrganisationStatus(string companiesHouseStatus)
{
Enum.TryParse(companiesHouseStatus?.Replace("-", string.Empty), true, out OrganisationStatus organisationStatus);

return organisationStatus;
}
}
Loading
Loading