From ebace8df85408dee5ea4c9ee6c8a050ec0c4f509 Mon Sep 17 00:00:00 2001 From: Juan Agudelo Date: Tue, 6 Aug 2024 11:53:15 -0500 Subject: [PATCH 1/3] Set InstanceType property as nullable in OdsInstance --- .../Features/OdsInstances/AddOdsInstance.cs | 6 ++++-- .../Features/OdsInstances/EditOdsInstance.cs | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Application/EdFi.Ods.AdminApi/Features/OdsInstances/AddOdsInstance.cs b/Application/EdFi.Ods.AdminApi/Features/OdsInstances/AddOdsInstance.cs index 13081b752..f5ca02e54 100644 --- a/Application/EdFi.Ods.AdminApi/Features/OdsInstances/AddOdsInstance.cs +++ b/Application/EdFi.Ods.AdminApi/Features/OdsInstances/AddOdsInstance.cs @@ -39,7 +39,7 @@ public class AddOdsInstanceRequest : IAddOdsInstanceModel { [SwaggerSchema(Description = FeatureConstants.OdsInstanceName, Nullable = false)] public string? Name { get; set; } - [SwaggerSchema(Description = FeatureConstants.OdsInstanceInstanceType, Nullable = false)] + [SwaggerSchema(Description = FeatureConstants.OdsInstanceInstanceType, Nullable = true)] public string? InstanceType { get; set; } [SwaggerSchema(Description = FeatureConstants.OdsInstanceConnectionString, Nullable = false)] public string? ConnectionString { get; set; } @@ -60,7 +60,9 @@ public Validator(IGetOdsInstancesQuery getOdsInstancesQuery, IOptions m.InstanceType).NotEmpty(); + RuleFor(m => m.InstanceType) + .MaximumLength(100) + .When(m => !string.IsNullOrEmpty(m.InstanceType)); RuleFor(m => m.ConnectionString) .NotEmpty(); diff --git a/Application/EdFi.Ods.AdminApi/Features/OdsInstances/EditOdsInstance.cs b/Application/EdFi.Ods.AdminApi/Features/OdsInstances/EditOdsInstance.cs index 340682d5c..8529eb03f 100644 --- a/Application/EdFi.Ods.AdminApi/Features/OdsInstances/EditOdsInstance.cs +++ b/Application/EdFi.Ods.AdminApi/Features/OdsInstances/EditOdsInstance.cs @@ -41,7 +41,7 @@ public class EditOdsInstanceRequest : IEditOdsInstanceModel { [SwaggerSchema(Description = FeatureConstants.OdsInstanceName, Nullable = false)] public string? Name { get; set; } - [SwaggerSchema(Description = FeatureConstants.OdsInstanceInstanceType, Nullable = false)] + [SwaggerSchema(Description = FeatureConstants.OdsInstanceInstanceType, Nullable = true)] public string? InstanceType { get; set; } [SwaggerSchema(Description = FeatureConstants.OdsInstanceConnectionString, Nullable = true)] public string? ConnectionString { get; set; } @@ -67,7 +67,9 @@ public Validator(IGetOdsInstancesQuery getOdsInstancesQuery, IGetOdsInstanceQuer .WithMessage(FeatureConstants.ClaimSetAlreadyExistsMessage) .When(m => BeAnExistingOdsInstance(m.Id) && NameIsChanged(m)); - RuleFor(m => m.InstanceType).NotEmpty(); + RuleFor(m => m.InstanceType) + .MaximumLength(100) + .When(m => !string.IsNullOrEmpty(m.InstanceType)); RuleFor(m => m.ConnectionString) .Must(BeAValidConnectionString) From 1d093036e838ba8e10af0ac4fce1c1415422329e Mon Sep 17 00:00:00 2001 From: Juan Agudelo Date: Tue, 6 Aug 2024 12:14:27 -0500 Subject: [PATCH 2/3] Add unit test cases to validate if instanceType empty can be saved in OdsInstance --- .../AddOdsInstanceCommandTests.cs | 27 +++++++++++++++++++ .../EditOdsInstanceCommandTests.cs | 25 +++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddOdsInstanceCommandTests.cs b/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddOdsInstanceCommandTests.cs index 4e61c8d5a..deec0025d 100644 --- a/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddOdsInstanceCommandTests.cs +++ b/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddOdsInstanceCommandTests.cs @@ -43,4 +43,31 @@ public void ShouldAddOdsInstance() profile.ConnectionString.ShouldBe(odsInstanceConnectionString); }); } + + [Test] + public void ShouldAddOdsInstanceWithEmptyInstanceType() + { + var odsInstanceName = $"Test-OdsInstance{Guid.NewGuid()}"; + var odsInstanceConnectionString = "ConnectionString"; + var newOdsInstance = new Mock(); + newOdsInstance.Setup(x => x.Name).Returns(odsInstanceName); + newOdsInstance.Setup(x => x.ConnectionString).Returns(odsInstanceConnectionString); + + + var id = 0; + Transaction(usersContext => + { + var command = new AddOdsInstanceCommand(usersContext); + id = command.Execute(newOdsInstance.Object).OdsInstanceId; + id.ShouldBeGreaterThan(0); + }); + + Transaction(usersContext => + { + var profile = usersContext.OdsInstances.Single(v => v.OdsInstanceId == id); + profile.Name.ShouldBe(odsInstanceName); + profile.InstanceType.ShouldBeEmpty(); + profile.ConnectionString.ShouldBe(odsInstanceConnectionString); + }); + } } diff --git a/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/EditOdsInstanceCommandTests.cs b/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/EditOdsInstanceCommandTests.cs index 376422656..7fa5c2ea0 100644 --- a/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/EditOdsInstanceCommandTests.cs +++ b/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/EditOdsInstanceCommandTests.cs @@ -57,5 +57,30 @@ public void ShouldEditOdsInstance() changedOdsInstance.InstanceType.ShouldBe(instanceType); changedOdsInstance.ConnectionString.ShouldBe(connectionString); }); + } + + [Test] + public void ShouldEditOdsInstanceWithEmptyInstanceType() + { + var name = "new odsinstance name"; + var connectionString = "new odsinstance connection string"; + var newOdsInstanceData = new Mock(); + newOdsInstanceData.Setup(v => v.Id).Returns(_odsInstanceId); + newOdsInstanceData.Setup(v => v.Name).Returns(name); + newOdsInstanceData.Setup(v => v.ConnectionString).Returns(connectionString); + + Transaction(usersContext => + { + var editOdsInstanceCommand = new EditOdsInstanceCommand(usersContext); + editOdsInstanceCommand.Execute(newOdsInstanceData.Object); + }); + + Transaction(usersContext => + { + var changedOdsInstance = usersContext.OdsInstances.Single(v => v.OdsInstanceId == _odsInstanceId); + changedOdsInstance.Name.ShouldBe(name); + changedOdsInstance.InstanceType.ShouldBeEmpty(); + changedOdsInstance.ConnectionString.ShouldBe(connectionString); + }); } } From 1e21cd6121f43bb033c4e7851691f261fffa45f0 Mon Sep 17 00:00:00 2001 From: Juan Agudelo Date: Tue, 6 Aug 2024 16:11:03 -0500 Subject: [PATCH 3/3] Fix E2E tests --- .../Admin API E2E 2.0 - OdsInstances.postman_collection.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Application/EdFi.Ods.AdminApi/E2E Tests/Admin API E2E 2.0 - OdsInstances.postman_collection.json b/Application/EdFi.Ods.AdminApi/E2E Tests/Admin API E2E 2.0 - OdsInstances.postman_collection.json index 4f85ba218..d00b646f5 100644 --- a/Application/EdFi.Ods.AdminApi/E2E Tests/Admin API E2E 2.0 - OdsInstances.postman_collection.json +++ b/Application/EdFi.Ods.AdminApi/E2E Tests/Admin API E2E 2.0 - OdsInstances.postman_collection.json @@ -1,6 +1,6 @@ { "info": { - "_postman_id": "d5aa928a-f34a-442b-ab54-9292875dc37a", + "_postman_id": "44f88975-fd52-41b3-b16e-291f1dd218d1", "name": "Admin API E2E 2.0 - OdsInstances", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, @@ -105,13 +105,11 @@ "\r", "pm.test(\"POST OdsInstances Invalid: Response errors include messages by property\", function () {\r", " pm.expect(response.errors[\"Name\"].length).to.equal(1);\r", - " pm.expect(response.errors[\"InstanceType\"].length).to.equal(1);\r", " pm.expect(response.errors[\"ConnectionString\"].length).to.equal(1);\r", "});\r", "\r", "pm.test(\"POST OdsInstances Invalid: Response errors include messages with wrong elements\", function () {\r", " pm.expect(response.errors[\"Name\"][0]).to.contain(\"'Name' must not be empty\");\r", - " pm.expect(response.errors[\"InstanceType\"][0]).to.contain(\"'Instance Type' must not be empty\");\r", " pm.expect(response.errors[\"ConnectionString\"][0]).to.contain(\"'Connection String' must not be empty\");\r", "});" ],