diff --git a/.gitignore b/.gitignore index 4462784..c6c5991 100644 --- a/.gitignore +++ b/.gitignore @@ -355,4 +355,7 @@ App_Data/ # Modules */Stott.Optimizely.RobotsHandler/modules/** -*/OptimizelyTwelveTest/modules/** \ No newline at end of file +*/OptimizelyTwelveTest/modules/** + +# Settings +appsettings.Development.json \ No newline at end of file diff --git a/Sample/OptimizelyTwelveTest/appsettings.Development.json b/Sample/OptimizelyTwelveTest/appsettings.Development.json deleted file mode 100644 index 332487d..0000000 --- a/Sample/OptimizelyTwelveTest/appsettings.Development.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "EPiServer": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "urls": "http://*:8000/;https://*:8001/;", - "AllowedHosts": "*" -} \ No newline at end of file diff --git a/src/Stott.Optimizely.RobotsHandler.Test/Llms/LlmsApiControllerTests.cs b/src/Stott.Optimizely.RobotsHandler.Test/Llms/LlmsApiControllerTests.cs index b81b6fb..ce717fc 100644 --- a/src/Stott.Optimizely.RobotsHandler.Test/Llms/LlmsApiControllerTests.cs +++ b/src/Stott.Optimizely.RobotsHandler.Test/Llms/LlmsApiControllerTests.cs @@ -79,7 +79,7 @@ public void Details_RetrievesDefaultModelWhenPresentedWithAnEmptyId() public void Save_ReturnsConflictResultWhenConflictExists() { // Arrange - var formSubmitModel = new SaveLlmsModel(); + var formSubmitModel = new SaveLlmsModel { AppId = "MyApp" }; _mockService.Setup(x => x.DoesConflictExists(It.IsAny())).Returns(true); @@ -95,7 +95,7 @@ public void Save_ReturnsConflictResultWhenConflictExists() public void Save_DoesNotSaveModelWhenConflictExists() { // Arrange - var formSubmitModel = new SaveLlmsModel(); + var formSubmitModel = new SaveLlmsModel { AppId = "MyApp" }; _mockService.Setup(x => x.DoesConflictExists(It.IsAny())).Returns(true); @@ -110,7 +110,7 @@ public void Save_DoesNotSaveModelWhenConflictExists() public void Save_SavesModelWhenNoConflictExists() { // Arrange - var formSubmitModel = new SaveLlmsModel(); + var formSubmitModel = new SaveLlmsModel { AppId = "MyApp" }; _mockService.Setup(x => x.DoesConflictExists(It.IsAny())).Returns(false); @@ -125,7 +125,7 @@ public void Save_SavesModelWhenNoConflictExists() public void Save_WhenDoesConflictExistsThrowsAnException_ThenAnInternalServerErrorIsReturned() { // Arrange - var formSubmitModel = new SaveLlmsModel(); + var formSubmitModel = new SaveLlmsModel { AppId = "MyApp" }; _mockService.Setup(x => x.DoesConflictExists(It.IsAny())).Throws(); @@ -141,7 +141,7 @@ public void Save_WhenDoesConflictExistsThrowsAnException_ThenAnInternalServerErr public void Save_WhenSaveOnTheServiceThrowsAnException_ThenAnInternalServerErrorIsReturned() { // Arrange - var formSubmitModel = new SaveLlmsModel(); + var formSubmitModel = new SaveLlmsModel { AppId = "MyApp" }; _mockService.Setup(x => x.DoesConflictExists(It.IsAny())).Returns(false); _mockService.Setup(x => x.Save(It.IsAny())).Throws(); @@ -154,6 +154,36 @@ public void Save_WhenSaveOnTheServiceThrowsAnException_ThenAnInternalServerError Assert.That(((ContentResult)result).StatusCode, Is.EqualTo(500)); } + [Test] + [TestCaseSource(typeof(CommonTestCases), nameof(CommonTestCases.EmptyStrings))] + public void Save_WhenAppIdIsMissing_ReturnsABadRequest(string appId) + { + // Arrange + var formSubmitModel = new SaveLlmsModel { AppId = appId }; + + // Act + var result = _controller.Save(formSubmitModel); + + // Assert + Assert.That(result, Is.AssignableFrom()); + Assert.That(((ContentResult)result).StatusCode, Is.EqualTo(400)); + } + + [Test] + [TestCaseSource(typeof(CommonTestCases), nameof(CommonTestCases.EmptyStrings))] + public void Save_WhenAppIdIsMissing_DoesNotCheckForConflictsOrSave(string appId) + { + // Arrange + var formSubmitModel = new SaveLlmsModel { AppId = appId }; + + // Act + _controller.Save(formSubmitModel); + + // Assert + _mockService.Verify(x => x.DoesConflictExists(It.IsAny()), Times.Never); + _mockService.Verify(x => x.Save(It.IsAny()), Times.Never); + } + [Test] public void Delete_WhenGivenAnEmptyId_ReturnsABadRequest() { diff --git a/src/Stott.Optimizely.RobotsHandler.Test/Robots/RobotsApiControllerTests.cs b/src/Stott.Optimizely.RobotsHandler.Test/Robots/RobotsApiControllerTests.cs index 88a4ac0..e67897d 100644 --- a/src/Stott.Optimizely.RobotsHandler.Test/Robots/RobotsApiControllerTests.cs +++ b/src/Stott.Optimizely.RobotsHandler.Test/Robots/RobotsApiControllerTests.cs @@ -79,7 +79,7 @@ public void Details_RetrievesDefaultModelWhenPresentedWithAnEmptyId() public void Save_ReturnsConflictResultWhenConflictExists() { // Arrange - var formSubmitModel = new SaveRobotsModel(); + var formSubmitModel = new SaveRobotsModel { AppId = "MyApp" }; _mockService.Setup(x => x.DoesConflictExists(It.IsAny())).Returns(true); @@ -95,7 +95,7 @@ public void Save_ReturnsConflictResultWhenConflictExists() public void Save_DoesNotSaveModelWhenConflictExists() { // Arrange - var formSubmitModel = new SaveRobotsModel(); + var formSubmitModel = new SaveRobotsModel { AppId = "MyApp" }; _mockService.Setup(x => x.DoesConflictExists(It.IsAny())).Returns(true); @@ -110,7 +110,7 @@ public void Save_DoesNotSaveModelWhenConflictExists() public void Save_SavesModelWhenNoConflictExists() { // Arrange - var formSubmitModel = new SaveRobotsModel(); + var formSubmitModel = new SaveRobotsModel { AppId = "MyApp" }; _mockService.Setup(x => x.DoesConflictExists(It.IsAny())).Returns(false); @@ -125,7 +125,7 @@ public void Save_SavesModelWhenNoConflictExists() public void Save_WhenDoesConflictExistsThrowsAnException_ThenAnInternalServerErrorIsReturned() { // Arrange - var formSubmitModel = new SaveRobotsModel(); + var formSubmitModel = new SaveRobotsModel { AppId = "MyApp" }; _mockService.Setup(x => x.DoesConflictExists(It.IsAny())).Throws(); @@ -141,7 +141,7 @@ public void Save_WhenDoesConflictExistsThrowsAnException_ThenAnInternalServerErr public void Save_WhenSaveOnTheServiceThrowsAnException_ThenAnInternalServerErrorIsReturned() { // Arrange - var formSubmitModel = new SaveRobotsModel(); + var formSubmitModel = new SaveRobotsModel { AppId = "MyApp" }; _mockService.Setup(x => x.DoesConflictExists(It.IsAny())).Returns(false); _mockService.Setup(x => x.Save(It.IsAny())).Throws(); @@ -154,6 +154,36 @@ public void Save_WhenSaveOnTheServiceThrowsAnException_ThenAnInternalServerError Assert.That(((ContentResult)result).StatusCode, Is.EqualTo(500)); } + [Test] + [TestCaseSource(typeof(CommonTestCases), nameof(CommonTestCases.EmptyStrings))] + public void Save_WhenAppIdIsMissing_ReturnsABadRequest(string appId) + { + // Arrange + var formSubmitModel = new SaveRobotsModel { AppId = appId }; + + // Act + var result = _controller.Save(formSubmitModel); + + // Assert + Assert.That(result, Is.AssignableFrom()); + Assert.That(((ContentResult)result).StatusCode, Is.EqualTo(400)); + } + + [Test] + [TestCaseSource(typeof(CommonTestCases), nameof(CommonTestCases.EmptyStrings))] + public void Save_WhenAppIdIsMissing_DoesNotCheckForConflictsOrSave(string appId) + { + // Arrange + var formSubmitModel = new SaveRobotsModel { AppId = appId }; + + // Act + _controller.Save(formSubmitModel); + + // Assert + _mockService.Verify(x => x.DoesConflictExists(It.IsAny()), Times.Never); + _mockService.Verify(x => x.Save(It.IsAny()), Times.Never); + } + [Test] public void Delete_WhenGivenAnEmptyId_ReturnsABadRequest() { diff --git a/src/Stott.Optimizely.RobotsHandler.Ui/src/AddSiteLlms.jsx b/src/Stott.Optimizely.RobotsHandler.Ui/src/AddSiteLlms.jsx index 299931c..b304db9 100644 --- a/src/Stott.Optimizely.RobotsHandler.Ui/src/AddSiteLlms.jsx +++ b/src/Stott.Optimizely.RobotsHandler.Ui/src/AddSiteLlms.jsx @@ -169,7 +169,7 @@ Optional details go here Create LLMS Configuration -
+
diff --git a/src/Stott.Optimizely.RobotsHandler/Applications/ApplicationDefinitionController.cs b/src/Stott.Optimizely.RobotsHandler/Applications/ApplicationDefinitionController.cs index f5daf07..43dba0c 100644 --- a/src/Stott.Optimizely.RobotsHandler/Applications/ApplicationDefinitionController.cs +++ b/src/Stott.Optimizely.RobotsHandler/Applications/ApplicationDefinitionController.cs @@ -1,5 +1,4 @@ -using System.Linq; -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -17,14 +16,7 @@ public sealed class ApplicationDefinitionController(IApplicationDefinitionServic public async Task Applications() { var apps = await appService.GetAllApplicationsAsync(); - var allApps = apps.ToList(); - allApps.Insert(0, new ApplicationViewModel - { - AppName = "All Applications", - AvailableHosts = ApplicationMapper.CreateHostSummaries("All Hosts") - }); - - return CreateSafeJsonResult(allApps); + return CreateSafeJsonResult(apps); } } diff --git a/src/Stott.Optimizely.RobotsHandler/Llms/DefaultLlmsContentService.cs b/src/Stott.Optimizely.RobotsHandler/Llms/DefaultLlmsContentService.cs index 6ce39ff..871e99c 100644 --- a/src/Stott.Optimizely.RobotsHandler/Llms/DefaultLlmsContentService.cs +++ b/src/Stott.Optimizely.RobotsHandler/Llms/DefaultLlmsContentService.cs @@ -92,7 +92,7 @@ public ApplicationLlmsViewModel GetDefault(string? appId) public void Save(SaveLlmsModel model) { - if (Guid.Empty.Equals(model.AppId)) + if (string.IsNullOrWhiteSpace(model.AppId)) { throw new ArgumentException($"{nameof(model)}.{nameof(model.AppId)} must not be null or empty.", nameof(model)); } diff --git a/src/Stott.Optimizely.RobotsHandler/Llms/LlmsApiController.cs b/src/Stott.Optimizely.RobotsHandler/Llms/LlmsApiController.cs index 4c88bd3..bb0a09d 100644 --- a/src/Stott.Optimizely.RobotsHandler/Llms/LlmsApiController.cs +++ b/src/Stott.Optimizely.RobotsHandler/Llms/LlmsApiController.cs @@ -52,6 +52,16 @@ public IActionResult Save(SaveLlmsModel formSubmitModel) { try { + if (string.IsNullOrWhiteSpace(formSubmitModel.AppId)) + { + return new ContentResult + { + StatusCode = (int)HttpStatusCode.BadRequest, + Content = $"{nameof(formSubmitModel.AppId)} does not have a value.", + ContentType = "text/plain" + }; + } + if (service.DoesConflictExists(formSubmitModel)) { return new ContentResult diff --git a/src/Stott.Optimizely.RobotsHandler/Robots/RobotsApiController.cs b/src/Stott.Optimizely.RobotsHandler/Robots/RobotsApiController.cs index 8f47257..64860c4 100644 --- a/src/Stott.Optimizely.RobotsHandler/Robots/RobotsApiController.cs +++ b/src/Stott.Optimizely.RobotsHandler/Robots/RobotsApiController.cs @@ -52,6 +52,16 @@ public IActionResult Save(SaveRobotsModel formSubmitModel) { try { + if (string.IsNullOrWhiteSpace(formSubmitModel.AppId)) + { + return new ContentResult + { + StatusCode = (int)HttpStatusCode.BadRequest, + Content = $"{nameof(formSubmitModel.AppId)} does not have a value.", + ContentType = "text/plain" + }; + } + if (service.DoesConflictExists(formSubmitModel)) { return new ContentResult diff --git a/src/Stott.Optimizely.RobotsHandler/Robots/RobotsContentService.cs b/src/Stott.Optimizely.RobotsHandler/Robots/RobotsContentService.cs index f728e8d..02c5e59 100644 --- a/src/Stott.Optimizely.RobotsHandler/Robots/RobotsContentService.cs +++ b/src/Stott.Optimizely.RobotsHandler/Robots/RobotsContentService.cs @@ -94,7 +94,7 @@ public SiteRobotsViewModel GetDefault(string? appId) public void Save(SaveRobotsModel model) { - if (Guid.Empty.Equals(model.AppId)) + if (string.IsNullOrWhiteSpace(model.AppId)) { throw new ArgumentException($"{nameof(model)}.{nameof(model.AppId)} must not be null or empty.", nameof(model)); }