forked from npgsql/efcore.pg
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCompatibilityQueryNpgsqlTest.cs
More file actions
116 lines (94 loc) · 3.99 KB
/
CompatibilityQueryNpgsqlTest.cs
File metadata and controls
116 lines (94 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
namespace Microsoft.EntityFrameworkCore.Query;
public class CompatibilityQueryNpgsqlTest : IClassFixture<CompatibilityQueryNpgsqlTest.CompatibilityQueryNpgsqlFixture>
{
private CompatibilityQueryNpgsqlFixture Fixture { get; }
// ReSharper disable once UnusedParameter.Local
public CompatibilityQueryNpgsqlTest(CompatibilityQueryNpgsqlFixture fixture, ITestOutputHelper testOutputHelper)
{
Fixture = fixture;
Fixture.TestSqlLoggerFactory.Clear();
Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper);
}
[ConditionalFact]
public async Task Array_contains_is_not_parameterized_with_array_on_redshift()
{
var ctx = CreateRedshiftContext();
// https://github.com/dotnet/efcore/issues/36311
await Assert.ThrowsAsync<UnreachableException>(async () =>
{
var numbers = new[] { 8, 9 };
var result = await ctx.TestEntities.Where(e => numbers.Contains(e.SomeInt)).SingleAsync();
Assert.Equal(1, result.Id);
AssertSql(
"""
SELECT t."Id", t."SomeInt"
FROM "TestEntities" AS t
WHERE t."SomeInt" IN (?, ?)
LIMIT 2
""");
});
}
#region Support
private CompatibilityContext CreateContext(Version? postgresVersion = null)
=> Fixture.CreateContext(postgresVersion);
private CompatibilityContext CreateRedshiftContext()
=> Fixture.CreateRedshiftContext();
public class CompatibilityQueryNpgsqlFixture : FixtureBase, IDisposable, IAsyncLifetime
{
private TestStore _testStore = null!;
private const string StoreName = "CompatibilityTest";
private readonly ListLoggerFactory _listLoggerFactory = NpgsqlTestStoreFactory.Instance.CreateListLoggerFactory(_ => false);
public TestSqlLoggerFactory TestSqlLoggerFactory
=> (TestSqlLoggerFactory)_listLoggerFactory;
public virtual CompatibilityContext CreateContext()
=> CreateContext(null);
public virtual CompatibilityContext CreateContext(Version? postgresVersion)
{
var builder = new DbContextOptionsBuilder();
_testStore.AddProviderOptions(builder);
builder
.UseNpgsql(o => o.SetPostgresVersion(postgresVersion))
.UseLoggerFactory(_listLoggerFactory);
return new CompatibilityContext(builder.Options);
}
public virtual CompatibilityContext CreateRedshiftContext()
{
var builder = new DbContextOptionsBuilder();
_testStore.AddProviderOptions(builder);
builder
.UseNpgsql(o => o.UseRedshift())
.UseLoggerFactory(_listLoggerFactory);
return new CompatibilityContext(builder.Options);
}
public virtual async Task InitializeAsync()
{
_testStore = NpgsqlTestStoreFactory.Instance.GetOrCreate(StoreName);
await _testStore.InitializeAsync(null, CreateContext, c => CompatibilityContext.SeedAsync((CompatibilityContext)c));
}
// Called after DisposeAsync
public virtual void Dispose()
{
}
public virtual async Task DisposeAsync()
=> await _testStore.DisposeAsync();
}
public class CompatibilityTestEntity
{
public int Id { get; set; }
public int SomeInt { get; set; }
}
public class CompatibilityContext(DbContextOptions options) : DbContext(options)
{
public DbSet<CompatibilityTestEntity> TestEntities { get; set; }
public static async Task SeedAsync(CompatibilityContext context)
{
context.TestEntities.AddRange(
new CompatibilityTestEntity { Id = 1, SomeInt = 8 },
new CompatibilityTestEntity { Id = 2, SomeInt = 10 });
await context.SaveChangesAsync();
}
}
private void AssertSql(params string[] expected)
=> Fixture.TestSqlLoggerFactory.AssertBaseline(expected);
#endregion Support
}