forked from npgsql/npgsql
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathGlobalTypeMapperTests.cs
More file actions
143 lines (115 loc) · 5.86 KB
/
GlobalTypeMapperTests.cs
File metadata and controls
143 lines (115 loc) · 5.86 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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using System;
using System.Data;
using System.Threading.Tasks;
using Npgsql.Internal;
using Npgsql.Internal.Postgres;
using NUnit.Framework;
using static Npgsql.Tests.TestUtil;
namespace Npgsql.Tests;
#pragma warning disable CS0618 // GlobalTypeMapper is obsolete
[NonParallelizable]
public class GlobalTypeMapperTests : TestBase
{
[Test]
public async Task MapEnum()
{
await using var adminConnection = await OpenConnectionAsync();
var type = await GetTempTypeName(adminConnection);
NpgsqlConnection.GlobalTypeMapper.MapEnum<Mood>(type);
await using var dataSource1 = CreateDataSource();
await using (var connection = await dataSource1.OpenConnectionAsync())
{
await connection.ExecuteNonQueryAsync($"CREATE TYPE {type} AS ENUM ('sad', 'ok', 'happy')");
await connection.ReloadTypesAsync();
await AssertType(connection, Mood.Happy, "happy", type, dataTypeInference: DataTypeInference.Nothing);
}
NpgsqlConnection.GlobalTypeMapper.UnmapEnum<Mood>(type);
// Global mapping changes have no effect on already-built data sources
await AssertType(dataSource1, Mood.Happy, "happy", type, dataTypeInference: DataTypeInference.Nothing);
await AssertType(dataSource1, "happy", "happy",
type, dataTypeInference: DataTypeInference.Mismatch,
dbType: new(DbType.Object, DbType.String), valueTypeEqualsFieldType: false);
// But they do affect new data sources
await using var dataSource2 = CreateDataSource();
Assert.ThrowsAsync<InvalidCastException>(() => AssertType(dataSource2, Mood.Happy, "happy",
type, dataTypeInference: DataTypeInference.Nothing));
await AssertType(dataSource2, "happy", "happy", "text", dbType: DbType.String);
}
[Test]
public async Task MapEnum_NonGeneric()
{
await using var adminConnection = await OpenConnectionAsync();
var type = await GetTempTypeName(adminConnection);
NpgsqlConnection.GlobalTypeMapper.MapEnum(typeof(Mood), type);
try
{
await using var dataSource1 = CreateDataSource();
await using (var connection = await dataSource1.OpenConnectionAsync())
{
await connection.ExecuteNonQueryAsync($"CREATE TYPE {type} AS ENUM ('sad', 'ok', 'happy')");
await connection.ReloadTypesAsync();
await AssertType(connection, Mood.Happy, "happy", type, dataTypeInference: DataTypeInference.Nothing);
}
NpgsqlConnection.GlobalTypeMapper.UnmapEnum(typeof(Mood), type);
// Global mapping changes have no effect on already-built data sources
await AssertType(dataSource1, Mood.Happy, "happy", type, dataTypeInference: DataTypeInference.Nothing);
await AssertType(dataSource1, "happy", "happy",
type, dataTypeInference: DataTypeInference.Mismatch,
dbType: new(DbType.Object, DbType.String), valueTypeEqualsFieldType: false);
// But they do affect new data sources
await using var dataSource2 = CreateDataSource();
Assert.ThrowsAsync<InvalidCastException>(() => AssertType(dataSource2, Mood.Happy, "happy", type, dataTypeInference: DataTypeInference.Nothing));
await AssertType(dataSource2, "happy", "happy", "text", dbType: DbType.String);
}
finally
{
NpgsqlConnection.GlobalTypeMapper.UnmapEnum<Mood>(type);
}
}
[Test]
public async Task Reset()
{
await using var adminConnection = await OpenConnectionAsync();
var type = await GetTempTypeName(adminConnection);
NpgsqlConnection.GlobalTypeMapper.MapEnum<Mood>(type);
await using var dataSource1 = CreateDataSource();
await using (var connection = await dataSource1.OpenConnectionAsync())
{
await connection.ExecuteNonQueryAsync($"CREATE TYPE {type} AS ENUM ('sad', 'ok', 'happy')");
await connection.ReloadTypesAsync();
await AssertType(connection, Mood.Happy, "happy", type, dataTypeInference: DataTypeInference.Nothing);
}
// A global mapping change has no effects on data sources which have already been built
NpgsqlConnection.GlobalTypeMapper.Reset();
// Global mapping changes have no effect on already-built data sources
await AssertType(dataSource1, Mood.Happy, "happy", type, dataTypeInference: DataTypeInference.Nothing);
await AssertType(dataSource1, "happy", "happy",
type, dataTypeInference: DataTypeInference.Mismatch,
dbType: new(DbType.Object, DbType.String), valueTypeEqualsFieldType: false);
// But they do affect new data sources
await using var dataSource2 = CreateDataSource();
Assert.ThrowsAsync<InvalidCastException>(() => AssertType(dataSource2, Mood.Happy, "happy", type, dataTypeInference: DataTypeInference.Nothing));
await AssertType(dataSource2, "happy", "happy",
type, dataTypeInference: DataTypeInference.Mismatch,
dbType: new(DbType.Object, DbType.String));
}
[Test]
public void Reset_and_add_resolver()
{
NpgsqlConnection.GlobalTypeMapper.Reset();
NpgsqlConnection.GlobalTypeMapper.AddTypeInfoResolverFactory(new DummyResolverFactory());
}
[TearDown]
public void Teardown()
=> NpgsqlConnection.GlobalTypeMapper.Reset();
enum Mood { Sad, Ok, Happy }
class DummyResolverFactory : PgTypeInfoResolverFactory
{
public override IPgTypeInfoResolver CreateResolver() => new DummyResolver();
public override IPgTypeInfoResolver? CreateArrayResolver() => null;
class DummyResolver : IPgTypeInfoResolver
{
public PgTypeInfo? GetTypeInfo(Type? type, DataTypeName? dataTypeName, PgSerializerOptions options) => null;
}
}
}