Skip to content

Commit b639397

Browse files
Work in progress on Commerce testing
1 parent add3afc commit b639397

File tree

8 files changed

+194
-74
lines changed

8 files changed

+194
-74
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System.ComponentModel.DataAnnotations;
2+
using EPiServer.Commerce.Catalog.ContentTypes;
3+
using EPiServer.Commerce.Catalog.DataAnnotations;
4+
5+
namespace Optimizely.TestContainers.Models.Commerce;
6+
7+
[CatalogContentType(
8+
GUID = "0B06DE9B-6AE3-40FB-909E-E718CCC260AE",
9+
DisplayName = "Test Product",
10+
Description = "Test product for integration tests.")]
11+
public class TestProduct : ProductContent
12+
{
13+
[Display(
14+
Name = "Description",
15+
GroupName = SystemTabNames.Content,
16+
Order = 1)]
17+
[Searchable]
18+
[CultureSpecific]
19+
[Tokenize]
20+
[IncludeInDefaultSearch]
21+
public XhtmlString? Description { get; set; }
22+
}

src/Web/Optimizely.TestContainers.csproj

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

2121
<ItemGroup>
2222
<PackageReference Include="EPiServer.CMS" Version="12.33.1" />
23+
<PackageReference Include="EPiServer.Commerce" Version="14.40.0" />
2324
</ItemGroup>
2425

2526
<ItemGroup>

src/Web/Startup.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public void ConfigureServices(IServiceCollection services)
2727
services
2828
.AddCmsAspNetIdentity<ApplicationUser>()
2929
.AddCms()
30+
.AddCommerce()
3031
.AddAdminUserRegistration()
3132
.AddEmbeddedLocalization<Startup>();
3233
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System.Globalization;
2+
using EPiServer;
3+
using EPiServer.Commerce.Catalog.ContentTypes;
4+
using EPiServer.Core;
5+
using EPiServer.DataAccess;
6+
using Mediachase.Commerce.Catalog;
7+
using Microsoft.Extensions.DependencyInjection;
8+
using Optimizely.TestContainers.Models.Commerce;
9+
10+
namespace OptimizelyTestContainers.Tests;
11+
12+
public class CommerceCatalogIntegrationTests : OptimizelyCommerceIntegrationTestBase
13+
{
14+
[Fact]
15+
public void Can_Save_Category()
16+
{
17+
var referenceConverter = Services.GetRequiredService<ReferenceConverter>();
18+
var contentRepository = Services.GetRequiredService<IContentRepository>();
19+
20+
var rootLink = referenceConverter.GetRootLink();
21+
22+
var aliensNode = contentRepository.GetDefault<NodeContent>(rootLink, CultureInfo.GetCultureInfo("en"));
23+
aliensNode.Name = "Aliens";
24+
var aliensNodeReference = contentRepository.Save(aliensNode, SaveAction.Publish);
25+
26+
var testAlienProduct = contentRepository.GetDefault<TestProduct>(aliensNodeReference, CultureInfo.GetCultureInfo("en"));
27+
testAlienProduct.Name = "Snarbo";
28+
testAlienProduct.Description = new XhtmlString("<p>Some scary facts about Aliens!</p>");
29+
var testAlienProductReference = contentRepository.Save(testAlienProduct, SaveAction.Publish);
30+
31+
Assert.NotNull(aliensNodeReference);
32+
Assert.NotNull(testAlienProductReference);
33+
34+
aliensNode = contentRepository.Get<NodeContent>(aliensNodeReference);
35+
Assert.Equal("Aliens", aliensNode.Name);
36+
37+
testAlienProduct = contentRepository.Get<TestProduct>(testAlienProductReference);
38+
Assert.Equal("Snarbo", testAlienProduct.Name);
39+
}
40+
}

test/OptimizelyTestContainers.Tests/NewsPageIntegrationTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
namespace OptimizelyTestContainers.Tests;
1111

12-
public class NewsPageIntegrationTest : OptimizelyIntegrationTestBase
12+
public class NewsPageIntegrationTest : OptimizelyCmsIntegrationTestBase
1313
{
1414
[Fact]
1515
public void Can_Create_And_Read_NewsPage()
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
using EPiServer.Framework;
2+
using EPiServer.Framework.Initialization;
3+
using Microsoft.AspNetCore.Hosting;
4+
using Microsoft.Extensions.DependencyInjection;
5+
using Microsoft.Extensions.Hosting;
6+
using Optimizely.TestContainers;
7+
using Testcontainers.MsSql;
8+
9+
namespace OptimizelyTestContainers.Tests;
10+
11+
public class OptimizelyCmsIntegrationTestBase : IAsyncLifetime
12+
{
13+
private IHost _host = null!;
14+
15+
protected MsSqlContainer CmsDbContainer { get; private set; } = null!;
16+
17+
protected IServiceProvider Services { get; private set; } = null!;
18+
19+
public virtual async Task InitializeAsync()
20+
{
21+
// Start SQL Server container
22+
CmsDbContainer = new MsSqlBuilder()
23+
.WithImage("mcr.microsoft.com/mssql/server:2022-latest")
24+
.WithPassword("yourStrong(!)Password")
25+
.Build();
26+
27+
await CmsDbContainer.StartAsync();
28+
29+
// Build CMS host
30+
_host = Host.CreateDefaultBuilder()
31+
.ConfigureCmsDefaults()
32+
.ConfigureWebHostDefaults(CustomizebHostDetaults)
33+
.Build();
34+
35+
await _host.StartAsync();
36+
37+
CustomizeStartup();
38+
39+
Services = _host.Services;
40+
}
41+
42+
public virtual void CustomizebHostDetaults(IWebHostBuilder webBuilder)
43+
{
44+
webBuilder.ConfigureServices((context, services) =>
45+
{
46+
/*
47+
services.Configure<DataAccessOptions>(opt =>
48+
{
49+
var containerConnectionString = CmsDbContainer.GetConnectionString();
50+
51+
opt.SetConnectionString(containerConnectionString);
52+
});
53+
*/
54+
55+
// Add data importer service to setup default content for the tests
56+
services.AddTransient<OptimizelyDataImporter>();
57+
});
58+
59+
// Use the Alloy startup by default
60+
webBuilder.UseStartup<Startup>();
61+
}
62+
63+
public virtual void CustomizeStartup()
64+
{
65+
// Run initialization engine (simulate application startup)
66+
var initializer = _host.Services.GetRequiredService<InitializationEngine>();
67+
if (initializer.InitializationState != InitializationState.Initialized)
68+
initializer.Initialize();
69+
}
70+
71+
public virtual async Task DisposeAsync()
72+
{
73+
await _host.StopAsync();
74+
await CmsDbContainer.DisposeAsync();
75+
}
76+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using Microsoft.AspNetCore.Hosting;
2+
using Microsoft.Extensions.Configuration;
3+
using Testcontainers.MsSql;
4+
5+
namespace OptimizelyTestContainers.Tests;
6+
7+
public class OptimizelyCommerceIntegrationTestBase : OptimizelyCmsIntegrationTestBase
8+
{
9+
public MsSqlContainer CommerceDbContainer { get; private set; } = null!;
10+
11+
public override async Task InitializeAsync()
12+
{
13+
await base.InitializeAsync();
14+
15+
// Start SQL Server container
16+
CommerceDbContainer = new MsSqlBuilder()
17+
.WithImage("mcr.microsoft.com/mssql/server:2022-latest")
18+
.WithPassword("yourStrong(!)Password")
19+
.Build();
20+
21+
await CommerceDbContainer.StartAsync();
22+
}
23+
24+
public override void CustomizebHostDetaults(IWebHostBuilder webBuilder)
25+
{
26+
27+
webBuilder.ConfigureAppConfiguration((context, configBuilder) =>
28+
{
29+
var testSettings = new Dictionary<string, string?>
30+
{
31+
//["ConnectionStrings:EPiServerDB"] = CmsDbContainer.GetConnectionString(),
32+
["ConnectionStrings:EcfSqlConnection"] = CommerceDbContainer.GetConnectionString(),
33+
};
34+
35+
configBuilder.AddInMemoryCollection(testSettings);
36+
});
37+
38+
base.CustomizebHostDetaults(webBuilder);
39+
}
40+
41+
public override void CustomizeStartup()
42+
{
43+
// TOOD: No-op for now
44+
base.CustomizeStartup();
45+
}
46+
47+
public override async Task DisposeAsync()
48+
{
49+
await CommerceDbContainer.DisposeAsync();
50+
51+
await base.DisposeAsync();
52+
}
53+
}

test/OptimizelyTestContainers.Tests/OptimizelyIntegrationTestBase.cs

Lines changed: 0 additions & 73 deletions
This file was deleted.

0 commit comments

Comments
 (0)