Skip to content
Merged
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
13 changes: 13 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"permissions": {
"allow": [
"mcp__claude_ai_Microsoft_Learn__microsoft_docs_search",
"Bash(npm audit *)",
"Bash(npm ls *)",
"Bash(npm install *)",
"Bash(npx tsc *)",
"Bash(npx playwright *)",
"Bash(dotnet --version)"
]
}
}
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -355,4 +355,7 @@ App_Data/

# Modules
*/Stott.Optimizely.RobotsHandler/modules/**
*/OptimizelyTwelveTest/modules/**
*/OptimizelyTwelveTest/modules/**

# Settings
appsettings.Development.json
11 changes: 6 additions & 5 deletions Sample/OptimizelyTwelveTest/OptimizelyTwelveTest.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="EPiServer.CMS" Version="13.0.0" />
<PackageReference Include="EPiServer.Cms.UI.AspNetIdentity" Version="13.0.0" />
<PackageReference Include="EPiServer.Cms.UI.ContentManager" Version="13.0.0" />
<PackageReference Include="EPiServer.Cms.UI.VisitorGroups" Version="13.0.0" />
<PackageReference Include="EPiServer.CMS" Version="13.1.0" />
<PackageReference Include="EPiServer.Cms.UI.AspNetIdentity" Version="13.1.0" />
<PackageReference Include="EPiServer.Cms.UI.ContentManager" Version="13.1.0" />
<PackageReference Include="EPiServer.Cms.UI.VisitorGroups" Version="13.1.0" />
<PackageReference Include="MediatR" Version="14.1.0" />
<PackageReference Include="Optimizely.Graph.Cms" Version="13.0.0" />
<PackageReference Include="Optimizely.Graph.Cms" Version="13.1.0" />
<PackageReference Include="Stott.Security.Optimizely" Version="7.0.1" />
<Folder Include="wwwroot\" />
</ItemGroup>
<ItemGroup>
Expand Down
26 changes: 14 additions & 12 deletions Sample/OptimizelyTwelveTest/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

using Stott.Optimizely.RobotsHandler.Common;
using Stott.Optimizely.RobotsHandler.Configuration;
using Stott.Security.Optimizely.Common;
using Stott.Security.Optimizely.Features.Configuration;

public class Startup(IWebHostEnvironment webHostingEnvironment)
{
Expand Down Expand Up @@ -68,17 +70,17 @@ public void ConfigureServices(IServiceCollection services)
});
});

//services.AddStottSecurity(cspSetupOptions =>
//{
// cspSetupOptions.ConnectionStringName = "EPiServerDB";
//},
//authorizationOptions =>
//{
// authorizationOptions.AddPolicy(CspConstants.AuthorizationPolicy, policy =>
// {
// policy.RequireRole("WebAdmins");
// });
//});
services.AddStottSecurity(cspSetupOptions =>
{
cspSetupOptions.ConnectionStringName = "EPiServerDB";
},
authorizationOptions =>
{
authorizationOptions.AddPolicy(CspConstants.AuthorizationPolicy, policy =>
{
policy.RequireRole("WebAdmins");
});
});

services.ConfigureApplicationCookie(options =>
{
Expand Down Expand Up @@ -118,7 +120,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

app.UseAuthentication();
app.UseAuthorization();
// app.UseStottSecurity();
app.UseStottSecurity();
app.UseRobotsHandler();

app.UseEndpoints(endpoints =>
Expand Down
12 changes: 0 additions & 12 deletions Sample/OptimizelyTwelveTest/appsettings.Development.json

This file was deleted.

Binary file modified Sample/OptimizelyTwelveTest/modules/_protected/CMS/CMS.zip
Binary file not shown.
Binary file modified Sample/OptimizelyTwelveTest/modules/_protected/Shell/Shell.zip
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -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<SaveLlmsModel>())).Returns(true);

Expand All @@ -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<SaveLlmsModel>())).Returns(true);

Expand All @@ -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<SaveLlmsModel>())).Returns(false);

Expand All @@ -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<SaveLlmsModel>())).Throws<Exception>();

Expand All @@ -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<SaveLlmsModel>())).Returns(false);
_mockService.Setup(x => x.Save(It.IsAny<SaveLlmsModel>())).Throws<Exception>();
Expand All @@ -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<ContentResult>());
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<SaveLlmsModel>()), Times.Never);
_mockService.Verify(x => x.Save(It.IsAny<SaveLlmsModel>()), Times.Never);
}

[Test]
public void Delete_WhenGivenAnEmptyId_ReturnsABadRequest()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public async Task Index_WhenCalled_ReturnsRobotsContent()
var contentResult = result as ContentResult;
Assert.That(contentResult, Is.Not.Null);
Assert.That(contentResult.Content, Is.EqualTo(robotsContent));
Assert.That(contentResult.ContentType, Is.EqualTo("text/plain"));
Assert.That(contentResult.ContentType, Is.EqualTo("text/plain; charset=utf-8"));
Assert.That(contentResult.StatusCode, Is.EqualTo(200));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<SaveRobotsModel>())).Returns(true);

Expand All @@ -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<SaveRobotsModel>())).Returns(true);

Expand All @@ -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<SaveRobotsModel>())).Returns(false);

Expand All @@ -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<SaveRobotsModel>())).Throws<Exception>();

Expand All @@ -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<SaveRobotsModel>())).Returns(false);
_mockService.Setup(x => x.Save(It.IsAny<SaveRobotsModel>())).Throws<Exception>();
Expand All @@ -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<ContentResult>());
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<SaveRobotsModel>()), Times.Never);
_mockService.Verify(x => x.Save(It.IsAny<SaveRobotsModel>()), Times.Never);
}

[Test]
public void Delete_WhenGivenAnEmptyId_ReturnsABadRequest()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public async Task Index_WhenCalled_ReturnsRobotsContent()
var contentResult = result as ContentResult;
Assert.That(contentResult, Is.Not.Null);
Assert.That(contentResult.Content, Is.EqualTo(robotsContent));
Assert.That(contentResult.ContentType, Is.EqualTo("text/plain"));
Assert.That(contentResult.ContentType, Is.EqualTo("text/plain; charset=utf-8"));
Assert.That(contentResult.StatusCode, Is.EqualTo(200));
}
}
Loading
Loading