Skip to content

Commit af13261

Browse files
committed
Created Integration tests for PagesSetupController
1 parent 1af1068 commit af13261

7 files changed

Lines changed: 198 additions & 2 deletions

File tree

src/Sitecore.AspNetCore.SDK.Pages/Controllers/PagesSetupController.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Microsoft.Extensions.Options;
55
using Microsoft.Extensions.Primitives;
66
using Sitecore.AspNetCore.SDK.Pages.Configuration;
7-
using Sitecore.AspNetCore.SDK.Pages.Middleware;
87
using Sitecore.AspNetCore.SDK.Pages.Models;
98
using Sitecore.AspNetCore.SDK.Pages.Properties;
109
using Sitecore.AspNetCore.SDK.RenderingEngine.Configuration;
@@ -147,4 +146,4 @@ private bool RequestHasValidEditingOrigin(HttpRequest httpRequest)
147146
return false;
148147
}
149148
}
150-
}
149+
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
using System.Net;
2+
using FluentAssertions;
3+
using Sitecore.AspNetCore.SDK.TestData;
4+
using Xunit;
5+
6+
namespace Sitecore.AspNetCore.SDK.RenderingEngine.Integration.Tests.Fixtures.Pages;
7+
8+
public class PagesSetupRoutingFixture(TestWebApplicationFactory<TestPagesProgram> factory) : IClassFixture<TestWebApplicationFactory<TestPagesProgram>>
9+
{
10+
private readonly TestWebApplicationFactory<TestPagesProgram> factory = factory;
11+
12+
[Fact]
13+
public async Task ConfigRoute_MissingSecret_ReturnsBadRequest()
14+
{
15+
// Arrange
16+
HttpClient client = factory.CreateClient();
17+
string url = $"{TestConstants.ConfigRoute}?secret=";
18+
19+
// Act
20+
var response = await client.GetAsync(url);
21+
22+
// Assert
23+
response.Should().NotBeNull();
24+
response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
25+
}
26+
27+
[Fact]
28+
public async Task ConfigRoute_InvalidSecret_ReturnsBadRequest()
29+
{
30+
// Arrange
31+
HttpClient client = factory.CreateClient();
32+
string url = $"{TestConstants.ConfigRoute}?secret=invalid_secret_value";
33+
34+
// Act
35+
var response = await client.GetAsync(url);
36+
37+
// Assert
38+
response.Should().NotBeNull();
39+
response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
40+
}
41+
42+
[Fact]
43+
public async Task ConfigRoute_InvalidRequestOrigin_ReturnsBadRequest()
44+
{
45+
// Arrange
46+
HttpClient client = factory.CreateClient();
47+
string url = $"{TestConstants.ConfigRoute}?secret={TestConstants.JssEditingSecret}";
48+
client.DefaultRequestHeaders.Add("Origin", "http://invalid_origin_domain.com");
49+
50+
// Act
51+
var response = await client.GetAsync(url);
52+
53+
// Assert
54+
response.Should().NotBeNull();
55+
response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
56+
}
57+
58+
[Fact]
59+
public async Task ConfigRoute_ValidCall_ReturnsCorrectObject()
60+
{
61+
// Arrange
62+
HttpClient client = factory.CreateClient();
63+
string url = $"{TestConstants.ConfigRoute}?secret={TestConstants.JssEditingSecret}";
64+
client.DefaultRequestHeaders.Add("Origin", "https://pages.sitecorecloud.io");
65+
66+
// Act
67+
var response = await client.GetAsync(url);
68+
69+
// Assert
70+
response.Should().NotBeNull();
71+
response.StatusCode.Should().Be(HttpStatusCode.OK);
72+
response.Content.Headers.ContentType.Should().NotBeNull();
73+
response.Content.Headers.ContentType?.MediaType.Should().Be("application/json");
74+
response.Headers.NonValidated["Content-Security-Policy"].Should().BeEquivalentTo("frame-ancestors 'self' https://pages.sitecorecloud.io");
75+
response.Headers.NonValidated["Access-Control-Allow-Origin"].Should().BeEquivalentTo("https://pages.sitecorecloud.io");
76+
response.Headers.NonValidated["Access-Control-Allow-Methods"].Should().BeEquivalentTo("GET, POST, OPTIONS, PUT, PATCH, DELETE");
77+
}
78+
79+
[Fact]
80+
public async Task RenderRoute_MissingSecret_ReturnsBadRequest()
81+
{
82+
// Arrange
83+
HttpClient client = factory.CreateClient();
84+
string url = $"{TestConstants.RenderRoute}?secret=";
85+
86+
// Act
87+
var response = await client.GetAsync(url);
88+
89+
// Assert
90+
response.Should().NotBeNull();
91+
response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
92+
}
93+
94+
[Fact]
95+
public async Task RenderRoute_InvalidSecret_ReturnsBadRequest()
96+
{
97+
// Arrange
98+
HttpClient client = factory.CreateClient();
99+
string url = $"{TestConstants.RenderRoute}?secret=invalid_secret_value";
100+
101+
// Act
102+
var response = await client.GetAsync(url);
103+
104+
// Assert
105+
response.Should().NotBeNull();
106+
response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
107+
}
108+
109+
[Fact]
110+
public async Task RenderRoute_ValidCall_ReturnsCorrectResponse()
111+
{
112+
// Arrange
113+
HttpClient client = factory.CreateClient();
114+
Guid itemId = Guid.NewGuid();
115+
string language = "en";
116+
string layoutKind = "final";
117+
string mode = "edit";
118+
string route = TestConstants.RenderRoute; // The controller needs to return a valid route in its RedirectResponse, so we're reusing the same route here instead of creating a fake one.
119+
string site = "siteA";
120+
string version = "1";
121+
string tenantId = "tenant1234";
122+
string url = $"{TestConstants.RenderRoute}?secret={TestConstants.JssEditingSecret}&sc_itemid={itemId}&sc_lang={language}&sc_layoutKind={layoutKind}&mode={mode}&sc_site={site}&sc_version={version}&tenant_id={tenantId}&route={route}";
123+
124+
// Act
125+
var response = await client.GetAsync(url);
126+
127+
// Assert
128+
response.Should().NotBeNull();
129+
response.StatusCode.Should().Be(HttpStatusCode.Redirect);
130+
}
131+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using Sitecore.AspNetCore.SDK.GraphQL.Extensions;
2+
using Sitecore.AspNetCore.SDK.LayoutService.Client.Extensions;
3+
using Sitecore.AspNetCore.SDK.Pages.Configuration;
4+
using Sitecore.AspNetCore.SDK.Pages.Extensions;
5+
using Sitecore.AspNetCore.SDK.RenderingEngine.Extensions;
6+
using Sitecore.AspNetCore.SDK.TestData;
7+
8+
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
9+
10+
builder.Services.AddRouting()
11+
.AddMvc();
12+
13+
builder.Services.AddGraphQlClient(configuration =>
14+
{
15+
configuration.ContextId = TestConstants.ContextId;
16+
});
17+
18+
builder.Services.AddSitecoreLayoutService()
19+
.AddSitecorePagesHandler()
20+
.AddGraphQlWithContextHandler("default", TestConstants.ContextId!, siteName: TestConstants.SiteName!)
21+
.AsDefaultHandler();
22+
23+
builder.Services.AddSitecoreRenderingEngine(options =>
24+
{
25+
options.AddDefaultPartialView("_ComponentNotFound");
26+
})
27+
.WithSitecorePages(TestConstants.ContextId, options => { options.EditingSecret = TestConstants.JssEditingSecret; });
28+
29+
WebApplication app = builder.Build();
30+
app.UseSitecorePages(new PagesOptions { ConfigEndpoint = TestConstants.ConfigRoute });
31+
app.UseRouting();
32+
app.Run();
33+
34+
/// <summary>
35+
/// Partial class allowing this TestProgram to be created by a WebApplicationFactory for integration testing.
36+
/// </summary>
37+
public partial class TestPagesProgram
38+
{
39+
}

tests/Sitecore.AspNetCore.SDK.RenderingEngine.Integration.Tests/Sitecore.AspNetCore.SDK.RenderingEngine.Integration.Tests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99

1010
<ItemGroup>
1111
<ProjectReference Include="..\..\src\Sitecore.AspNetCore.SDK.ExperienceEditor\Sitecore.AspNetCore.SDK.ExperienceEditor.csproj" />
12+
<ProjectReference Include="..\..\src\Sitecore.AspNetCore.SDK.GraphQL\Sitecore.AspNetCore.SDK.GraphQL.csproj" />
1213
<ProjectReference Include="..\..\src\Sitecore.AspNetCore.SDK.LayoutService.Client\Sitecore.AspNetCore.SDK.LayoutService.Client.csproj" />
14+
<ProjectReference Include="..\..\src\Sitecore.AspNetCore.SDK.Pages\Sitecore.AspNetCore.SDK.Pages.csproj" />
1315
<ProjectReference Include="..\..\src\Sitecore.AspNetCore.SDK.RenderingEngine\Sitecore.AspNetCore.SDK.RenderingEngine.csproj" />
1416
<ProjectReference Include="..\..\src\Sitecore.AspNetCore.SDK.SearchOptimization\Sitecore.AspNetCore.SDK.SearchOptimization.csproj" />
1517
<ProjectReference Include="..\..\src\Sitecore.AspNetCore.SDK.Tracking.VisitorIdentification\Sitecore.AspNetCore.SDK.Tracking.VisitorIdentification.csproj" />

tests/Sitecore.AspNetCore.SDK.RenderingEngine.Integration.Tests/TestServerBuilder.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
namespace Sitecore.AspNetCore.SDK.RenderingEngine.Integration.Tests;
77

8+
[Obsolete("This class is deprecated as this is based on the old .NET Core 3.0 approach app initialisation approach. Use `TestWebApplicationFactory` approach instead.")]
89
public class TestServerBuilder
910
{
1011
private readonly IWebHostBuilder _webHostBuilder = PrepareDefault();
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using Microsoft.AspNetCore.Mvc.Testing;
2+
3+
namespace Sitecore.AspNetCore.SDK.RenderingEngine.Integration.Tests
4+
{
5+
public class TestWebApplicationFactory<T>
6+
: WebApplicationFactory<T>
7+
where T : class
8+
{
9+
protected override void ConfigureWebHost(IWebHostBuilder builder)
10+
{
11+
builder.UseContentRoot(Path.GetFullPath(Directory.GetCurrentDirectory()));
12+
}
13+
}
14+
}

tests/data/Sitecore.AspNetCore.SDK.TestData/TestConstants.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,20 @@ public static class TestConstants
7373

7474
public const string JssEditingSecret = "mysecret";
7575

76+
public const string ContextId = "a_context_id";
77+
78+
public const string SiteName = "siteA";
79+
7680
public const string TestParamNameValue = "ParamName-Value";
7781

82+
public const string ConfigRoute = "/api/editing/config";
83+
84+
public const string RenderRoute = "/api/editing/render";
85+
7886
public const string HeadlessSxaLayoutId = "96e5f4ba-a2cf-4a4c-a4e7-64da88226362";
7987

88+
public const string PagesSampleConfigRequest = "{}";
89+
8090
#pragma warning disable SA1401
8191
#pragma warning disable CA2211
8292
public static readonly string TestMultilineFieldValue = $"This is {Environment.NewLine} multiline text";

0 commit comments

Comments
 (0)