You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
EntityFrameworkCore.Jet/test/EFCore.Jet.FunctionalTests/BulkUpdates/TPHInheritanceBulkUpdatesJe...

293 lines
7.2 KiB
C#

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore.BulkUpdates;
using Microsoft.EntityFrameworkCore.TestUtilities;
using Xunit;
using Xunit.Abstractions;
namespace EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates;
public class TPHInheritanceBulkUpdatesJetTest(
TPHInheritanceBulkUpdatesJetFixture fixture,
ITestOutputHelper testOutputHelper)
: TPHInheritanceBulkUpdatesTestBase<TPHInheritanceBulkUpdatesJetFixture>(fixture, testOutputHelper)
{
[ConditionalFact]
public virtual void Check_all_tests_overridden()
=> TestHelpers.AssertAllMethodsOverridden(GetType());
public override async Task Delete_where_hierarchy(bool async)
{
await base.Delete_where_hierarchy(async);
AssertSql(
"""
DELETE FROM `Animals` AS `a`
WHERE `a`.`Name` = 'Great spotted kiwi'
""");
}
public override async Task Delete_where_hierarchy_derived(bool async)
{
await base.Delete_where_hierarchy_derived(async);
AssertSql(
"""
DELETE FROM `Animals` AS `a`
WHERE `a`.`Discriminator` = 'Kiwi' AND `a`.`Name` = 'Great spotted kiwi'
""");
}
public override async Task Delete_where_using_hierarchy(bool async)
{
await base.Delete_where_using_hierarchy(async);
AssertSql(
"""
DELETE FROM `Countries` AS `c`
WHERE (
SELECT COUNT(*)
FROM `Animals` AS `a`
WHERE `c`.`Id` = `a`.`CountryId` AND `a`.`CountryId` > 0) > 0
""");
}
public override async Task Delete_where_using_hierarchy_derived(bool async)
{
await base.Delete_where_using_hierarchy_derived(async);
AssertSql(
"""
DELETE FROM `Countries` AS `c`
WHERE (
SELECT COUNT(*)
FROM `Animals` AS `a`
WHERE `c`.`Id` = `a`.`CountryId` AND `a`.`Discriminator` = 'Kiwi' AND `a`.`CountryId` > 0) > 0
""");
}
public override async Task Delete_GroupBy_Where_Select_First(bool async)
{
await base.Delete_GroupBy_Where_Select_First(async);
AssertSql();
}
public override async Task Delete_GroupBy_Where_Select_First_2(bool async)
{
await base.Delete_GroupBy_Where_Select_First_2(async);
AssertSql();
}
public override async Task Delete_GroupBy_Where_Select_First_3(bool async)
{
await base.Delete_GroupBy_Where_Select_First_3(async);
AssertSql(
"""
DELETE FROM [a]
FROM [Animals] AS [a]
WHERE [a].[Id] IN (
SELECT (
SELECT TOP(1) [a1].[Id]
FROM [Animals] AS [a1]
WHERE [a0].[CountryId] = [a1].[CountryId])
FROM [Animals] AS [a0]
GROUP BY [a0].[CountryId]
HAVING COUNT(*) < 3
)
""");
}
public override async Task Delete_where_keyless_entity_mapped_to_sql_query(bool async)
{
await base.Delete_where_keyless_entity_mapped_to_sql_query(async);
AssertSql();
}
public override async Task Delete_where_hierarchy_subquery(bool async)
{
await base.Delete_where_hierarchy_subquery(async);
AssertSql(
"""
DELETE FROM `Animals` AS `a`
WHERE `a`.`Id` IN (
SELECT `a2`.`Id`
FROM (
SELECT TOP @p0 `a1`.`Id`, `a1`.`Name`
FROM (
SELECT TOP @p + @p0 `a0`.`Id`, `a0`.`Name`
FROM `Animals` AS `a0`
WHERE `a0`.`Name` = 'Great spotted kiwi'
ORDER BY `a0`.`Name`
) AS `a1`
ORDER BY `a1`.`Name` DESC
) AS `a2`
ORDER BY `a2`.`Name`
)
""");
}
public override async Task Update_base_type(bool async)
{
await base.Update_base_type(async);
AssertExecuteUpdateSql(
"""
@p='Animal' (Size = 255)
UPDATE `Animals` AS `a`
SET `a`.`Name` = @p
WHERE `a`.`Name` = 'Great spotted kiwi'
""");
}
public override async Task Update_base_type_with_OfType(bool async)
{
await base.Update_base_type_with_OfType(async);
AssertExecuteUpdateSql(
"""
@p='NewBird' (Size = 255)
UPDATE `Animals` AS `a`
SET `a`.`Name` = @p
WHERE `a`.`Discriminator` = 'Kiwi'
""");
}
public override async Task Update_where_hierarchy_subquery(bool async)
{
await base.Update_where_hierarchy_subquery(async);
AssertExecuteUpdateSql();
}
public override async Task Update_base_property_on_derived_type(bool async)
{
await base.Update_base_property_on_derived_type(async);
AssertExecuteUpdateSql(
"""
@p='SomeOtherKiwi' (Size = 255)
UPDATE `Animals` AS `a`
SET `a`.`Name` = @p
WHERE `a`.`Discriminator` = 'Kiwi'
""");
}
public override async Task Update_derived_property_on_derived_type(bool async)
{
await base.Update_derived_property_on_derived_type(async);
AssertExecuteUpdateSql(
"""
@p='0' (Size = 1)
UPDATE `Animals` AS `a`
SET `a`.`FoundOn` = @p
WHERE `a`.`Discriminator` = 'Kiwi'
""");
}
public override async Task Update_where_using_hierarchy(bool async)
{
await base.Update_where_using_hierarchy(async);
AssertExecuteUpdateSql(
"""
@p='Monovia' (Size = 255)
UPDATE `Countries` AS `c`
SET `c`.`Name` = @p
WHERE (
SELECT COUNT(*)
FROM `Animals` AS `a`
WHERE `c`.`Id` = `a`.`CountryId` AND `a`.`CountryId` > 0) > 0
""");
}
public override async Task Update_base_and_derived_types(bool async)
{
await base.Update_base_and_derived_types(async);
AssertExecuteUpdateSql(
"""
@p='Kiwi' (Size = 255)
@p0='0' (Size = 1)
UPDATE `Animals` AS `a`
SET `a`.`Name` = @p,
`a`.`FoundOn` = @p0
WHERE `a`.`Discriminator` = 'Kiwi'
""");
}
public override async Task Update_where_using_hierarchy_derived(bool async)
{
await base.Update_where_using_hierarchy_derived(async);
AssertExecuteUpdateSql(
"""
@p='Monovia' (Size = 255)
UPDATE `Countries` AS `c`
SET `c`.`Name` = @p
WHERE (
SELECT COUNT(*)
FROM `Animals` AS `a`
WHERE `c`.`Id` = `a`.`CountryId` AND `a`.`Discriminator` = 'Kiwi' AND `a`.`CountryId` > 0) > 0
""");
}
public override async Task Update_where_keyless_entity_mapped_to_sql_query(bool async)
{
await base.Update_where_keyless_entity_mapped_to_sql_query(async);
AssertExecuteUpdateSql();
}
public override async Task Update_with_interface_in_property_expression(bool async)
{
await base.Update_with_interface_in_property_expression(async);
AssertExecuteUpdateSql(
"""
@p='0'
UPDATE `Drinks` AS `d`
SET `d`.`SugarGrams` = @p
WHERE `d`.`Discriminator` = 1
""");
}
public override async Task Update_with_interface_in_EF_Property_in_property_expression(bool async)
{
await base.Update_with_interface_in_EF_Property_in_property_expression(async);
AssertExecuteUpdateSql(
"""
@p='0'
UPDATE `Drinks` AS `d`
SET `d`.`SugarGrams` = @p
WHERE `d`.`Discriminator` = 1
""");
}
protected override void ClearLog()
=> Fixture.TestSqlLoggerFactory.Clear();
private void AssertSql(params string[] expected)
=> Fixture.TestSqlLoggerFactory.AssertBaseline(expected);
private void AssertExecuteUpdateSql(params string[] expected)
=> Fixture.TestSqlLoggerFactory.AssertBaseline(expected, forUpdate: true);
}