Skip to content

Commit 7b9abfe

Browse files
committed
update tests
1 parent 437ebae commit 7b9abfe

42 files changed

Lines changed: 1605 additions & 27 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Directory.Packages.props

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
<PackageVersion Include="dbup-postgresql" Version="4.5.0" />
1313
<PackageVersion Include="dbup-sqlserver" Version="7.2.0" />
1414
<PackageVersion Include="FluentMigrator" Version="8.0.1" />
15+
<PackageVersion Include="FluentMigrator.Runner.MySql" Version="8.0.1" />
16+
<PackageVersion Include="FluentMigrator.Runner.Postgres" Version="8.0.1" />
17+
<PackageVersion Include="FluentMigrator.Runner.SQLite" Version="8.0.1" />
1518
<PackageVersion Include="FluentMigrator.Runner.SqlServer" Version="8.0.1" />
1619
<PackageVersion Include="FluentValidation" Version="12.1.1" />
1720
<PackageVersion Include="Humanizer.Core" Version="3.0.10" />

src/EntityFrameworkCore.Generator.Core/Templates/EntityClassTemplate.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,10 @@ private void GenerateClass()
6565
}
6666
if (Options.Data.Entity.MappingAttributes)
6767
{
68-
CodeBuilder.AppendLine($"[Table(\"{_entity.TableName}\", Schema = \"{_entity.TableSchema}\")]");
68+
if (_entity.TableSchema.HasValue())
69+
CodeBuilder.AppendLine($"[Table(\"{_entity.TableName}\", Schema = \"{_entity.TableSchema}\")]");
70+
else
71+
CodeBuilder.AppendLine($"[Table(\"{_entity.TableName}\")]");
6972
}
7073
CodeBuilder.AppendLine($"public partial class {entityClass}");
7174

src/EntityFrameworkCore.Generator.Core/Templates/MappingClassTemplate.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,13 @@ private void GenerateConstants()
9999
using (CodeBuilder.Indent())
100100
{
101101

102-
if (Options.Data.Mapping.Document)
103-
CodeBuilder.AppendLine($"/// <summary>Table Schema name constant for entity <see cref=\"{safeName}\" /></summary>");
102+
if (_entity.TableSchema.HasValue())
103+
{
104+
if (Options.Data.Mapping.Document)
105+
CodeBuilder.AppendLine($"/// <summary>Table Schema name constant for entity <see cref=\"{safeName}\" /></summary>");
104106

105-
CodeBuilder.AppendLine($"public const string Schema = \"{_entity.TableSchema}\";");
107+
CodeBuilder.AppendLine($"public const string Schema = \"{_entity.TableSchema}\";");
108+
}
106109

107110
if (Options.Data.Mapping.Document)
108111
CodeBuilder.AppendLine($"/// <summary>Table Name constant for entity <see cref=\"{safeName}\" /></summary>");

test/EntityFrameworkCore.Generator.MySql.Tests/Class1.cs

Lines changed: 0 additions & 6 deletions
This file was deleted.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using EntityFrameworkCore.Generator.MySql.Tests.Fixtures;
2+
3+
namespace EntityFrameworkCore.Generator.MySql.Tests;
4+
5+
[Collection(DatabaseCollection.CollectionName)]
6+
public abstract class DatabaseTestBase(DatabaseFixture databaseFixture)
7+
: TestHostBase<DatabaseFixture>(databaseFixture)
8+
{
9+
}

test/EntityFrameworkCore.Generator.MySql.Tests/EntityFrameworkCore.Generator.MySql.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@
1414

1515
<ItemGroup>
1616
<PackageReference Include="coverlet.MTP" />
17+
<PackageReference Include="FluentMigrator.Runner.MySql" />
18+
<PackageReference Include="Testcontainers.MySql" />
1719
<PackageReference Include="xunit.v3.mtp-v2" />
1820
</ItemGroup>
1921

2022
<ItemGroup>
2123
<ProjectReference Include="..\..\src\EntityFrameworkCore.Generator.Core\EntityFrameworkCore.Generator.Core.csproj" />
24+
<ProjectReference Include="..\..\src\EntityFrameworkCore.Generator\EntityFrameworkCore.Generator.csproj" />
2225
<ProjectReference Include="..\EntityFrameworkCore.Generator.Migrator\EntityFrameworkCore.Generator.Migrator.csproj" />
2326
</ItemGroup>
2427

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// support capturing console and trace output in xunit v3
2+
[assembly: CaptureConsole]
3+
[assembly: CaptureTrace]
4+
5+
namespace EntityFrameworkCore.Generator.MySql.Tests.Fixtures;
6+
7+
[CollectionDefinition(CollectionName)]
8+
public class DatabaseCollection : ICollectionFixture<DatabaseFixture>
9+
{
10+
public const string CollectionName = nameof(DatabaseCollection);
11+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
using EntityFrameworkCore.Generator.Migrator.Providers;
2+
3+
using FluentMigrator.Runner;
4+
5+
using Microsoft.Extensions.Configuration;
6+
using Microsoft.Extensions.DependencyInjection;
7+
using Microsoft.Extensions.DependencyInjection.Extensions;
8+
using Microsoft.Extensions.Hosting;
9+
10+
using MySqlConnector;
11+
12+
using Testcontainers.MySql;
13+
14+
using XUnit.Hosting.Logging;
15+
16+
namespace EntityFrameworkCore.Generator.MySql.Tests.Fixtures;
17+
18+
public class DatabaseFixture : TestApplicationFixture, IAsyncLifetime
19+
{
20+
private readonly MySqlContainer _mySqlContainer = new MySqlBuilder("mysql:8")
21+
.WithCommand("--log-bin-trust-function-creators=1")
22+
.Build();
23+
24+
public async ValueTask InitializeAsync()
25+
{
26+
await _mySqlContainer.StartAsync();
27+
}
28+
29+
public async ValueTask DisposeAsync()
30+
{
31+
await _mySqlContainer.DisposeAsync();
32+
GC.SuppressFinalize(this);
33+
}
34+
35+
public string? ConnectionString { get; set; }
36+
37+
public string? ContainerConnection { get; set; }
38+
39+
protected override void ConfigureApplication(HostApplicationBuilder builder)
40+
{
41+
base.ConfigureApplication(builder);
42+
43+
builder.Logging.AddMemoryLogger();
44+
45+
var services = builder.Services;
46+
47+
// change database from container default
48+
string containerConnection = _mySqlContainer.GetConnectionString();
49+
var connectionBuilder = new MySqlConnectionStringBuilder(containerConnection)
50+
{
51+
Database = "GeneratorTest"
52+
};
53+
54+
ConnectionString = connectionBuilder.ToString();
55+
ContainerConnection = containerConnection;
56+
57+
// override connection string to use docker container
58+
var configurationData = new Dictionary<string, string?>
59+
{
60+
["ConnectionStrings:GeneratorTest"] = ConnectionString,
61+
["ConnectionStrings:ContainerConnection"] = ContainerConnection
62+
};
63+
builder.Configuration.AddInMemoryCollection(configurationData);
64+
65+
services
66+
.AddFluentMigratorCore()
67+
.ConfigureRunner(rb => rb
68+
.AddMySql8()
69+
.WithGlobalConnectionString(ConnectionString)
70+
.ScanIn(typeof(MySqlDefault).Assembly, typeof(DatabaseFixture).Assembly)
71+
.For.All()
72+
);
73+
74+
services
75+
.TryAddSingleton<IProviderDefault, MySqlDefault>();
76+
77+
services
78+
.AddHostedService<DatabaseInitializer>();
79+
}
80+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
using FluentMigrator.Runner;
2+
3+
using Microsoft.Extensions.Configuration;
4+
using Microsoft.Extensions.Hosting;
5+
using Microsoft.Extensions.Logging;
6+
7+
using MySqlConnector;
8+
9+
namespace EntityFrameworkCore.Generator.MySql.Tests.Fixtures;
10+
11+
public class DatabaseInitializer : IHostedService
12+
{
13+
private readonly ILogger<DatabaseInitializer> _logger;
14+
private readonly IMigrationRunner _migrationRunner;
15+
private readonly IConfiguration _configuration;
16+
17+
public DatabaseInitializer(
18+
ILogger<DatabaseInitializer> logger,
19+
IMigrationRunner migrationRunner,
20+
IConfiguration configuration)
21+
{
22+
_logger = logger;
23+
_migrationRunner = migrationRunner;
24+
_configuration = configuration;
25+
}
26+
27+
public Task StartAsync(CancellationToken cancellationToken)
28+
{
29+
_logger.LogInformation(
30+
"Starting database migration for {DatabaseType}...",
31+
_migrationRunner.Processor.DatabaseType);
32+
33+
// ensure database exists before running migrations
34+
EnsureDatabase();
35+
36+
// run migrations
37+
_migrationRunner.MigrateUp();
38+
39+
return Task.CompletedTask;
40+
}
41+
42+
public Task StopAsync(CancellationToken cancellationToken)
43+
{
44+
return Task.CompletedTask;
45+
}
46+
47+
48+
private void EnsureDatabase()
49+
{
50+
_logger.LogInformation("Ensuring target database 'GeneratorTest' exists...");
51+
52+
// connect to database to create target database if it doesn't exist
53+
var connectionString = _configuration.GetConnectionString("ContainerConnection");
54+
55+
var connectionBuilder = new MySqlConnectionStringBuilder(connectionString!);
56+
var userId = EscapeMySqlString(connectionBuilder.UserID);
57+
connectionBuilder.UserID = "root";
58+
59+
using var connection = new MySqlConnection(connectionBuilder.ConnectionString);
60+
connection.Open();
61+
62+
using var command = connection.CreateCommand();
63+
command.CommandText = "CREATE DATABASE IF NOT EXISTS `GeneratorTest`;";
64+
65+
command.ExecuteNonQuery();
66+
67+
command.CommandText = $"GRANT ALL PRIVILEGES ON `GeneratorTest`.* TO '{userId}'@'%';";
68+
69+
command.ExecuteNonQuery();
70+
71+
connection.Close();
72+
}
73+
74+
private static string EscapeMySqlString(string value)
75+
{
76+
return value.Replace("'", "''", StringComparison.Ordinal);
77+
}
78+
}

0 commit comments

Comments
 (0)