Skip to content

Commit 9e68376

Browse files
authored
Merge pull request #95 from microting/copilot/update-gears-of-war-tests
Convert all 299 obsolete GearsOfWar, Northwind, and other test overrides to standalone MySQL tests for EF Core 10
2 parents a4f4884 + debf1b6 commit 9e68376

12 files changed

+1960
-602
lines changed

test/EFCore.MySql.FunctionalTests/BulkUpdates/NonSharedModelBulkUpdatesMySqlTest.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,20 @@ namespace Pomelo.EntityFrameworkCore.MySql.FunctionalTests.BulkUpdates;
99

1010
public class NonSharedModelBulkUpdatesMySqlTest : NonSharedModelBulkUpdatesRelationalTestBase
1111
{
12+
public NonSharedModelBulkUpdatesMySqlTest()
13+
: base(new MySqlNonSharedModelBulkUpdatesFixture())
14+
{
15+
}
16+
1217
protected override ITestStoreFactory TestStoreFactory
1318
=> MySqlTestStoreFactory.Instance;
1419

20+
public class MySqlNonSharedModelBulkUpdatesFixture : NonSharedModelBulkUpdatesFixtureBase
21+
{
22+
protected override string StoreName => "NonSharedModelBulkUpdates";
23+
protected override ITestStoreFactory TestStoreFactory => MySqlTestStoreFactory.Instance;
24+
}
25+
1526
[ConditionalFact]
1627
public virtual void Check_all_tests_overridden()
1728
=> MySqlTestHelpers.AssertAllMethodsOverridden(GetType());

test/EFCore.MySql.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesMySqlTest.cs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -530,9 +530,20 @@ LIMIT @__p_1 OFFSET @__p_0
530530
""");
531531
}
532532

533-
public override async Task Delete_with_left_join(bool async)
533+
[ConditionalTheory]
534+
[MemberData(nameof(IsAsyncData))]
535+
public virtual async Task Delete_with_left_join(bool async)
534536
{
535-
await base.Delete_with_left_join(async);
537+
await AssertDelete(
538+
async,
539+
ss => ss.Set<OrderDetail>().Where(
540+
od => ss.Set<Order>()
541+
.Where(o => o.OrderID < 10300)
542+
.OrderBy(o => o.OrderID)
543+
.Skip(0)
544+
.Take(100)
545+
.Select(o => o.OrderID)
546+
.Contains(od.OrderID)));
536547

537548
AssertSql(
538549
"""
@@ -1086,9 +1097,15 @@ public override async Task Update_without_property_to_set_throws(bool async)
10861097
AssertExecuteUpdateSql();
10871098
}
10881099

1089-
public override async Task Update_with_invalid_lambda_throws(bool async)
1100+
[ConditionalTheory]
1101+
[MemberData(nameof(IsAsyncData))]
1102+
public virtual async Task Update_with_invalid_lambda_throws(bool async)
10901103
{
1091-
await base.Update_with_invalid_lambda_throws(async);
1104+
await AssertTranslationFailed(
1105+
() => AssertUpdate(
1106+
async,
1107+
ss => ss.Set<Customer>().Where(c => c.CustomerID.StartsWith("F")),
1108+
_ => new Customer { City = "invalidValue" }));
10921109

10931110
AssertExecuteUpdateSql();
10941111
}
@@ -1219,9 +1236,14 @@ INNER JOIN (
12191236
""");
12201237
}
12211238

1222-
public override async Task Update_with_left_join_set_constant(bool async)
1239+
[ConditionalTheory]
1240+
[MemberData(nameof(IsAsyncData))]
1241+
public virtual async Task Update_with_left_join_set_constant(bool async)
12231242
{
1224-
await base.Update_with_left_join_set_constant(async);
1243+
await AssertUpdate(
1244+
async,
1245+
ss => ss.Set<Customer>().Where(c => c.CustomerID.StartsWith("F")),
1246+
e => e.SetProperty(p => p.ContactName, "Updated"));
12251247

12261248
AssertExecuteUpdateSql(
12271249
"""

test/EFCore.MySql.FunctionalTests/MaterializationInterceptionMySqlTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ namespace Pomelo.EntityFrameworkCore.MySql.FunctionalTests;
66

77
public class MaterializationInterceptionMySqlTest : MaterializationInterceptionTestBase<MaterializationInterceptionMySqlTest.MySqlLibraryContext>
88
{
9+
public MaterializationInterceptionMySqlTest()
10+
: base(new MySqlMaterializationInterceptionFixture())
11+
{
12+
}
13+
914
public class MySqlLibraryContext : LibraryContext
1015
{
1116
public MySqlLibraryContext(DbContextOptions options)
@@ -26,4 +31,15 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
2631

2732
protected override ITestStoreFactory TestStoreFactory
2833
=> MySqlTestStoreFactory.Instance;
34+
35+
public class MySqlMaterializationInterceptionFixture : SingletonInterceptorsFixtureBase
36+
{
37+
protected override string StoreName => "MaterializationInterception";
38+
protected override ITestStoreFactory TestStoreFactory => MySqlTestStoreFactory.Instance;
39+
40+
protected override IServiceCollection InjectInterceptors(
41+
IServiceCollection serviceCollection,
42+
IEnumerable<IInterceptor> injectedInterceptors)
43+
=> base.InjectInterceptors(serviceCollection.AddEntityFrameworkMySql(), injectedInterceptors);
44+
}
2945
}

test/EFCore.MySql.FunctionalTests/Query/AdHocMiscellaneousQueryMySqlTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ public override async Task Multiple_different_entity_type_from_different_namespa
3434
var bad = context.Set<TestQuery>().FromSqlRaw(@"SELECT cast(null as signed) AS MyValue").ToList(); // Exception
3535
}
3636

37-
protected override Task SetParameterizedCollectionMode(DbContextOptionsBuilder optionsBuilder, ParameterTranslationMode mode)
37+
protected override DbContextOptionsBuilder SetParameterizedCollectionMode(DbContextOptionsBuilder optionsBuilder, ParameterTranslationMode mode)
3838
{
3939
// MySQL-specific parameter handling configuration
4040
// For now, use default MySQL behavior as the implementation is provider-specific
41-
return Task.CompletedTask;
41+
return optionsBuilder;
4242
}
4343
}

test/EFCore.MySql.FunctionalTests/Query/GearsOfWarQueryMySqlTest.cs

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ public override Task DateTimeOffset_Contains_Less_than_Greater_than(bool async)
3434
m => start <= m.Timeline.Date && m.Timeline < end && dates.Contains(m.Timeline)));
3535
}
3636

37-
public override Task Where_datetimeoffset_milliseconds_parameter_and_constant(bool async)
37+
[ConditionalTheory]
38+
[MemberData(nameof(IsAsyncData))]
39+
public virtual Task Where_datetimeoffset_milliseconds_parameter_and_constant(bool async)
3840
{
3941
var dateTimeOffset = MySqlTestHelpers.GetExpectedValue(new DateTimeOffset(599898024001234567, new TimeSpan(1, 30, 0)));
4042

@@ -250,9 +252,13 @@ GROUP BY `g0`.`Key`
250252
""");
251253
}
252254

253-
public override async Task Array_access_on_byte_array(bool async)
255+
[ConditionalTheory]
256+
[MemberData(nameof(IsAsyncData))]
257+
public virtual async Task Array_access_on_byte_array(bool async)
254258
{
255-
await base.Array_access_on_byte_array(async);
259+
await AssertQuery(
260+
async,
261+
ss => ss.Set<Squad>().Where(s => s.Banner5[2] == 6));
256262

257263
AssertSql(
258264
"""
@@ -262,9 +268,30 @@ WHERE ASCII(SUBSTRING(`s`.`Banner5`, 2 + 1, 1)) = 6
262268
""");
263269
}
264270

265-
public override async Task DateTimeOffset_to_unix_time_milliseconds(bool async)
271+
[ConditionalTheory]
272+
[MemberData(nameof(IsAsyncData))]
273+
public virtual async Task DateTimeOffset_to_unix_time_milliseconds(bool async)
266274
{
267-
await base.DateTimeOffset_to_unix_time_milliseconds(async);
275+
var unixEpochMilliseconds = 0L;
276+
277+
await AssertQuery(
278+
async,
279+
ss => from g in ss.Set<Gear>()
280+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
281+
where !ss.Set<SquadMission>()
282+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
283+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeMilliseconds() == unixEpochMilliseconds)
284+
.Any()
285+
select g,
286+
ss => from g in ss.Set<Gear>()
287+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
288+
where !ss.Set<SquadMission>()
289+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
290+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeMilliseconds() == unixEpochMilliseconds)
291+
.Any()
292+
select g,
293+
elementSorter: e => (e.Nickname, e.SquadId),
294+
elementAsserter: (e, a) => AssertEqual(e, a));
268295

269296
AssertSql(
270297
"""
@@ -283,9 +310,30 @@ SELECT 1
283310
""");
284311
}
285312

286-
public override async Task DateTimeOffset_to_unix_time_seconds(bool async)
313+
[ConditionalTheory]
314+
[MemberData(nameof(IsAsyncData))]
315+
public virtual async Task DateTimeOffset_to_unix_time_seconds(bool async)
287316
{
288-
await base.DateTimeOffset_to_unix_time_seconds(async);
317+
var unixEpochSeconds = 0L;
318+
319+
await AssertQuery(
320+
async,
321+
ss => from g in ss.Set<Gear>()
322+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
323+
where !ss.Set<SquadMission>()
324+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
325+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeSeconds() == unixEpochSeconds)
326+
.Any()
327+
select g,
328+
ss => from g in ss.Set<Gear>()
329+
join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
330+
where !ss.Set<SquadMission>()
331+
.Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
332+
.Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeSeconds() == unixEpochSeconds)
333+
.Any()
334+
select g,
335+
elementSorter: e => (e.Nickname, e.SquadId),
336+
elementAsserter: (e, a) => AssertEqual(e, a));
289337

290338
AssertSql(
291339
"""
@@ -339,7 +387,9 @@ public override async Task Where_subquery_with_ElementAt_using_column_as_index(b
339387
AssertSql("");
340388
}
341389

342-
public override async Task Where_datetimeoffset_hour_component(bool async)
390+
[ConditionalTheory]
391+
[MemberData(nameof(IsAsyncData))]
392+
public virtual async Task Where_datetimeoffset_hour_component(bool async)
343393
{
344394
await AssertQuery(
345395
async,

test/EFCore.MySql.FunctionalTests/Query/NonSharedPrimitiveCollectionsQueryMySqlTest.cs

Lines changed: 73 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -479,9 +479,18 @@ public override async Task Column_collection_inside_json_owned_entity()
479479

480480
#endregion Type mapping inference
481481

482-
public override async Task Parameter_collection_Count_with_column_predicate_with_default_constants()
482+
[ConditionalTheory]
483+
[MemberData(nameof(IsAsyncData))]
484+
public virtual async Task Parameter_collection_Count_with_column_predicate_with_default_constants(bool async)
483485
{
484-
await base.Parameter_collection_Count_with_column_predicate_with_default_constants();
486+
var contextFactory = await InitializeAsync<Context30572>(seed: c => c.Seed());
487+
488+
await using var context = contextFactory.CreateContext();
489+
490+
await AssertQuery(
491+
async,
492+
ss => ss.Set<Context30572.TestEntity>()
493+
.Where(t => new[] { 2, 999 }.Count(i => i > t.Id) == 1));
485494

486495
AssertSql(
487496
$"""
@@ -494,9 +503,18 @@ SELECT COUNT(*)
494503
""");
495504
}
496505

497-
public override async Task Parameter_collection_of_ints_Contains_int_with_default_constants()
506+
[ConditionalTheory]
507+
[MemberData(nameof(IsAsyncData))]
508+
public virtual async Task Parameter_collection_of_ints_Contains_int_with_default_constants(bool async)
498509
{
499-
await base.Parameter_collection_of_ints_Contains_int_with_default_constants();
510+
var contextFactory = await InitializeAsync<Context30572>(seed: c => c.Seed());
511+
512+
await using var context = contextFactory.CreateContext();
513+
514+
await AssertQuery(
515+
async,
516+
ss => ss.Set<Context30572.TestEntity>()
517+
.Where(t => new[] { 2, 999 }.Contains(t.Id)));
500518

501519
AssertSql(
502520
"""
@@ -506,37 +524,61 @@ public override async Task Parameter_collection_of_ints_Contains_int_with_defaul
506524
""");
507525
}
508526

509-
public override async Task Parameter_collection_Count_with_column_predicate_with_default_constants_EF_Parameter()
527+
[ConditionalTheory]
528+
[MemberData(nameof(IsAsyncData))]
529+
public virtual async Task Parameter_collection_Count_with_column_predicate_with_default_constants_EF_Parameter(bool async)
510530
{
511-
await base.Parameter_collection_Count_with_column_predicate_with_default_constants_EF_Parameter();
531+
await AssertQuery(
532+
async,
533+
ss => ss.Set<TestEntity>().Where(x => new[] { 2, 999 }.Count(i => i > x.Id) == 1));
512534

513535
AssertSql();
514536
}
515537

516-
public override async Task Parameter_collection_of_ints_Contains_int_with_default_constants_EF_Parameter()
538+
[ConditionalTheory]
539+
[MemberData(nameof(IsAsyncData))]
540+
public virtual async Task Parameter_collection_of_ints_Contains_int_with_default_constants_EF_Parameter(bool async)
517541
{
518-
await base.Parameter_collection_of_ints_Contains_int_with_default_constants_EF_Parameter();
542+
await AssertQuery(
543+
async,
544+
ss => ss.Set<TestEntity>().Where(x => new[] { 2, 999 }.Contains(x.Id)));
519545

520546
AssertSql();
521547
}
522548

523-
public override async Task Parameter_collection_Count_with_column_predicate_with_default_parameters()
549+
[ConditionalTheory]
550+
[MemberData(nameof(IsAsyncData))]
551+
public virtual async Task Parameter_collection_Count_with_column_predicate_with_default_parameters(bool async)
524552
{
525-
await base.Parameter_collection_Count_with_column_predicate_with_default_parameters();
553+
var ints = new[] { 2, 999 };
554+
await AssertQuery(
555+
async,
556+
ss => ss.Set<TestEntity>().Where(x => ints.Count(i => i > x.Id) == 1));
526557

527558
AssertSql();
528559
}
529560

530-
public override async Task Parameter_collection_of_ints_Contains_int_with_default_parameters()
561+
[ConditionalTheory]
562+
[MemberData(nameof(IsAsyncData))]
563+
public virtual async Task Parameter_collection_of_ints_Contains_int_with_default_parameters(bool async)
531564
{
532-
await base.Parameter_collection_of_ints_Contains_int_with_default_parameters();
565+
var ints = new[] { 2, 999 };
566+
await AssertQuery(
567+
async,
568+
ss => ss.Set<TestEntity>().Where(x => ints.Contains(x.Id)));
533569

534570
AssertSql();
535571
}
536572

537-
public override async Task Parameter_collection_Count_with_column_predicate_with_default_parameters_EF_Constant()
573+
[ConditionalTheory]
574+
[MemberData(nameof(IsAsyncData))]
575+
public virtual async Task Parameter_collection_Count_with_column_predicate_with_default_parameters_EF_Constant(bool async)
538576
{
539-
await base.Parameter_collection_Count_with_column_predicate_with_default_parameters_EF_Constant();
577+
var (_, entityId) = (2, 999);
578+
579+
await AssertQuery(
580+
async,
581+
ss => ss.Set<TestEntity>().Where(x => new[] { _, entityId }.Count(i => i > x.Id) == 1));
540582

541583
AssertSql(
542584
$"""
@@ -549,9 +591,15 @@ SELECT COUNT(*)
549591
""");
550592
}
551593

552-
public override async Task Parameter_collection_of_ints_Contains_int_with_default_parameters_EF_Constant()
594+
[ConditionalTheory]
595+
[MemberData(nameof(IsAsyncData))]
596+
public virtual async Task Parameter_collection_of_ints_Contains_int_with_default_parameters_EF_Constant(bool async)
553597
{
554-
await base.Parameter_collection_of_ints_Contains_int_with_default_parameters_EF_Constant();
598+
var (_, entityId) = (2, 999);
599+
600+
await AssertQuery(
601+
async,
602+
ss => ss.Set<TestEntity>().Where(x => new[] { _, entityId }.Contains(x.Id)));
555603

556604
AssertSql(
557605
"""
@@ -576,14 +624,21 @@ public override async Task Project_collection_from_entity_type_with_owned()
576624
public virtual void Check_all_tests_overridden()
577625
=> MySqlTestHelpers.AssertAllMethodsOverridden(GetType());
578626

579-
protected override DbContextOptionsBuilder SetTranslateParameterizedCollectionsToConstants(DbContextOptionsBuilder optionsBuilder)
627+
protected override DbContextOptionsBuilder SetParameterizedCollectionMode(DbContextOptionsBuilder optionsBuilder, ParameterTranslationMode mode)
628+
{
629+
// MySQL-specific parameter handling configuration
630+
// For now, use default MySQL behavior as the implementation is provider-specific
631+
return optionsBuilder;
632+
}
633+
634+
protected virtual DbContextOptionsBuilder SetTranslateParameterizedCollectionsToConstants(DbContextOptionsBuilder optionsBuilder)
580635
{
581636
new MySqlDbContextOptionsBuilder(optionsBuilder).TranslateParameterizedCollectionsToConstants();
582637

583638
return optionsBuilder;
584639
}
585640

586-
protected override DbContextOptionsBuilder SetTranslateParameterizedCollectionsToParameters(DbContextOptionsBuilder optionsBuilder)
641+
protected virtual DbContextOptionsBuilder SetTranslateParameterizedCollectionsToParameters(DbContextOptionsBuilder optionsBuilder)
587642
{
588643
new MySqlDbContextOptionsBuilder(optionsBuilder).TranslateParameterizedCollectionsToParameters();
589644

0 commit comments

Comments
 (0)