Skip to content

Commit

Permalink
Add support for communes and refactor to generic classification codel…
Browse files Browse the repository at this point in the history
…ist provider.
  • Loading branch information
Ronny Birkeli committed Mar 4, 2023
1 parent ad6a6cd commit 2972897
Show file tree
Hide file tree
Showing 17 changed files with 4,016 additions and 158 deletions.
15 changes: 10 additions & 5 deletions src/Altinn.Codelists/SSB/ClassificationCodelistProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,32 @@ namespace Altinn.Codelists.SSB;
/// <summary>
/// Base class providing functions for getting codelist.
/// </summary>
public abstract class ClassificationCodelistProvider
public class ClassificationCodelistProvider : IAppOptionsProvider
{
private readonly IClassificationsClient _classificationsClient;
private readonly Classification _classification;

/// <summary>
/// Initializes a new instance of the <see cref="ClassificationCodelistProvider"/> class.
/// </summary>
/// <param name="classificationsClient"></param>
protected ClassificationCodelistProvider(IClassificationsClient classificationsClient)
public ClassificationCodelistProvider(string id, Classification classification, IClassificationsClient classificationsClient)
{
Id = id;
_classification = classification;
_classificationsClient = classificationsClient;
}

/// <inheritdoc/>
public string Id { get; private set; }

/// Gets the <see cref="AppOptions"/> based on the provided classification, options id and key value pairs.
protected async Task<AppOptions> GetAppOptionsAsync(Classification classification, string language, Dictionary<string, string> keyValuePairs)
public async Task<AppOptions> GetAppOptionsAsync(string language, Dictionary<string, string> keyValuePairs)
{
string? date = keyValuePairs.GetValueOrDefault("date");
DateOnly dateOnly = date == null ? DateOnly.FromDateTime(DateTime.Today) : DateOnly.Parse(date);
string level = keyValuePairs.GetValueOrDefault("level") ?? string.Empty;

var classificationCode = await _classificationsClient.GetClassificationCodes(classification, language, dateOnly, level);
var classificationCode = await _classificationsClient.GetClassificationCodes(_classification, language, dateOnly, level);

string parentCode = keyValuePairs.GetValueOrDefault("parentCode") ?? string.Empty;
var appOptions = new AppOptions();
Expand Down
27 changes: 0 additions & 27 deletions src/Altinn.Codelists/SSB/CountiesCodelistProvider.cs

This file was deleted.

27 changes: 0 additions & 27 deletions src/Altinn.Codelists/SSB/CountriesCodelistProvider.cs

This file was deleted.

27 changes: 22 additions & 5 deletions src/Altinn.Codelists/SSB/Extensions/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using Altinn.App.Core.Features;
using Altinn.Codelists.SSB.Clients;
using Altinn.Codelists.SSB.Models;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;

namespace Altinn.Codelists.SSB.Extensions;
Expand All @@ -17,11 +19,26 @@ public static IServiceCollection AddSSBClassifications(this IServiceCollection s
services.AddOptions<ClassificationSettings>();
services.AddHttpClient<IClassificationsClient, ClassificationsHttpClient>();

services.AddTransient<IAppOptionsProvider, MaritalStatusCodelistProvider>();
services.AddTransient<IAppOptionsProvider, IndustryGroupingCodelistProvider>();
services.AddTransient<IAppOptionsProvider, SexCodelistProvider>();
services.AddTransient<IAppOptionsProvider, CountiesCodelistProvider>();
services.AddTransient<IAppOptionsProvider, CountriesCodelistProvider>();
services.AddSSBClassificationCodelistProvider("sivilstand", Classification.MaritalStatus);
services.AddSSBClassificationCodelistProvider("næringsgruppering", Classification.IndustryGrouping);
services.AddSSBClassificationCodelistProvider("kjønn", Classification.Sex);
services.AddSSBClassificationCodelistProvider("kommuner", Classification.Communes);
services.AddSSBClassificationCodelistProvider("fylker", Classification.Counties);
services.AddSSBClassificationCodelistProvider("land", Classification.Countries);

return services;
}

/// <summary>
/// Adds the specified <see cref="Classification"/> as an <see cref="IAppOptionsProvider"/> with the specified id.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add to</param>
/// <param name="id">The codelist id</param>
/// <param name="classification">The <see cref="Classification"/> to return</param>
/// <returns></returns>
public static IServiceCollection AddSSBClassificationCodelistProvider(this IServiceCollection services, string id, Classification classification)
{
services.AddTransient<IAppOptionsProvider>(sp => new ClassificationCodelistProvider(id, classification, sp.GetRequiredService<IClassificationsClient>()));

return services;
}
Expand Down
27 changes: 0 additions & 27 deletions src/Altinn.Codelists/SSB/IndustryGroupingCodelistProvider.cs

This file was deleted.

27 changes: 0 additions & 27 deletions src/Altinn.Codelists/SSB/MaritalStatusCodelistProvider.cs

This file was deleted.

5 changes: 5 additions & 0 deletions src/Altinn.Codelists/SSB/Models/Classification.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ public enum Classification
/// </summary>
Counties = 104,

/// <summary>
/// Standard for kommuner
/// </summary>
Communes = 131,

/// <summary>
/// Standard for landkoder (alfa-3)
/// </summary>
Expand Down
27 changes: 0 additions & 27 deletions src/Altinn.Codelists/SSB/SexCodelistProvider.cs

This file was deleted.

2 changes: 2 additions & 0 deletions test/Altinn.Codelists.Tests/Altinn.Codelists.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<None Remove="Kartverket\AdministrativeUnits\Testdata\fylke46_kommuner.json" />
<None Remove="Kartverket\AdministrativeUnits\Testdata\fylker.json" />
<None Remove="Kartverket\AdministrativeUnits\Testdata\kommuner.json" />
<None Remove="SSB\Testdata\communes.json" />
<None Remove="SSB\Testdata\counties.json" />
<None Remove="SSB\Testdata\countries.json" />
<None Remove="SSB\Testdata\industryGrouping.json" />
Expand All @@ -22,6 +23,7 @@
<EmbeddedResource Include="Kartverket\AdministrativeUnits\Testdata\fylke46_kommuner.json" />
<EmbeddedResource Include="Kartverket\AdministrativeUnits\Testdata\fylker.json" />
<EmbeddedResource Include="Kartverket\AdministrativeUnits\Testdata\kommuner.json" />
<EmbeddedResource Include="SSB\Testdata\communes.json" />
<EmbeddedResource Include="SSB\Testdata\counties.json" />
<EmbeddedResource Include="SSB\Testdata\countries.json" />
<EmbeddedResource Include="SSB\Testdata\industryGrouping.json" />
Expand Down
22 changes: 22 additions & 0 deletions test/Altinn.Codelists.Tests/SSB/CommunesCodelistProviderTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Altinn.App.Core.Features;
using Altinn.Codelists.SSB;
using Altinn.Codelists.SSB.Clients;
using Altinn.Codelists.SSB.Models;
using Altinn.Codelists.Tests.SSB.Mocks;

namespace Altinn.Codelists.Tests.SSB;

public class CommunesCodelistProviderTests
{
[Fact]
public async Task GetAppOptionsAsync_ShouldReturnListOfCodes()
{
var httpClientMock = new ClassificationsHttpClientMock(Options.Create(new ClassificationSettings()));
IAppOptionsProvider appOptionsProvider = new ClassificationCodelistProvider("kommuner", Classification.Communes, httpClientMock);

var appOptions = await appOptionsProvider.GetAppOptionsAsync("nb", new Dictionary<string, string>());

appOptions.Options.Should().HaveCount(357);
appOptions.Options.First(x => x.Value == "4640").Label.Should().Be("Sogndal");
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
using Altinn.App.Core.Features;
using Altinn.Codelists.SSB;
using Altinn.Codelists.SSB.Clients;
using Altinn.Codelists.SSB.Models;
using Altinn.Codelists.Tests.SSB.Mocks;

namespace Altinn.Codelists.Tests.SSB;

public class CountiesStatusCodelistProviderTests
public class CountiesCodelistProviderTests
{
[Fact]
public async Task GetAppOptionsAsync_ShouldReturnListOfCodes()
{
var httpClientMock = new ClassificationsHttpClientMock(Options.Create(new ClassificationSettings()));
IAppOptionsProvider appOptionsProvider = new CountiesCodelistProvider(httpClientMock);
IAppOptionsProvider appOptionsProvider = new ClassificationCodelistProvider("fylker", Classification.Counties, httpClientMock);

var appOptions = await appOptionsProvider.GetAppOptionsAsync("nb", new Dictionary<string, string>());

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Altinn.App.Core.Features;
using Altinn.Codelists.SSB;
using Altinn.Codelists.SSB.Clients;
using Altinn.Codelists.SSB.Models;
using Altinn.Codelists.Tests.SSB.Mocks;

namespace Altinn.Codelists.Tests.SSB;
Expand All @@ -11,7 +12,7 @@ public class CountriesStatusCodelistProviderTests
public async Task GetAppOptionsAsync_ShouldReturnListOfCodes()
{
var httpClientMock = new ClassificationsHttpClientMock(Options.Create(new ClassificationSettings()));
IAppOptionsProvider appOptionsProvider = new CountriesCodelistProvider(httpClientMock);
IAppOptionsProvider appOptionsProvider = new ClassificationCodelistProvider("land", Classification.Countries, httpClientMock);

var appOptions = await appOptionsProvider.GetAppOptionsAsync("nb", new Dictionary<string, string>());

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Altinn.App.Core.Features;
using Altinn.Codelists.SSB;
using Altinn.Codelists.SSB.Clients;
using Altinn.Codelists.SSB.Models;
using Altinn.Codelists.Tests.SSB.Mocks;

namespace Altinn.Codelists.Tests.SSB;
Expand All @@ -11,7 +12,7 @@ public class IndustryGroupingCodelistProviderTests
public async Task GetAppOptionsAsync_AllLevels_ShouldReturnListOfCodes()
{
var httpClientMock = new ClassificationsHttpClientMock(Options.Create(new ClassificationSettings()));
IAppOptionsProvider appOptionsProvider = new IndustryGroupingCodelistProvider(httpClientMock);
IAppOptionsProvider appOptionsProvider = new ClassificationCodelistProvider("næringsgruppering", Classification.IndustryGrouping, httpClientMock);

var appOptions = await appOptionsProvider.GetAppOptionsAsync("nb", new Dictionary<string, string>());

Expand All @@ -25,7 +26,7 @@ public async Task GetAppOptionsAsync_AllLevels_ShouldReturnListOfCodes()
public async Task GetAppOptionsAsync_FirstLevelOnly_ShouldReturnListOfCodes()
{
var httpClientMock = new ClassificationsHttpClientMock(Options.Create(new ClassificationSettings()));
IAppOptionsProvider appOptionsProvider = new IndustryGroupingCodelistProvider(httpClientMock);
IAppOptionsProvider appOptionsProvider = new ClassificationCodelistProvider("næringsgruppering", Classification.IndustryGrouping, httpClientMock);

var appOptions = await appOptionsProvider.GetAppOptionsAsync("nb", new Dictionary<string, string>() { { "level", "1" } });

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Altinn.App.Core.Features;
using Altinn.Codelists.SSB;
using Altinn.Codelists.SSB.Clients;
using Altinn.Codelists.SSB.Models;
using Altinn.Codelists.Tests.SSB.Mocks;

namespace Altinn.Codelists.Tests.SSB;
Expand All @@ -11,7 +12,7 @@ public class MaritalStatusCodelistProviderTests
public async Task GetAppOptionsAsync_ShouldReturnListOfCodes()
{
var httpClientMock = new ClassificationsHttpClientMock(Options.Create(new ClassificationSettings()));
IAppOptionsProvider appOptionsProvider = new MaritalStatusCodelistProvider(httpClientMock);
IAppOptionsProvider appOptionsProvider = new ClassificationCodelistProvider("maritalStatus", Classification.MaritalStatus, httpClientMock);

var appOptions = await appOptionsProvider.GetAppOptionsAsync("nb", new Dictionary<string, string>());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public class ClassificationsHttpClientMock : IClassificationsClient
private const string SEX_TESTDATA_RESOURCE = "Altinn.Codelists.Tests.SSB.Testdata.sex.json";
private const string COUNTIES_TESTDATA_RESOURCE = "Altinn.Codelists.Tests.SSB.Testdata.counties.json";
private const string COUNTRIES_TESTDATA_RESOURCE = "Altinn.Codelists.Tests.SSB.Testdata.countries.json";
private const string COMMUNES_TESTDATA_RESOURCE = "Altinn.Codelists.Tests.SSB.Testdata.communes.json";

private readonly IClassificationsClient _client;
private readonly IOptions<ClassificationSettings> _options;
Expand All @@ -24,21 +25,26 @@ public ClassificationsHttpClientMock(IOptions<ClassificationSettings> classifica
_options = classificationOptions;

HttpMessageHandlerMock = new MockHttpMessageHandler();
MockedClassificationsRequest = HttpMessageHandlerMock
.When("http://data.ssb.no/api/klass/v1/classifications/19/*")
.Respond("application/json", EmbeddedResource.LoadDataAsString(MARITAL_STATUS_TESTDATA_RESOURCE).Result);

HttpMessageHandlerMock
.When("http://data.ssb.no/api/klass/v1/classifications/6/*")
.Respond("application/json", EmbeddedResource.LoadDataAsString(INDUSTRY_GROUPING_TESTDATA_RESOURCE).Result);

HttpMessageHandlerMock
.When("http://data.ssb.no/api/klass/v1/classifications/2/*")
.Respond("application/json", EmbeddedResource.LoadDataAsString(SEX_TESTDATA_RESOURCE).Result);

HttpMessageHandlerMock
.When("http://data.ssb.no/api/klass/v1/classifications/6/*")
.Respond("application/json", EmbeddedResource.LoadDataAsString(INDUSTRY_GROUPING_TESTDATA_RESOURCE).Result);

MockedClassificationsRequest = HttpMessageHandlerMock
.When("http://data.ssb.no/api/klass/v1/classifications/19/*")
.Respond("application/json", EmbeddedResource.LoadDataAsString(MARITAL_STATUS_TESTDATA_RESOURCE).Result);

HttpMessageHandlerMock
.When("http://data.ssb.no/api/klass/v1/classifications/104/*")
.Respond("application/json", EmbeddedResource.LoadDataAsString(COUNTIES_TESTDATA_RESOURCE).Result);
HttpMessageHandlerMock
.When("http://data.ssb.no/api/klass/v1/classifications/131/*")
.Respond("application/json", EmbeddedResource.LoadDataAsString(COMMUNES_TESTDATA_RESOURCE).Result);

HttpMessageHandlerMock
.When("http://data.ssb.no/api/klass/v1/classifications/552/*")
Expand Down
Loading

0 comments on commit 2972897

Please sign in to comment.