using Jiaowu.Api.Infrastructure.Persistence; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; namespace Jiaowu.Api.Tests; public sealed class MySqlMigrationTests { private const string LatestMigration = "20260725120917_ProductionSchemaCompletion"; [Fact] public void Production_migration_is_discoverable_and_generates_mysql_sql() { var options = CreateMySqlOptions(); using var db = new AppDbContext(options); Assert.Contains(LatestMigration, db.Database.GetMigrations()); var script = db.GetService().GenerateScript( fromMigration: "20260725040310_SchedulePublishJobs", toMigration: LatestMigration); Assert.Contains("CREATE TABLE `GradeItems`", script); Assert.Contains("CREATE TABLE `EvaluationSetups`", script); Assert.Contains("CREATE TABLE `WarningRules`", script); Assert.Contains("SET `ExamDate` = DATE(`StartsAt`)", script); Assert.Contains("DEFAULT 1", script); Assert.DoesNotContain("0001-01-01", script); Assert.DoesNotContain("0000-00-00", script); } [Fact] public void MySql_date_properties_use_datetime_provider_conversion() { using var db = new AppDbContext(CreateMySqlOptions()); var dateProperties = db.Model.GetEntityTypes() .SelectMany(x => x.GetProperties()) .Where(x => x.ClrType == typeof(DateOnly) || x.ClrType == typeof(DateOnly?)) .ToList(); Assert.NotEmpty(dateProperties); Assert.All(dateProperties, property => { Assert.Equal("date", property.GetColumnType()); Assert.Equal( typeof(DateTime), property.GetTypeMapping().Converter?.ProviderClrType); }); } [Fact] public void MySql_guid_collections_use_provider_safe_predicates() { using var db = new AppDbContext(CreateMySqlOptions()); var ids = new[] { Guid.Parse("11111111-1111-1111-1111-111111111111"), Guid.Parse("22222222-2222-2222-2222-222222222222") }; var sql = db.Colleges .WhereIn(ids, x => x.Id) .ToQueryString(); Assert.Contains(" IN (", sql, StringComparison.OrdinalIgnoreCase); Assert.Contains(ids[0].ToString(), sql, StringComparison.OrdinalIgnoreCase); Assert.Contains(ids[1].ToString(), sql, StringComparison.OrdinalIgnoreCase); } private static DbContextOptions CreateMySqlOptions() => new DbContextOptionsBuilder() .UseMySQL( "Server=localhost;Database=jiaowu;User=__test__;Password=__not_used__;") .Options; }