Skip to content

Commit ccae87e

Browse files
Extract base class OptimizelyIntegrationTestBase
1 parent ad2af76 commit ccae87e

File tree

3 files changed

+99
-91
lines changed

3 files changed

+99
-91
lines changed
Lines changed: 8 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,27 @@
11
using System.Reflection;
22
using EPiServer;
3-
using EPiServer.Cms.Shell;
4-
using Microsoft.Extensions.Hosting;
5-
using Microsoft.Extensions.DependencyInjection;
6-
using EPiServer.Framework.Initialization;
73
using EPiServer.Core;
8-
using EPiServer.Data;
94
using EPiServer.DataAccess;
10-
using EPiServer.Framework;
11-
using EPiServer.Framework.Web;
125
using EPiServer.Security;
136
using EPiServer.Web;
14-
using EPiServer.Web.Templating;
15-
using Microsoft.AspNetCore.Hosting;
16-
using Optimizely.TestContainers;
17-
using Optimizely.TestContainers.Models;
7+
using Microsoft.Extensions.DependencyInjection;
188
using Optimizely.TestContainers.Models.Pages;
19-
using OptimizelyTestContainers.Tests;
20-
using Testcontainers.MsSql;
21-
22-
public class NewsPageIntegrationTest : IAsyncLifetime
23-
{
24-
private IHost _host;
25-
private IServiceProvider _services;
26-
private MsSqlContainer _dbContainer;
27-
28-
public async Task InitializeAsync()
29-
{
30-
// Start SQL Server container
31-
_dbContainer = new MsSqlBuilder()
32-
.WithImage("mcr.microsoft.com/mssql/server:2022-latest")
33-
.WithPassword("yourStrong(!)Password")
34-
.Build();
359

36-
await _dbContainer.StartAsync();
37-
38-
// Build CMS host
39-
_host = Host.CreateDefaultBuilder()
40-
.ConfigureCmsDefaults()
41-
.ConfigureWebHostDefaults(webBuilder =>
42-
{
43-
webBuilder.ConfigureServices((context, services) =>
44-
{
45-
services.AddCms();
46-
services.AddCmsHost();
47-
services.AddCmsFrameworkWeb();
48-
49-
services.AddCmsCoreWeb(); // Adds core CMS services
50-
services.AddCmsTemplating();
51-
services.AddCmsUI();
52-
53-
services.Configure<DataAccessOptions>(opt =>
54-
{
55-
var cs = _dbContainer.GetConnectionString();
56-
57-
opt.SetConnectionString(cs);
58-
});
59-
60-
services.AddTransient<OptimizelyDataImporter>();
61-
});
62-
63-
webBuilder.UseStartup<Startup>();
64-
})
65-
.Build();
66-
67-
68-
69-
70-
await _host.StartAsync();
71-
72-
// Run initialization engine (simulate application startup)
73-
var initializer = _host.Services.GetRequiredService<InitializationEngine>();
74-
if (initializer.InitializationState != InitializationState.Initialized)
75-
initializer.Initialize();
76-
77-
_services = _host.Services;
78-
}
79-
80-
public async Task DisposeAsync()
81-
{
82-
await _host.StopAsync();
83-
await _dbContainer.DisposeAsync();
84-
}
10+
namespace OptimizelyTestContainers.Tests;
8511

12+
public class NewsPageIntegrationTest : OptimizelyIntegrationTestBase
13+
{
8614
[Fact]
8715
public void Can_Create_And_Read_NewsPage()
8816
{
8917
// Arrange
90-
var repo = _services.GetRequiredService<IContentRepository>();
18+
var repo = Services.GetRequiredService<IContentRepository>();
9119

9220
// Import test data
9321
var basePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!;
9422
var episerverDataFile = Path.Combine(basePath, "DefaultSiteContent.episerverdata");
9523

96-
var dataImporter = _services.GetRequiredService<OptimizelyDataImporter>();
24+
var dataImporter = Services.GetRequiredService<OptimizelyDataImporter>();
9725
dataImporter.Import(episerverDataFile);
9826

9927

@@ -102,7 +30,7 @@ public void Can_Create_And_Read_NewsPage()
10230

10331
var startPage = repo.GetChildren<StartPage>(ContentReference.RootPage).First();
10432

105-
var siteDefinitionRepo = _services.GetRequiredService<ISiteDefinitionRepository>();
33+
var siteDefinitionRepo = Services.GetRequiredService<ISiteDefinitionRepository>();
10634

10735
siteDefinitionRepo.Save(new SiteDefinition()
10836
{
@@ -127,4 +55,4 @@ public void Can_Create_And_Read_NewsPage()
12755
Assert.NotNull(loaded);
12856
Assert.Equal("Martians Landed in Stockholm", loaded.Title);
12957
}
130-
}
58+
}

test/OptimizelyTestContainers.Tests/OptimizelyDataImporter.cs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Castle.DynamicProxy.Generators.Emitters;
2-
using EPiServer.Core;
1+
using EPiServer.Core;
32
using EPiServer.Core.Transfer;
43
using EPiServer.Enterprise;
54
using Microsoft.Extensions.Logging;
@@ -22,8 +21,6 @@ public void Import(string importFilePath)
2221
KeepIdentity = true,
2322
EnsureContentNameUniqueness = false,
2423
ValidateDestination = true,
25-
//ValidateContent = true,
26-
//ImportFiles = true,
2724
TransferType = TypeOfTransfer.Importing,
2825
AutoCloseStream = true,
2926
};
@@ -33,18 +30,20 @@ public void Import(string importFilePath)
3330
var errors = importLog.Errors.ToList();
3431
var warnings = importLog.Warnings.ToList();
3532

36-
if (errors.Any())
33+
if (errors.Count != 0)
3734
{
3835
throw new Exception(errors.First());
3936
}
4037

41-
if (warnings.Any())
38+
if (warnings.Count == 0)
4239
{
43-
foreach (var warning in warnings)
44-
{
45-
logger.LogWarning(warning);
46-
Console.WriteLine(warning);
47-
}
40+
return;
41+
}
42+
43+
foreach (var warning in warnings)
44+
{
45+
logger.LogWarning(warning);
46+
Console.WriteLine(warning);
4847
}
4948
}
5049
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using EPiServer.Cms.Shell;
2+
using EPiServer.Data;
3+
using EPiServer.Framework;
4+
using EPiServer.Framework.Initialization;
5+
using EPiServer.Framework.Web;
6+
using EPiServer.Web;
7+
using EPiServer.Web.Templating;
8+
using Microsoft.AspNetCore.Hosting;
9+
using Microsoft.Extensions.DependencyInjection;
10+
using Microsoft.Extensions.Hosting;
11+
using Optimizely.TestContainers;
12+
using Testcontainers.MsSql;
13+
14+
namespace OptimizelyTestContainers.Tests;
15+
16+
public class OptimizelyIntegrationTestBase : IAsyncLifetime
17+
{
18+
private IHost _host = null!;
19+
private MsSqlContainer _dbContainer = null!;
20+
21+
public IServiceProvider Services { get; private set; } = null!;
22+
23+
public async Task InitializeAsync()
24+
{
25+
// Start SQL Server container
26+
_dbContainer = new MsSqlBuilder()
27+
.WithImage("mcr.microsoft.com/mssql/server:2022-latest")
28+
.WithPassword("yourStrong(!)Password")
29+
.Build();
30+
31+
await _dbContainer.StartAsync();
32+
33+
// Build CMS host
34+
_host = Host.CreateDefaultBuilder()
35+
.ConfigureCmsDefaults()
36+
.ConfigureWebHostDefaults(webBuilder =>
37+
{
38+
webBuilder.ConfigureServices((context, services) =>
39+
{
40+
// Add CMS services
41+
services.AddCms();
42+
services.AddCmsHost();
43+
services.AddCmsFrameworkWeb();
44+
services.AddCmsCoreWeb();
45+
services.AddCmsTemplating();
46+
services.AddCmsUI();
47+
48+
// Override connection string to use container connection
49+
services.Configure<DataAccessOptions>(opt =>
50+
{
51+
var containerConnectionString = _dbContainer.GetConnectionString();
52+
53+
opt.SetConnectionString(containerConnectionString);
54+
});
55+
56+
// Add data importer service to setup default content for the tests
57+
services.AddTransient<OptimizelyDataImporter>();
58+
});
59+
60+
// Use the Alloy startup by default
61+
webBuilder.UseStartup<Startup>();
62+
63+
})
64+
.Build();
65+
66+
await _host.StartAsync();
67+
68+
// Run initialization engine (simulate application startup)
69+
var initializer = _host.Services.GetRequiredService<InitializationEngine>();
70+
if (initializer.InitializationState != InitializationState.Initialized)
71+
initializer.Initialize();
72+
73+
Services = _host.Services;
74+
}
75+
76+
public async Task DisposeAsync()
77+
{
78+
await _host.StopAsync();
79+
await _dbContainer.DisposeAsync();
80+
}
81+
}

0 commit comments

Comments
 (0)