Skip to content

Commit 6fb6852

Browse files
njanninkNiek Janninkleonibr
authored
#98 Remove dependency on 3rd party lib dapper (#99)
* #98 Refactor out dapper dependency * #98 Use correct parameters * Update README and refactor database operations to remove Dapper dependency. Introduced native Npgsql parameter handling for improved type safety as in Dapper and reduced package size. Added unit tests for NpgsqlCommandExtensions and updated SQL command types for better instantiation checks. --------- Co-authored-by: Niek Jannink <niek.jannink@craytive.com> Co-authored-by: Ashley Marques <marques.ashley@gmail.com>
1 parent 427637a commit 6fb6852

File tree

9 files changed

+407
-403
lines changed

9 files changed

+407
-403
lines changed
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
using System;
2+
using Community.Microsoft.Extensions.Caching.PostgreSql;
3+
using Npgsql;
4+
5+
namespace CachingTest;
6+
7+
public class NpgsqlCommandExtensionsTests
8+
{
9+
[Fact]
10+
public void AddParameters_WithItemIdUtcNow_AddsCorrectParameters()
11+
{
12+
// Arrange
13+
using var connection = new NpgsqlConnection("Host=localhost;Database=test;Username=test;Password=test");
14+
using var command = connection.CreateCommand();
15+
var utcNow = DateTimeOffset.UtcNow;
16+
var item = new ItemIdUtcNow
17+
{
18+
Id = "test-id",
19+
UtcNow = utcNow
20+
};
21+
22+
// Act
23+
command.AddParameters(item);
24+
25+
// Assert
26+
Assert.Equal(2, command.Parameters.Count);
27+
Assert.Equal("test-id", command.Parameters["@Id"].Value);
28+
Assert.Equal(utcNow, command.Parameters["@UtcNow"].Value);
29+
}
30+
31+
[Fact]
32+
public void AddParameters_WithItemFull_AddsAllParameters()
33+
{
34+
// Arrange
35+
using var connection = new NpgsqlConnection("Host=localhost;Database=test;Username=test;Password=test");
36+
using var command = connection.CreateCommand();
37+
var utcNow = DateTimeOffset.UtcNow;
38+
var value = new byte[] { 1, 2, 3, 4, 5 };
39+
var item = new ItemFull
40+
{
41+
Id = "test-id",
42+
ExpiresAtTime = utcNow.AddHours(1),
43+
Value = value,
44+
SlidingExpirationInSeconds = 3600,
45+
AbsoluteExpiration = utcNow.AddDays(1)
46+
};
47+
48+
// Act
49+
command.AddParameters(item);
50+
51+
// Assert
52+
Assert.Equal(5, command.Parameters.Count);
53+
Assert.Equal("test-id", command.Parameters["@Id"].Value);
54+
Assert.Equal(value, command.Parameters["@Value"].Value);
55+
Assert.Equal(utcNow.AddHours(1), command.Parameters["@ExpiresAtTime"].Value);
56+
Assert.Equal(3600.0, command.Parameters["@SlidingExpirationInSeconds"].Value);
57+
Assert.Equal(utcNow.AddDays(1), command.Parameters["@AbsoluteExpiration"].Value);
58+
}
59+
60+
[Fact]
61+
public void AddParameters_WithItemFull_WithNullValues_AddsDBNull()
62+
{
63+
// Arrange
64+
using var connection = new NpgsqlConnection("Host=localhost;Database=test;Username=test;Password=test");
65+
using var command = connection.CreateCommand();
66+
var utcNow = DateTimeOffset.UtcNow;
67+
var value = new byte[] { 1, 2, 3 };
68+
var item = new ItemFull
69+
{
70+
Id = "test-id",
71+
ExpiresAtTime = utcNow.AddHours(1),
72+
Value = value,
73+
SlidingExpirationInSeconds = null,
74+
AbsoluteExpiration = null
75+
};
76+
77+
// Act
78+
command.AddParameters(item);
79+
80+
// Assert
81+
Assert.Equal(5, command.Parameters.Count);
82+
Assert.Equal(DBNull.Value, command.Parameters["@SlidingExpirationInSeconds"].Value);
83+
Assert.Equal(DBNull.Value, command.Parameters["@AbsoluteExpiration"].Value);
84+
}
85+
86+
[Fact]
87+
public void AddParameters_WithCurrentUtcNow_AddsCorrectParameter()
88+
{
89+
// Arrange
90+
using var connection = new NpgsqlConnection("Host=localhost;Database=test;Username=test;Password=test");
91+
using var command = connection.CreateCommand();
92+
var utcNow = DateTimeOffset.UtcNow;
93+
var item = new CurrentUtcNow
94+
{
95+
UtcNow = utcNow
96+
};
97+
98+
// Act
99+
command.AddParameters(item);
100+
101+
// Assert
102+
Assert.Single(command.Parameters);
103+
Assert.Equal(utcNow, command.Parameters["@UtcNow"].Value);
104+
}
105+
106+
[Fact]
107+
public void AddParameters_WithItemIdOnly_AddsCorrectParameter()
108+
{
109+
// Arrange
110+
using var connection = new NpgsqlConnection("Host=localhost;Database=test;Username=test;Password=test");
111+
using var command = connection.CreateCommand();
112+
var item = new ItemIdOnly
113+
{
114+
Id = "test-id"
115+
};
116+
117+
// Act
118+
command.AddParameters(item);
119+
120+
// Assert
121+
Assert.Single(command.Parameters);
122+
Assert.Equal("test-id", command.Parameters["@Id"].Value);
123+
}
124+
125+
[Fact]
126+
public void AddParameters_MultipleCallsWithSameParameterType_AppendsParameters()
127+
{
128+
// Arrange
129+
using var connection = new NpgsqlConnection("Host=localhost;Database=test;Username=test;Password=test");
130+
using var command = connection.CreateCommand();
131+
var item1 = new ItemIdOnly { Id = "test-id-1" };
132+
var item2 = new CurrentUtcNow { UtcNow = DateTimeOffset.UtcNow };
133+
134+
// Act
135+
command.AddParameters(item1);
136+
command.AddParameters(item2);
137+
138+
// Assert
139+
Assert.Equal(2, command.Parameters.Count);
140+
}
141+
142+
[Fact]
143+
public void AddParameters_WithItemIdUtcNow_ParameterNamesMatchSqlConvention()
144+
{
145+
// Arrange
146+
using var connection = new NpgsqlConnection("Host=localhost;Database=test;Username=test;Password=test");
147+
using var command = connection.CreateCommand();
148+
var item = new ItemIdUtcNow
149+
{
150+
Id = "test-id",
151+
UtcNow = DateTimeOffset.UtcNow
152+
};
153+
154+
// Act
155+
command.AddParameters(item);
156+
157+
// Assert - Parameter names should start with @
158+
Assert.Contains(command.Parameters, p => p.ParameterName == "@Id");
159+
Assert.Contains(command.Parameters, p => p.ParameterName == "@UtcNow");
160+
}
161+
162+
[Fact]
163+
public void AddParameters_WithItemFull_ParameterNamesMatchSqlConvention()
164+
{
165+
// Arrange
166+
using var connection = new NpgsqlConnection("Host=localhost;Database=test;Username=test;Password=test");
167+
using var command = connection.CreateCommand();
168+
var item = new ItemFull
169+
{
170+
Id = "test-id",
171+
ExpiresAtTime = DateTimeOffset.UtcNow.AddHours(1),
172+
Value = new byte[] { 1, 2, 3 },
173+
SlidingExpirationInSeconds = 3600,
174+
AbsoluteExpiration = DateTimeOffset.UtcNow.AddDays(1)
175+
};
176+
177+
// Act
178+
command.AddParameters(item);
179+
180+
// Assert - Parameter names should start with @
181+
Assert.Contains(command.Parameters, p => p.ParameterName == "@Id");
182+
Assert.Contains(command.Parameters, p => p.ParameterName == "@Value");
183+
Assert.Contains(command.Parameters, p => p.ParameterName == "@ExpiresAtTime");
184+
Assert.Contains(command.Parameters, p => p.ParameterName == "@SlidingExpirationInSeconds");
185+
Assert.Contains(command.Parameters, p => p.ParameterName == "@AbsoluteExpiration");
186+
}
187+
}
188+

0 commit comments

Comments
 (0)