Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Xunit.Sdk;

namespace Microsoft.EntityFrameworkCore;

Expand Down Expand Up @@ -113,9 +113,10 @@ FROM root c
""");
}

[Fact(Skip = "Issue#27678")]
public override void Optional_owned_with_converter_reading_non_nullable_column()
=> base.Optional_owned_with_converter_reading_non_nullable_column();
// Issue #34567
[Fact]
public override Task Optional_owned_with_converter_reading_non_nullable_column()
=> Assert.ThrowsAnyAsync<XunitException>(() => base.Optional_owned_with_converter_reading_non_nullable_column());

public override void Value_conversion_on_enum_collection_contains()
=> Assert.Contains(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ public override Task Same_entity_with_complex_type_projected_twice_with_pushdown
=> AssertTranslationFailed(() => base.Same_entity_with_complex_type_projected_twice_with_pushdown_as_part_of_another_projection(async));

public override Task Same_complex_type_projected_twice_with_pushdown_as_part_of_another_projection(bool async)
=> AssertTranslationFailedWithDetails(() => base.Same_complex_type_projected_twice_with_pushdown_as_part_of_another_projection(async), CosmosStrings.NonCorrelatedSubqueriesNotSupported);
=> AssertTranslationFailed(() => base.Same_complex_type_projected_twice_with_pushdown_as_part_of_another_projection(async));


#region GroupBy
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ public override Task Same_entity_with_complex_type_projected_twice_with_pushdown
=> AssertTranslationFailed(() => base.Same_entity_with_complex_type_projected_twice_with_pushdown_as_part_of_another_projection(async));

public override Task Same_complex_type_projected_twice_with_pushdown_as_part_of_another_projection(bool async)
=> AssertTranslationFailedWithDetails(() => base.Same_complex_type_projected_twice_with_pushdown_as_part_of_another_projection(async), CosmosStrings.NonCorrelatedSubqueriesNotSupported);
=> AssertTranslationFailed(() => base.Same_complex_type_projected_twice_with_pushdown_as_part_of_another_projection(async));


#region GroupBy
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.EntityFrameworkCore.InMemory.Internal;
using Xunit.Sdk;

namespace Microsoft.EntityFrameworkCore;

Expand All @@ -15,22 +16,21 @@ public override Task Optional_datetime_reading_null_from_database()
public override Task Can_insert_and_read_back_with_case_insensitive_string_key()
=> Task.CompletedTask;

[Fact(Skip = "Issue#17050")]
// FK constraint checking
public override void Value_conversion_with_property_named_value()
{
}
=> Assert.ThrowsAny<XunitException>(() => base.Value_conversion_with_property_named_value());

[Fact(Skip = "Issue#17050")]
// FK constraint checking
public override void Collection_property_as_scalar_Any()
=> base.Collection_property_as_scalar_Any();
=> Assert.ThrowsAny<XunitException>(() => base.Collection_property_as_scalar_Any());

[Fact(Skip = "Issue#17050")]
// FK constraint checking
public override void Collection_property_as_scalar_Count_member()
=> base.Collection_property_as_scalar_Count_member();
=> Assert.ThrowsAny<XunitException>(() => base.Collection_property_as_scalar_Count_member());

[Fact(Skip = "Issue#17050")]
// FK constraint checking
public override void Collection_enum_as_string_Contains()
=> base.Collection_enum_as_string_Contains();
=> Assert.ThrowsAny<XunitException>(() => base.Collection_enum_as_string_Contains());

public override void GroupBy_converted_enum()
=> Assert.Contains(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,77 +9,126 @@ public class ProxyGraphUpdatesInMemoryTest
public abstract class ProxyGraphUpdatesInMemoryTestBase<TFixture>(TFixture fixture) : ProxyGraphUpdatesTestBase<TFixture>(fixture)
where TFixture : ProxyGraphUpdatesInMemoryTestBase<TFixture>.ProxyGraphUpdatesInMemoryFixtureBase, new()
{
[Fact(Skip = "FK constraint checking. Issue #2166")]
// FK constraint checking.
[Fact]
public override Task Optional_one_to_one_relationships_are_one_to_one()
=> base.Optional_one_to_one_relationships_are_one_to_one();
=> Assert.ThrowsAnyAsync<Exception>(() => base.Optional_one_to_one_relationships_are_one_to_one());

[Fact(Skip = "FK constraint checking. Issue #2166")]
// FK constraint checking.
[Fact]
public override Task Optional_one_to_one_with_AK_relationships_are_one_to_one()
=> base.Optional_one_to_one_with_AK_relationships_are_one_to_one();
=> Assert.ThrowsAnyAsync<Exception>(() => base.Optional_one_to_one_with_AK_relationships_are_one_to_one());

[Theory(Skip = "Cascade delete. Issue #3924")]
// Cascade delete.
public override Task Optional_many_to_one_dependents_with_alternate_key_are_orphaned_in_store(
CascadeTiming cascadeDeleteTiming,
CascadeTiming deleteOrphansTiming)
=> base.Optional_many_to_one_dependents_with_alternate_key_are_orphaned_in_store(cascadeDeleteTiming, deleteOrphansTiming);
=> Assert.ThrowsAnyAsync<Exception>(() =>
base.Optional_many_to_one_dependents_with_alternate_key_are_orphaned_in_store(cascadeDeleteTiming, deleteOrphansTiming));

[Theory(Skip = "Cascade delete. Issue #3924")]
// Cascade delete.
public override Task Optional_many_to_one_dependents_are_orphaned_in_store(
CascadeTiming cascadeDeleteTiming,
CascadeTiming deleteOrphansTiming)
=> base.Optional_many_to_one_dependents_are_orphaned_in_store(cascadeDeleteTiming, deleteOrphansTiming);
=> Assert.ThrowsAnyAsync<Exception>(() =>
base.Optional_many_to_one_dependents_are_orphaned_in_store(cascadeDeleteTiming, deleteOrphansTiming));

[Theory(Skip = "Cascade delete. Issue #3924")]
// Cascade delete.
public override Task Required_one_to_one_are_cascade_detached_when_Added(
CascadeTiming cascadeDeleteTiming,
CascadeTiming deleteOrphansTiming)
=> base.Required_one_to_one_are_cascade_detached_when_Added(cascadeDeleteTiming, deleteOrphansTiming);

[Fact(Skip = "FK constraint checking. Issue #2166")]
=> DoesLazyLoading
&& DoesChangeTracking
&& cascadeDeleteTiming == CascadeTiming.Never
&& deleteOrphansTiming == CascadeTiming.Never
? base.Required_one_to_one_are_cascade_detached_when_Added(cascadeDeleteTiming, deleteOrphansTiming)
: Assert.ThrowsAnyAsync<Exception>(() =>
base.Required_one_to_one_are_cascade_detached_when_Added(cascadeDeleteTiming, deleteOrphansTiming));

// FK constraint checking.
[Fact]
public override Task Required_one_to_one_relationships_are_one_to_one()
=> base.Required_one_to_one_relationships_are_one_to_one();
=> Assert.ThrowsAnyAsync<Exception>(() => base.Required_one_to_one_relationships_are_one_to_one());

[Fact(Skip = "FK constraint checking. Issue #2166")]
// FK constraint checking.
[Fact]
public override Task Required_one_to_one_with_AK_relationships_are_one_to_one()
=> base.Required_one_to_one_with_AK_relationships_are_one_to_one();
=> Assert.ThrowsAnyAsync<Exception>(() => base.Required_one_to_one_with_AK_relationships_are_one_to_one());

[Theory(Skip = "Cascade delete. Issue #3924")]
// Cascade delete.
public override Task Required_one_to_one_with_alternate_key_are_cascade_detached_when_Added(
CascadeTiming cascadeDeleteTiming,
CascadeTiming deleteOrphansTiming)
=> base.Required_one_to_one_with_alternate_key_are_cascade_detached_when_Added(cascadeDeleteTiming, deleteOrphansTiming);
=> Assert.ThrowsAnyAsync<Exception>(() =>
base.Required_one_to_one_with_alternate_key_are_cascade_detached_when_Added(cascadeDeleteTiming, deleteOrphansTiming));

[Theory(Skip = "Cascade delete. Issue #3924")]
// Cascade delete.
public override Task Required_one_to_one_with_alternate_key_are_cascade_deleted_in_store(
CascadeTiming cascadeDeleteTiming,
CascadeTiming deleteOrphansTiming)
=> base.Required_one_to_one_with_alternate_key_are_cascade_deleted_in_store(cascadeDeleteTiming, deleteOrphansTiming);
=> Assert.ThrowsAnyAsync<Exception>(() =>
base.Required_one_to_one_with_alternate_key_are_cascade_deleted_in_store(cascadeDeleteTiming, deleteOrphansTiming));

[Theory(Skip = "Cascade delete. Issue #3924")]
// Cascade delete.
public override Task Required_many_to_one_dependents_are_cascade_deleted_in_store(
CascadeTiming cascadeDeleteTiming,
CascadeTiming deleteOrphansTiming)
=> base.Required_many_to_one_dependents_are_cascade_deleted_in_store(cascadeDeleteTiming, deleteOrphansTiming);
=> Assert.ThrowsAnyAsync<Exception>(() =>
base.Required_many_to_one_dependents_are_cascade_deleted_in_store(cascadeDeleteTiming, deleteOrphansTiming));

[Theory(Skip = "Cascade delete. Issue #3924")]
// Cascade delete.
public override Task Required_many_to_one_dependents_with_alternate_key_are_cascade_deleted_in_store(
CascadeTiming cascadeDeleteTiming,
CascadeTiming deleteOrphansTiming)
=> base.Required_many_to_one_dependents_with_alternate_key_are_cascade_deleted_in_store(
cascadeDeleteTiming, deleteOrphansTiming);
=> Assert.ThrowsAnyAsync<Exception>(() =>
base.Required_many_to_one_dependents_with_alternate_key_are_cascade_deleted_in_store(
cascadeDeleteTiming, deleteOrphansTiming));

[Theory(Skip = "Cascade delete. Issue #3924")]
// Cascade delete.
public override Task Required_non_PK_one_to_one_are_cascade_detached_when_Added(
CascadeTiming cascadeDeleteTiming,
CascadeTiming deleteOrphansTiming)
=> base.Required_non_PK_one_to_one_are_cascade_detached_when_Added(cascadeDeleteTiming, deleteOrphansTiming);

[Theory(Skip = "Cascade delete. Issue #3924")]
=> !DoesLazyLoading
&& DoesChangeTracking
&& cascadeDeleteTiming == CascadeTiming.Never
&& deleteOrphansTiming == CascadeTiming.OnSaveChanges
? base.Required_non_PK_one_to_one_are_cascade_detached_when_Added(cascadeDeleteTiming, deleteOrphansTiming)
: Assert.ThrowsAnyAsync<Exception>(() =>
base.Required_non_PK_one_to_one_are_cascade_detached_when_Added(cascadeDeleteTiming, deleteOrphansTiming));

// Cascade delete.
public override Task Required_non_PK_one_to_one_with_alternate_key_are_cascade_detached_when_Added(
CascadeTiming cascadeDeleteTiming,
CascadeTiming deleteOrphansTiming)
=> base.Required_non_PK_one_to_one_with_alternate_key_are_cascade_detached_when_Added(
cascadeDeleteTiming, deleteOrphansTiming);
=> DoesLazyLoading
&& !DoesChangeTracking
&& cascadeDeleteTiming == CascadeTiming.Never
&& deleteOrphansTiming == CascadeTiming.OnSaveChanges
? base.Required_non_PK_one_to_one_with_alternate_key_are_cascade_detached_when_Added(
cascadeDeleteTiming, deleteOrphansTiming)
: Assert.ThrowsAnyAsync<Exception>(() =>
base.Required_non_PK_one_to_one_with_alternate_key_are_cascade_detached_when_Added(
cascadeDeleteTiming, deleteOrphansTiming));

// Cascade delete.
public override async Task Required_many_to_one_dependents_with_alternate_key_are_cascade_deleted_starting_detached(
CascadeTiming cascadeDeleteTiming,
CascadeTiming deleteOrphansTiming)
{
var exception = await Record.ExceptionAsync(
() => base.Required_many_to_one_dependents_with_alternate_key_are_cascade_deleted_starting_detached(
cascadeDeleteTiming, deleteOrphansTiming));

// InMemory currently has mixed behavior for this path (#3924) because cascade operations and graph fixup
// aren't fully consistent across proxy/lazy-loading combinations; some combinations complete, others fail
// with InvalidOperationException from query materialization.
if (exception == null || exception is InvalidOperationException)
{
return;
}

throw exception;
}

protected override async Task ExecuteWithStrategyInTransactionAsync(
Func<DbContext, Task> testOperation,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,33 +7,42 @@ public class KeysWithConvertersInMemoryTest(KeysWithConvertersInMemoryTest.KeysW
: KeysWithConvertersTestBase<
KeysWithConvertersInMemoryTest.KeysWithConvertersInMemoryFixture>(fixture)
{
[Fact(Skip = "Issue #26238")]
[Fact]
public override Task Can_insert_and_read_back_with_bare_class_key_and_optional_dependents()
=> base.Can_insert_and_read_back_with_bare_class_key_and_optional_dependents();
=> Assert.ThrowsAsync<InvalidOperationException>(
() => base.Can_insert_and_read_back_with_bare_class_key_and_optional_dependents());

[Fact(Skip = "Issue #26238")]
[Fact]
public override Task Can_insert_and_read_back_with_bare_class_key_and_optional_dependents_with_shadow_FK()
=> base.Can_insert_and_read_back_with_bare_class_key_and_optional_dependents_with_shadow_FK();
=> Assert.ThrowsAsync<InvalidOperationException>(
() => base.Can_insert_and_read_back_with_bare_class_key_and_optional_dependents_with_shadow_FK());

[Fact(Skip = "Issue #26238")]
[Fact]
public override Task Can_insert_and_read_back_with_struct_binary_key_and_optional_dependents()
=> base.Can_insert_and_read_back_with_struct_binary_key_and_optional_dependents();

[Fact(Skip = "Issue #26238")]
[Fact]
public override Task Can_insert_and_read_back_with_struct_binary_key_and_required_dependents()
=> base.Can_insert_and_read_back_with_struct_binary_key_and_required_dependents();

[Fact(Skip = "Issue #26238")]
// Value converters of keys are not supported by InMemory (#26238); this query/update path currently throws NullReferenceException.
[Fact]
public override Task Can_query_and_update_owned_entity_with_value_converter()
=> base.Can_query_and_update_owned_entity_with_value_converter();
=> Assert.ThrowsAsync<NullReferenceException>(
() => base.Can_query_and_update_owned_entity_with_value_converter());

[Fact(Skip = "Issue #26238")]
[Fact]
public override Task Can_query_and_update_owned_entity_with_int_bare_class_key()
=> base.Can_query_and_update_owned_entity_with_int_bare_class_key();
=> Assert.ThrowsAsync<InvalidOperationException>(
() => base.Can_query_and_update_owned_entity_with_int_bare_class_key());

[Fact(Skip = "Issue #26238")]
public override Task Can_insert_and_read_back_with_enumerable_class_key_and_optional_dependents()
=> base.Can_insert_and_read_back_with_enumerable_class_key_and_optional_dependents();
// Value converters of keys are not supported
[Fact]
public override async Task Can_insert_and_read_back_with_enumerable_class_key_and_optional_dependents()
=> Assert.Equal(
CoreStrings.InvalidSetType(nameof(EnumerableClassKeyPrincipal)),
(await Assert.ThrowsAsync<InvalidOperationException>(
() => base.Can_insert_and_read_back_with_enumerable_class_key_and_optional_dependents())).Message);

public class KeysWithConvertersInMemoryFixture : KeysWithConvertersFixtureBase
{
Expand All @@ -47,7 +56,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder, DbContext con
{
base.OnModelCreating(modelBuilder, context);

// Issue #26238
// Value converters of keys are not supported
modelBuilder.Ignore<EnumerableClassKeyPrincipal>();
modelBuilder.Ignore<EnumerableClassKeyOptionalDependent>();
modelBuilder.Ignore<EnumerableClassKeyRequiredDependent>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1183,7 +1183,7 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

#region Issue19425

[Fact(Skip = "Issue#19425")]
[Fact]
public virtual async Task Non_nullable_cast_in_null_check()
{
await using (await CreateScratchAsync<MyContext19425>(Seed19425, "19425"))
Expand Down
4 changes: 2 additions & 2 deletions test/EFCore.Specification.Tests/CustomConvertersTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -684,12 +684,12 @@ public override Task Object_to_string_conversion()
=> Task.CompletedTask;

[Fact]
public virtual void Optional_owned_with_converter_reading_non_nullable_column()
public virtual async Task Optional_owned_with_converter_reading_non_nullable_column()
{
using var context = CreateContext();
Assert.Equal(
"Nullable object must have a value.",
Assert.Throws<InvalidOperationException>(() => context.Set<Parent>().Select(e => new { e.OwnedWithConverter.Value }).ToList())
(await Assert.ThrowsAsync<InvalidOperationException>(() => context.Set<Parent>().Select(e => new { e.OwnedWithConverter.Value }).ToListAsync()))
.Message);
Comment thread
AndriySvyryd marked this conversation as resolved.
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -720,7 +720,7 @@ from c2 in ss.Set<Customer>()
AssertEqual(e.Complex?.Two, a.Complex?.Two);
});

[Theory(Skip = "issue #31376"), MemberData(nameof(IsAsyncData))]
[Theory, MemberData(nameof(IsAsyncData))]
public virtual Task Same_complex_type_projected_twice_with_pushdown_as_part_of_another_projection(bool async)
=> AssertQuery(
async,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ join id in ids on e.EmployeeID equals id
select e.EmployeeID);
}

[Theory(Skip = "#30677"), MemberData(nameof(IsAsyncData))]
[Theory, MemberData(nameof(IsAsyncData))]
public virtual async Task Join_local_string_closure_is_cached_correctly(bool async)
{
var ids = "12";
Expand All @@ -237,7 +237,7 @@ join id in ids on e.EmployeeID equals id
select e.EmployeeID));
}

[Theory(Skip = "#30677"), MemberData(nameof(IsAsyncData))]
[Theory, MemberData(nameof(IsAsyncData))]
public virtual async Task Join_local_bytes_closure_is_cached_correctly(bool async)
{
var ids = new byte[] { 1, 2 };
Expand Down
Loading