Skip to content

Commit 54617e1

Browse files
committed
Add entity framework insert test for npgsql
Requires crate/crate#12044
1 parent af830bb commit 54617e1

File tree

4 files changed

+114
-44
lines changed

4 files changed

+114
-44
lines changed

tests/client_tests/stock_npgsql/Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM mcr.microsoft.com/dotnet/core/sdk:3.1
1+
FROM mcr.microsoft.com/dotnet/sdk:6.0
22

33
RUN \
44
apt-get update && \

tests/client_tests/stock_npgsql/Program.cs

+108-40
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,49 @@
44
using Npgsql;
55
using System.Threading.Tasks;
66
using System.Linq;
7+
using Microsoft.EntityFrameworkCore;
8+
using System.Data;
79

810
namespace stock_npgsql
911
{
10-
class Program
12+
public class TestEntity
13+
{
14+
public String Id { get; set; }
15+
public DateTimeOffset DateTime{ get; set; } = DateTimeOffset.UtcNow;
16+
17+
public TestEntity() {
18+
Id = Guid.NewGuid().ToString();
19+
}
20+
}
21+
22+
public class CrateContext : DbContext
1123
{
24+
public virtual DbSet<TestEntity> Test { get; set; }
25+
public static string ConnectionString { get; set; }
26+
27+
public CrateContext() { }
28+
29+
public CrateContext(DbContextOptions<CrateContext> options) : base(options) { }
30+
31+
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
32+
{
33+
optionsBuilder.UseNpgsql(ConnectionString);
34+
}
35+
36+
protected override void OnModelCreating(ModelBuilder modelBuilder)
37+
{
38+
modelBuilder.Entity<TestEntity>(entity =>
39+
{
40+
entity.HasKey(e => e.Id);
41+
entity.ToTable("test", "test");
42+
entity.Property(e => e.Id).HasColumnName("id").HasColumnType("text");
43+
entity.Property(e => e.DateTime).HasColumnName("datetime").HasColumnType("timestamp with time zone");
44+
});
45+
}
46+
}
1247

48+
class Program
49+
{
1350
public static async Task TestUnnestAsync(NpgsqlConnection conn)
1451
{
1552
using var command = new NpgsqlCommand(
@@ -39,54 +76,85 @@ static async Task Main(string[] args)
3976
var connString = $"Host={host};Port={port};Username=crate;Password=;Database=doc";
4077
using (var conn = new NpgsqlConnection(connString)) {
4178
conn.Open();
42-
using (var cmd = new NpgsqlCommand("SELECT mountain FROM sys.summits ORDER BY 1 LIMIT 10", conn))
43-
using (var reader = cmd.ExecuteReader()) {
44-
List<string> mountains = new List<string>();
45-
while (reader.Read()) {
46-
mountains.Add(reader.GetString(0));
47-
}
48-
Debug.Assert(mountains[0] == "Acherkogel");
49-
}
5079

51-
using (var cmd = new NpgsqlCommand("CREATE TABLE tbl (x int)", conn)) {
52-
cmd.ExecuteNonQuery();
53-
}
54-
using (var cmd = new NpgsqlCommand("INSERT INTO tbl (x) VALUES (@x)", conn))
55-
{
56-
cmd.Parameters.AddWithValue("x", 10);
57-
cmd.ExecuteNonQuery();
80+
await TestBasics(conn);
81+
await TestUnnestAsync(conn);
82+
await TestInsertUsingEntityFramework(conn);
83+
}
84+
}
85+
86+
private static async Task TestBasics(NpgsqlConnection conn)
87+
{
88+
using (var cmd = new NpgsqlCommand("SELECT mountain FROM sys.summits ORDER BY 1 LIMIT 10", conn))
89+
using (var reader = cmd.ExecuteReader()) {
90+
List<string> mountains = new List<string>();
91+
while (reader.Read()) {
92+
mountains.Add(reader.GetString(0));
5893
}
59-
using (var cmd = new NpgsqlCommand("INSERT INTO tbl (x) VALUES (@x)", conn))
60-
{
61-
using (var transaction = conn.BeginTransaction())
62-
{
63-
cmd.Transaction = transaction;
64-
cmd.Parameters.Add("@x", NpgsqlTypes.NpgsqlDbType.Integer);
94+
Debug.Assert(mountains[0] == "Acherkogel");
95+
}
6596

66-
for (int i = 1; i < 10; i++)
67-
{
68-
cmd.Parameters["@x"].Value = i * 10;
69-
cmd.ExecuteNonQuery();
70-
}
97+
using (var cmd = new NpgsqlCommand("CREATE TABLE tbl (x int)", conn)) {
98+
cmd.ExecuteNonQuery();
99+
}
100+
using (var cmd = new NpgsqlCommand("INSERT INTO tbl (x) VALUES (@x)", conn))
101+
{
102+
cmd.Parameters.AddWithValue("x", 10);
103+
cmd.ExecuteNonQuery();
104+
}
105+
using (var cmd = new NpgsqlCommand("INSERT INTO tbl (x) VALUES (@x)", conn))
106+
{
107+
using (var transaction = conn.BeginTransaction())
108+
{
109+
cmd.Transaction = transaction;
110+
cmd.Parameters.Add("@x", NpgsqlTypes.NpgsqlDbType.Integer);
71111

72-
transaction.Commit();
112+
for (int i = 1; i < 10; i++)
113+
{
114+
cmd.Parameters["@x"].Value = i * 10;
115+
await cmd.ExecuteNonQueryAsync();
73116
}
74-
}
75-
using (var cmd = new NpgsqlCommand("REFRESH TABLE tbl", conn))
76-
{
77-
cmd.ExecuteNonQuery();
78-
}
79117

80-
using (var cmd = new NpgsqlCommand("SELECT x FROM tbl ORDER BY 1 ASC LIMIT 10", conn))
81-
using (var reader = cmd.ExecuteReader())
82-
{
83-
Debug.Assert(reader.Read());
84-
int value = (int) reader[0];
85-
Debug.Assert(value == 10, "first value must be 10, but is " + value);
118+
await transaction.CommitAsync();
86119
}
120+
}
121+
using (var cmd = new NpgsqlCommand("REFRESH TABLE tbl", conn))
122+
{
123+
await cmd.ExecuteNonQueryAsync();
124+
}
87125

88-
await TestUnnestAsync(conn);
126+
using (var cmd = new NpgsqlCommand("SELECT x FROM tbl ORDER BY 1 ASC LIMIT 10", conn))
127+
using (var reader = cmd.ExecuteReader())
128+
{
129+
Debug.Assert(reader.Read());
130+
int value = (int) reader[0];
131+
Debug.Assert(value == 10, "first value must be 10, but is " + value);
132+
}
133+
}
134+
135+
private static async Task TestInsertUsingEntityFramework(NpgsqlConnection conn)
136+
{
137+
using (var cmd = new NpgsqlCommand("drop table if exists test.test", conn))
138+
{
139+
await cmd.ExecuteNonQueryAsync();
140+
}
141+
string createTable = @"
142+
CREATE TABLE test.test (
143+
id text default gen_random_text_uuid() primary key,
144+
datetime timestamp with time zone
145+
)";
146+
using (var cmd = new NpgsqlCommand(createTable, conn))
147+
{
148+
await cmd.ExecuteNonQueryAsync();
149+
}
150+
CrateContext.ConnectionString = conn.ConnectionString;
151+
using CrateContext context = new();
152+
153+
for (int i = 0; i < 4; i++)
154+
{
155+
context.Test.Add(new TestEntity());
89156
}
157+
await context.SaveChangesAsync();
90158
}
91159
}
92160
}

tests/client_tests/stock_npgsql/run.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ set -Eeuo pipefail
44

55
dotnet build
66
cr8 run-crate latest-nightly \
7-
-- @$(pwd)/bin/Debug/netcoreapp3.1/stock_npgsql {node.addresses.psql.host} {node.addresses.psql.port}
7+
-- @$(pwd)/bin/Debug/net6.0/stock_npgsql {node.addresses.psql.host} {node.addresses.psql.port}

tests/client_tests/stock_npgsql/stock_npgsql.csproj

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>netcoreapp3.1</TargetFramework>
5+
<TargetFramework>net6.0</TargetFramework>
66
</PropertyGroup>
77

88
<ItemGroup>
9-
<PackageReference Include="Npgsql" Version="6.0.1" />
9+
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.1" />
10+
<PackageReference Include="Npgsql" Version="6.0.2" />
11+
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.2" />
1012
</ItemGroup>
1113

1214
</Project>

0 commit comments

Comments
 (0)