Skip to content

Commit 480a3c0

Browse files
authored
feat: integration tests (#56)
1 parent 17b82f1 commit 480a3c0

16 files changed

Lines changed: 343 additions & 189 deletions

.github/workflows/tests.yaml

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,6 @@ jobs:
1313
runs-on: ubuntu-20.04
1414
timeout-minutes: 5
1515

16-
services:
17-
postgres:
18-
image: postgres:13.1
19-
ports:
20-
- 5432:5432
21-
env:
22-
POSTGRES_USER: test
23-
POSTGRES_PASSWORD: test
24-
POSTGRES_DB: test
25-
mysql:
26-
image: mysql:8.0
27-
env:
28-
MYSQL_DATABASE: test
29-
MYSQL_USER: test
30-
MYSQL_PASSWORD: test
31-
MYSQL_ROOT_PASSWORD: test
32-
ports:
33-
- 33306:3306
34-
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
35-
sqlserver:
36-
image: mcr.microsoft.com/azure-sql-edge:latest
37-
ports:
38-
- 1433:1433
39-
env:
40-
ACCEPT_EULA: Y
41-
SA_PASSWORD: Test12@.
42-
4316
steps:
4417
- name: Tests | Checkout
4518
uses: actions/checkout@v2

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,11 @@
22
**/obj
33
**/bin
44
/.vs/AppAny.Quartz.EntityFrameworkCore.Migrations
5+
6+
# ReSharper is a .NET coding add-in
7+
_ReSharper*/
8+
*.[Rr]e[Ss]harper
9+
*.DotSettings.user
10+
11+
# Ignore mac folder settings
12+
.DS_Store
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
2+
<s:Boolean x:Key="/Default/UserDictionary/Words/=Postgre/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

AppAny.Quartz.EntityFrameworkCore.Migrations.sln.DotSettings.user

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

src/AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL/QuartzModelBuilderPostgreSQLExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ namespace AppAny.Quartz.EntityFrameworkCore.Migrations.PostgreSQL
22
{
33
public static class QuartzModelBuilderPostgreSqlExtensions
44
{
5-
public static QuartzModelBuilder UsePostgreSql(this QuartzModelBuilder builder, string prefix = "qrtz_", string schema = "quartz")
5+
public static QuartzModelBuilder UsePostgreSql(this QuartzModelBuilder builder, string prefix = "qrtz_", string? schema = "quartz")
66
{
77
builder.UseEntityTypeConfigurations(context =>
88
{

src/AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer/QuartzModelBuilderSqlServerExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ namespace AppAny.Quartz.EntityFrameworkCore.Migrations.SqlServer
22
{
33
public static class QuartzModelBuilderSqlServerExtensions
44
{
5-
public static QuartzModelBuilder UseSqlServer(this QuartzModelBuilder builder, string prefix = "QRTZ_", string schema = "quartz")
5+
public static QuartzModelBuilder UseSqlServer(this QuartzModelBuilder builder, string prefix = "QRTZ_", string? schema = "quartz")
66
{
77
builder.UseEntityTypeConfigurations(context =>
88
{

tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@
2222

2323
<ItemGroup Label="xUnit">
2424
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0-preview-20211130-02" />
25+
<PackageReference Include="MySql.Data" Version="8.0.31" />
2526
<PackageReference Include="Quartz" Version="3.5.0" />
2627
<PackageReference Include="Quartz.Serialization.Json" Version="3.5.0" />
28+
<PackageReference Include="TestEnvironment.Docker.Containers.Postgres" Version="2.1.5" />
29+
<PackageReference Include="TestEnvironment.Docker.Containers.Mssql" Version="2.1.6" />
2730
<PackageReference Include="xunit" Version="2.4.2-pre.12" />
2831
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
2932
<PrivateAssets>all</PrivateAssets>

tests/AppAny.Quartz.EntityFrameworkCore.Migrations.Tests/Base/ConnectionStrings.cs

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
3+
using TestEnvironment.Docker;
4+
using TestEnvironment.Docker.Containers.Mssql;
5+
using TestEnvironment.Docker.Containers.Postgres;
6+
using Xunit;
7+
8+
namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.Base
9+
{
10+
public class TestFixture : IAsyncLifetime
11+
{
12+
private const string SQL_SA_PASSWORD = "Admin1234.";
13+
private const string MYSQL_ROOT_PASSWORD = "password";
14+
15+
private readonly IDockerEnvironment _dockerEnvironment = new DockerEnvironmentBuilder()
16+
.AddPostgresContainer(
17+
p => p with
18+
{
19+
Name = "postgres"
20+
})
21+
.AddContainer(
22+
p => p with
23+
{
24+
ImageName = "mysql",
25+
Name = "mysql",
26+
EnvironmentVariables = new Dictionary<string, string>
27+
{
28+
{ "MYSQL_ROOT_PASSWORD", MYSQL_ROOT_PASSWORD }
29+
},
30+
ExposedPorts = new List<ushort>
31+
{
32+
3306
33+
}
34+
})
35+
.AddMssqlContainer(
36+
p => p with
37+
{
38+
Name = "sqlserver",
39+
ImageName = "mcr.microsoft.com/azure-sql-edge",
40+
SAPassword = SQL_SA_PASSWORD
41+
})
42+
.Build();
43+
44+
public string PostgreSqlConnectionString { get; private set; } = null!;
45+
public string SqlServerConnectionString { get; private set; } = null!;
46+
public string MySqlConnectionString { get; private set; } = null!;
47+
48+
public async Task InitializeAsync()
49+
{
50+
await _dockerEnvironment.UpAsync();
51+
52+
// set connection string for integration tests
53+
PostgreSqlConnectionString =
54+
_dockerEnvironment.GetContainer<PostgresContainer>("postgres")!.GetConnectionString();
55+
56+
MySqlConnectionString =
57+
$"server=localhost; port={_dockerEnvironment.GetContainer("mysql")!.Ports![3306]}; database=test; uid=root; pwd=password;";
58+
59+
SqlServerConnectionString =
60+
$"{_dockerEnvironment.GetContainer<MssqlContainer>("sqlserver")!.GetConnectionString()}Initial catalog=test";
61+
}
62+
63+
public async Task DisposeAsync()
64+
{
65+
await _dockerEnvironment.DownAsync();
66+
await _dockerEnvironment.DisposeAsync();
67+
}
68+
69+
[CollectionDefinition(nameof(ClientCollection))]
70+
public class ClientCollection : ICollectionFixture<TestFixture>
71+
{
72+
}
73+
}
74+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.Base;
4+
using Microsoft.EntityFrameworkCore;
5+
using Quartz;
6+
using Xunit;
7+
8+
namespace AppAny.Quartz.EntityFrameworkCore.Migrations.Tests.MySQL
9+
{
10+
[Collection(nameof(TestFixture.ClientCollection))]
11+
public class MySqlIntegrationDbContextIntegrationTests : IDisposable
12+
{
13+
private readonly MySqlIntegrationDbContext _dbContext;
14+
private readonly string _connectionString;
15+
16+
public MySqlIntegrationDbContextIntegrationTests(TestFixture testFixture)
17+
{
18+
_connectionString = testFixture.MySqlConnectionString;
19+
20+
var options = new DbContextOptionsBuilder<MySqlIntegrationDbContext>()
21+
.UseMySql(
22+
_connectionString,
23+
ServerVersion.AutoDetect(testFixture.MySqlConnectionString))
24+
.Options;
25+
26+
_dbContext = new MySqlIntegrationDbContext(options);
27+
}
28+
29+
[Fact]
30+
public async Task ShouldBuildScheduler()
31+
{
32+
// Arrange
33+
await _dbContext.Database.EnsureCreatedAsync();
34+
await _dbContext.Database.MigrateAsync();
35+
36+
// Act
37+
var scheduler = await SchedulerBuilder.Create()
38+
.UseDefaultThreadPool(x => x.MaxConcurrency = 5)
39+
.UsePersistentStore(
40+
x =>
41+
{
42+
x.PerformSchemaValidation = true;
43+
x.UseMySql(_connectionString);
44+
x.UseJsonSerializer();
45+
})
46+
.BuildScheduler();
47+
48+
var exception = await Record.ExceptionAsync(async () => await scheduler.Start());
49+
50+
// Assert
51+
Assert.Null(exception);
52+
Assert.True(scheduler.IsStarted);
53+
54+
await scheduler.Shutdown();
55+
Assert.True(scheduler.IsShutdown);
56+
}
57+
58+
public void Dispose()
59+
{
60+
_dbContext.Database.EnsureDeleted();
61+
_dbContext.Dispose();
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)