From fc0895fba351f59e9a604b5f76381cd8456d227f Mon Sep 17 00:00:00 2001 From: Mirko Sekulic Date: Tue, 27 Feb 2024 13:36:45 +0100 Subject: [PATCH] tests added --- .../Implementation/SchemaModelService.cs | 16 +++--- .../AddXsd_CsharpNamespaceTests.cs | 56 ++++++++++++++++++ .../PutDatamodel_CsharpNamespaceTests.cs | 57 +++++++++++++++++++ 3 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 backend/tests/Designer.Tests/Controllers/DataModelsController/AddXsd_CsharpNamespaceTests.cs create mode 100644 backend/tests/Designer.Tests/Controllers/DataModelsController/PutDatamodel_CsharpNamespaceTests.cs diff --git a/backend/src/Designer/Services/Implementation/SchemaModelService.cs b/backend/src/Designer/Services/Implementation/SchemaModelService.cs index c2ef9b304de..4da1ea7793a 100644 --- a/backend/src/Designer/Services/Implementation/SchemaModelService.cs +++ b/backend/src/Designer/Services/Implementation/SchemaModelService.cs @@ -141,9 +141,9 @@ public async Task UpdateModelFilesFromJsonSchema(AltinnRepoEditingContex string serializedModelMetadata = SerializeModelMetadata(modelMetadata); await altinnAppGitRepository.SaveModelMetadata(serializedModelMetadata, schemaName); - await UpdateCSharpClasses(altinnAppGitRepository, modelMetadata, schemaName); + string fullTypeName = await UpdateCSharpClasses(altinnAppGitRepository, modelMetadata, schemaName); - await UpdateApplicationMetadata(altinnAppGitRepository, schemaName, modelMetadata.GetRootElement().TypeName); + await UpdateApplicationMetadata(altinnAppGitRepository, schemaName, fullTypeName); return jsonContent; } @@ -294,7 +294,7 @@ private Json.Schema.JsonSchema GenerateJsonSchemaFromXsd(Stream xsdStream) } - private async Task UpdateCSharpClasses(AltinnAppGitRepository altinnAppGitRepository, ModelMetadata modelMetadata, string schemaName) + private async Task UpdateCSharpClasses(AltinnAppGitRepository altinnAppGitRepository, ModelMetadata modelMetadata, string schemaName) { ApplicationMetadata application = await altinnAppGitRepository.GetApplicationMetadata(); string modelName = modelMetadata.GetRootElement().TypeName; @@ -302,13 +302,14 @@ private async Task UpdateCSharpClasses(AltinnAppGitRepository altinnAppGitReposi string csharpClasses = _modelMetadataToCsharpConverter.CreateModelFromMetadata(modelMetadata, separateNamespace); await altinnAppGitRepository.SaveCSharpClasses(csharpClasses, schemaName); + return separateNamespace ? $"Altinn.App.Models.{modelName}.{modelName}" : $"Altinn.App.Models.{modelName}"; } - private static async Task UpdateApplicationMetadata(AltinnAppGitRepository altinnAppGitRepository, string schemaName, string typeName) + private static async Task UpdateApplicationMetadata(AltinnAppGitRepository altinnAppGitRepository, string schemaName, string fullTypeName) { ApplicationMetadata application = await altinnAppGitRepository.GetApplicationMetadata(); - UpdateApplicationWithAppLogicModel(application, schemaName, "Altinn.App.Models." + typeName); + UpdateApplicationWithAppLogicModel(application, schemaName, fullTypeName); await altinnAppGitRepository.SaveApplicationMetadata(application); } @@ -419,10 +420,9 @@ private async Task ProcessNewXsd(AltinnAppGitRepository altinnAppGitRepo await altinnAppGitRepository.SaveModelMetadata(serializedModelMetadata, schemaName); - await UpdateCSharpClasses(altinnAppGitRepository, modelMetadata, schemaName); + string fullTypeName = await UpdateCSharpClasses(altinnAppGitRepository, modelMetadata, schemaName); - await UpdateApplicationMetadata(altinnAppGitRepository, schemaName, - modelMetadata.GetRootElement().TypeName); + await UpdateApplicationMetadata(altinnAppGitRepository, schemaName, fullTypeName); return jsonContent; } diff --git a/backend/tests/Designer.Tests/Controllers/DataModelsController/AddXsd_CsharpNamespaceTests.cs b/backend/tests/Designer.Tests/Controllers/DataModelsController/AddXsd_CsharpNamespaceTests.cs new file mode 100644 index 00000000000..53e5afea043 --- /dev/null +++ b/backend/tests/Designer.Tests/Controllers/DataModelsController/AddXsd_CsharpNamespaceTests.cs @@ -0,0 +1,56 @@ +using System.IO; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text.Json; +using System.Threading.Tasks; +using Altinn.App.Core.Models; +using Designer.Tests.Controllers.ApiTests; +using Designer.Tests.Utils; +using FluentAssertions; +using Microsoft.AspNetCore.Mvc.Testing; +using SharedResources.Tests; +using Xunit; + +namespace Designer.Tests.Controllers.DataModelsController; + +public class AddXsd_CsharpNamespaceTests : DisagnerEndpointsTestsBase, IClassFixture> +{ + private static string VersionPrefix(string org, string repository) => $"/designer/api/{org}/{repository}/datamodels"; + + public AddXsd_CsharpNamespaceTests(WebApplicationFactory factory) : base(factory) + { + } + + [Theory] + [InlineData("Model/XmlSchema/Gitea/aal-vedlegg.xsd", "ttd", "empty-app", "testUser", "App/models/aal-vedlegg.cs", "Altinn.App.Models.vedlegg", "vedlegg", "Altinn.App.Models")] + [InlineData("Kursdomene_HvemErHvem_M_2021-04-08_5742_34627_SERES.xsd", "ttd", "hvem-er-hvem", "testUser", "App/models/Kursdomene_HvemErHvem_M_2021-04-08_5742_34627_SERES.cs", "Altinn.App.Models", "HvemErHvem_M", "Altinn.App.Models.HvemErHvem_M")] + public async Task GivenApp_ShouldProduce_CorrectNamespace(string xsdPath, string org, string repo, string developer, string expectedModelPath, string expectedNamespace, string expectedTypeName, string notExpectedNamespace) + { + string targetRepository = TestDataHelper.GenerateTestRepoName(); + await CopyRepositoryForTest(org, repo, developer, targetRepository); + string url = $"{VersionPrefix(org, targetRepository)}/upload"; + + var fileStream = SharedResourcesHelper.LoadTestData(xsdPath); + var formData = new MultipartFormDataContent(); + var streamContent = new StreamContent(fileStream); + streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); + formData.Add(streamContent, "file", Path.GetFileName(xsdPath)); + + using var response = await HttpClient.PostAsync(url, formData); + Assert.Equal(HttpStatusCode.Created, response.StatusCode); + + // get the csharp model from repo + string csharpModel = TestDataHelper.GetFileFromRepo(org, targetRepository, developer, expectedModelPath); + csharpModel.Should().Contain($"namespace {expectedNamespace}\n{{"); + + string applicationMetadataContent = TestDataHelper.GetFileFromRepo(org, targetRepository, developer, "App/config/applicationmetadata.json"); + var applicationMetadata = JsonSerializer.Deserialize(applicationMetadataContent, JsonSerializerOptions); + + applicationMetadata.DataTypes.Should().Contain(x => x.AppLogic != null && x.AppLogic.ClassRef == + $"{expectedNamespace}.{expectedTypeName}"); + + applicationMetadata.DataTypes.Should().NotContain(x => x.AppLogic != null && x.AppLogic.ClassRef == + $"{notExpectedNamespace}.{expectedTypeName}"); + } +} diff --git a/backend/tests/Designer.Tests/Controllers/DataModelsController/PutDatamodel_CsharpNamespaceTests.cs b/backend/tests/Designer.Tests/Controllers/DataModelsController/PutDatamodel_CsharpNamespaceTests.cs new file mode 100644 index 00000000000..f62a44b0963 --- /dev/null +++ b/backend/tests/Designer.Tests/Controllers/DataModelsController/PutDatamodel_CsharpNamespaceTests.cs @@ -0,0 +1,57 @@ +using System; +using System.Net; +using System.Net.Http; +using System.Net.Mime; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using Altinn.App.Core.Models; +using Altinn.Studio.DataModeling.Templates; +using Designer.Tests.Controllers.ApiTests; +using Designer.Tests.Utils; +using FluentAssertions; +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Designer.Tests.Controllers.DataModelsController; + +public class PutDatamodel_CsharpNamespaceTests : DisagnerEndpointsTestsBase, IClassFixture> +{ + private static string VersionPrefix(string org, string repository) => $"/designer/api/{org}/{repository}/datamodels"; + + public PutDatamodel_CsharpNamespaceTests(WebApplicationFactory factory) : base(factory) + { + } + + [Theory] + [InlineData("App/models/Kursdomene_HvemErHvem_M_2021-04-08_5742_34627_SERES.schema.json", "ttd", "hvem-er-hvem", "testUser", "HvemErHvem_M", "App/models/Kursdomene_HvemErHvem_M_2021-04-08_5742_34627_SERES.cs", "Altinn.App.Models", "Altinn.App.Models.HvemErHvem_M")] + [InlineData("App/models/newmodel.schema.json", "ttd", "empty-app", "testUser", "newmodel", "App/models/newmodel.cs", "Altinn.App.Models.newmodel", "Altinn.App.Models")] + public async Task GivenApp_ShouldProduce_CorrectNamespace(string modelPath, string org, string repo, string developer, string expectedModelName, string expectedModelPath, string expectedNamespace, string notExpectedNamespace) + { + string targetRepo = TestDataHelper.GenerateTestRepoName(); + await CopyRepositoryForTest(org, repo, developer, targetRepo); + string url = $"{VersionPrefix(org, targetRepo)}/datamodel?modelPath={modelPath}"; + + string schema = new GeneralJsonTemplate(new Uri("http://altinn-testschema.json"), expectedModelName).GetJsonString(); + + using var request = new HttpRequestMessage(HttpMethod.Put, url) + { + Content = new StringContent(schema, Encoding.UTF8, MediaTypeNames.Application.Json) + }; + + using var response = await HttpClient.SendAsync(request); + response.StatusCode.Should().Be(HttpStatusCode.NoContent); + // get the csharp model from repo + string csharpModel = TestDataHelper.GetFileFromRepo(org, targetRepo, developer, expectedModelPath); + csharpModel.Should().Contain($"namespace {expectedNamespace}\n{{"); + + string applicationMetadataContent = TestDataHelper.GetFileFromRepo(org, targetRepo, developer, "App/config/applicationmetadata.json"); + var applicationMetadata = JsonSerializer.Deserialize(applicationMetadataContent, JsonSerializerOptions); + + applicationMetadata.DataTypes.Should().Contain(x => x.AppLogic != null && x.AppLogic.ClassRef == + $"{expectedNamespace}.{expectedModelName}"); + + applicationMetadata.DataTypes.Should().NotContain(x => x.AppLogic != null && x.AppLogic.ClassRef == + $"{notExpectedNamespace}.{expectedModelName}"); + } +}