Skip to content

Commit 776de68

Browse files
committed
Try make test to be suitable for any timezone
1 parent 40047d9 commit 776de68

2 files changed

Lines changed: 87 additions & 102 deletions

File tree

Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffset/PartsExtractionTest.cs

Lines changed: 84 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,17 @@ public void ExtractYearMinValueTest()
4040
public void ExtractYearMaxValueTest()
4141
{
4242
Require.ProviderIs(StorageProvider.PostgreSql);
43+
4344
ExecuteInsideSession((s) => {
44-
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Year == DateTimeOffset.MaxValue.Year + 1);
45-
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Year == DateTimeOffset.MaxValue.AddYears(-1).Year);
45+
var overflowHappens = localTimezone > TimeSpan.Zero;
46+
if (overflowHappens) {
47+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Year == DateTimeOffset.MaxValue.Year + 1);
48+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Year == DateTimeOffset.MaxValue.AddYears(-1).Year);
49+
}
50+
else {
51+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Year == DateTimeOffset.MaxValue.Year);
52+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Year == DateTimeOffset.MaxValue.AddYears(-1).Year);
53+
}
4654
});
4755
}
4856

@@ -74,9 +82,17 @@ public void ExtractMonthMinValueTest()
7482
public void ExtractMonthMaxValueTest()
7583
{
7684
Require.ProviderIs(StorageProvider.PostgreSql);
85+
7786
ExecuteInsideSession((s) => {
78-
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Month == DateTimeOffset.MaxValue.Month - 11);
79-
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Month == DateTimeOffset.MaxValue.AddMonths(-1).Month);
87+
var overflowHappens = localTimezone > TimeSpan.Zero;
88+
if (overflowHappens) {
89+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Month == 1);
90+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Month == DateTimeOffset.MaxValue.AddMonths(-1).Month);
91+
}
92+
else {
93+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Month == 12);
94+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Month == DateTimeOffset.MaxValue.AddMonths(-1).Month);
95+
}
8096
});
8197
}
8298

@@ -117,9 +133,17 @@ public void ExtractDayMaxValueTest()
117133
{
118134
Require.ProviderIs(StorageProvider.PostgreSql);
119135
ExecuteInsideSession((s) => {
120-
// year overflow happens on server side because of timezone
121-
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Day == 1);
122-
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Day == DateTimeOffset.MaxValue.AddDays(-1).Day);
136+
var overflowHappens = localTimezone > TimeSpan.Zero;
137+
if (overflowHappens) {
138+
// year overflow happens on server side because of timezone
139+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Day == 1);
140+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Day == DateTimeOffset.MaxValue.AddDays(-1).Day);
141+
}
142+
else {
143+
// year overflow happens on server side because of timezone
144+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Day == 31);
145+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Day == DateTimeOffset.MaxValue.AddDays(-1).Day);
146+
}
123147
});
124148
}
125149

@@ -151,48 +175,12 @@ public void ExtractHourMinValueTest()
151175
Require.ProviderIs(StorageProvider.PostgreSql);
152176

153177
ExecuteInsideSession((s) => {
154-
var service = s.Services.Get<Xtensive.Orm.Services.DirectSqlAccessor>();
155-
156-
var command = service.CreateCommand();
157-
command.CommandText = $"SELECT COUNT(*) FROM public.\"MinMaxDateTimeOffsetEntity\" WHERE EXTRACT (HOUR FROM \"MinValue\") = 4";
158-
159-
using (command)
160-
using (var reader = command.ExecuteReader()) {
161-
162-
while (reader.Read()) {
163-
var rowCount = reader.GetInt32(0);
164-
Console.WriteLine($"Rows with HOUR 4 : {rowCount}");
165-
}
166-
}
167-
168-
command = service.CreateCommand();
169-
command.CommandText = $"SELECT COUNT(*) FROM public.\"MinMaxDateTimeOffsetEntity\" WHERE EXTRACT (HOUR FROM \"MinValue\") = 5";
170-
171-
using (command)
172-
using (var reader = command.ExecuteReader()) {
173-
174-
while (reader.Read()) {
175-
var rowCount = reader.GetInt32(0);
176-
Console.WriteLine($"Rows with HOUR 5 : {rowCount}");
177-
}
178-
}
179-
180-
command = service.CreateCommand();
181-
command.CommandText = $"SELECT (EXTRACT (TIMEZONE FROM \"MinValue\"))::integer FROM public.\"MinMaxDateTimeOffsetEntity\"";
182-
183-
using (command)
184-
using (var reader = command.ExecuteReader()) {
185-
186-
while (reader.Read()) {
187-
var timezoneInSeconds = reader.GetDouble(0);
188-
Console.WriteLine($"Timezone : {TimeSpan.FromSeconds(timezoneInSeconds)}");
189-
}
190-
}
191-
});
192-
193-
194-
ExecuteInsideSession((s) => {
195-
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MinValue.Hour == 5);
178+
var serverSideHours = (localTimezone > TimeSpan.Zero)
179+
? localTimezone.Hours - 1 // positive zone
180+
: (localTimezone < TimeSpan.Zero)
181+
? 23 + localTimezone.Hours // negative zone
182+
: 23; // UTC
183+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MinValue.Hour == serverSideHours);
196184
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MinValue.Hour == DateTimeOffset.MinValue.AddHours(1).Hour);
197185
});
198186
}
@@ -203,47 +191,12 @@ public void ExtractHourMaxValueTest()
203191
Require.ProviderIs(StorageProvider.PostgreSql);
204192

205193
ExecuteInsideSession((s) => {
206-
var service = s.Services.Get<Xtensive.Orm.Services.DirectSqlAccessor>();
207-
208-
var command = service.CreateCommand();
209-
command.CommandText = $"SELECT COUNT(*) FROM public.\"MinMaxDateTimeOffsetEntity\" WHERE EXTRACT (HOUR FROM \"MaxValue\") = 4";
210-
211-
using (command)
212-
using (var reader = command.ExecuteReader()) {
213-
214-
while (reader.Read()) {
215-
var rowCount = reader.GetInt32(0);
216-
Console.WriteLine($"Rows with HOUR 4 : {rowCount}");
217-
}
218-
}
219-
220-
command = service.CreateCommand();
221-
command.CommandText = $"SELECT COUNT(*) FROM public.\"MinMaxDateTimeOffsetEntity\" WHERE EXTRACT (HOUR FROM \"MaxValue\") = 5";
222-
223-
using (command)
224-
using (var reader = command.ExecuteReader()) {
225-
226-
while (reader.Read()) {
227-
var rowCount = reader.GetInt32(0);
228-
Console.WriteLine($"Rows with HOUR 5 : {rowCount}");
229-
}
230-
}
231-
232-
command = service.CreateCommand();
233-
command.CommandText = $"SELECT (EXTRACT (TIMEZONE FROM \"MaxValue\"))::integer FROM public.\"MinMaxDateTimeOffsetEntity\"";
234-
235-
using (command)
236-
using (var reader = command.ExecuteReader()) {
237-
238-
while (reader.Read()) {
239-
var timezoneInSeconds = reader.GetDouble(0);
240-
Console.WriteLine($"Timezone : {TimeSpan.FromSeconds(timezoneInSeconds)}");
241-
}
242-
}
243-
});
244-
245-
ExecuteInsideSession((s) => {
246-
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Hour == 4);
194+
var serverSideHours = (localTimezone > TimeSpan.Zero)
195+
? localTimezone.Hours - 1 // positive zone
196+
: (localTimezone < TimeSpan.Zero)
197+
? 23 + localTimezone.Hours // negative zone
198+
: 23; // UTC
199+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Hour == serverSideHours);
247200
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Hour == DateTimeOffset.MaxValue.AddHours(-1).Hour);
248201
});
249202
}
@@ -380,11 +333,19 @@ public void ExtractDateMinValueTest()
380333
public void ExtractDateMaxValueTest()
381334
{
382335
Require.ProviderIs(StorageProvider.PostgreSql);
383-
ExecuteInsideSession((s) => {
384-
// overflow of year from 9999-12-31 to 10000-01-01 because of how postgre works with timezones
385-
// can't validate
386-
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DateTime == DateTimeOffset.MaxValue.DateTime);
387-
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Date == DateTimeOffset.MaxValue.AddDays(-1).Date);
336+
337+
ExecuteInsideSession((s) => {
338+
var overflowHappens = localTimezone > TimeSpan.Zero;
339+
if (overflowHappens) {
340+
// overflow of year from 9999-12-31 to 10000-01-01 because of how postgre works with timezones
341+
// can't validate
342+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DateTime == DateTimeOffset.MaxValue.DateTime);
343+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Date == DateTimeOffset.MaxValue.AddDays(-1).Date);
344+
}
345+
else {
346+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DateTime == DateTimeOffset.MaxValue.DateTime);
347+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.Date == DateTimeOffset.MaxValue.AddDays(-2).Date);
348+
}
388349
});
389350
}
390351

@@ -511,8 +472,15 @@ public void ExtractDayOfYearMaxValueTest()
511472
{
512473
Require.ProviderIs(StorageProvider.PostgreSql);
513474
ExecuteInsideSession((s) => {
514-
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfYear == 1);
515-
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfYear == DateTimeOffset.MaxValue.AddDays(-1).DayOfYear);
475+
var overflowHappens = localTimezone > TimeSpan.Zero;
476+
if (overflowHappens) {
477+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfYear == 1);
478+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfYear == DateTimeOffset.MaxValue.AddDays(-1).DayOfYear);
479+
}
480+
else {
481+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfYear == DateTimeOffset.MaxValue.DayOfYear);
482+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfYear == DateTimeOffset.MaxValue.AddDays(-1).DayOfYear);
483+
}
516484
});
517485
}
518486

@@ -550,8 +518,15 @@ public void ExtractDayOfWeekMaxValueTest()
550518
{
551519
Require.ProviderIs(StorageProvider.PostgreSql);
552520
ExecuteInsideSession((s) => {
553-
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfWeek == DateTimeOffset.MaxValue.DayOfWeek + 1);
554-
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfWeek == DateTimeOffset.MaxValue.AddDays(-1).DayOfWeek);
521+
var overflowHappens = localTimezone > TimeSpan.Zero;
522+
if (overflowHappens) {
523+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfWeek == DateTimeOffset.MaxValue.DayOfWeek + 1);
524+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfWeek == DateTimeOffset.MaxValue.AddDays(-1).DayOfWeek);
525+
}
526+
else {
527+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfWeek == DateTimeOffset.MaxValue.DayOfWeek);
528+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DayOfWeek == DateTimeOffset.MaxValue.AddDays(-1).DayOfWeek);
529+
}
555530
});
556531
}
557532

@@ -592,8 +567,16 @@ public void ExtractDateTimeMaxValueTest()
592567
ExecuteInsideSession((s) => {
593568
// overflow of year from 9999-12-31 to 10000-01-01 because of how postgre works with timezones
594569
// can't validate
595-
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DateTime == DateTimeOffset.MaxValue.DateTime);
596-
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DateTime == DateTimeOffset.MaxValue.AddDays(-1).DateTime);
570+
var overflowHappens = localTimezone > TimeSpan.Zero;
571+
if (overflowHappens) {
572+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DateTime == DateTimeOffset.MaxValue.DateTime);
573+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DateTime == DateTimeOffset.MaxValue.AddDays(-1).DateTime);
574+
}
575+
else {
576+
RunTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DateTime == DateTimeOffset.MaxValue.DateTime);
577+
RunWrongTest<MinMaxDateTimeOffsetEntity>(s, c => c.MaxValue.DateTime == DateTimeOffset.MaxValue.AddDays(-1).DateTime);
578+
}
579+
597580
});
598581
}
599582

Orm/Xtensive.Orm.Tests/Linq/DateTimeAndDateTimeOffset/DateTimeOffsetBaseTest.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public abstract class DateTimeOffsetBaseTest : BaseTest
3535
protected static readonly DateTimeOffset SecondMillisecondDateTimeOffset = new DateTimeOffset(SecondMillisecondDateTime, SecondOffset);
3636
protected static readonly DateTimeOffset WrongMillisecondDateTimeOffset = new DateTimeOffset(WrongMillisecondDateTime, WrongOffset);
3737

38+
protected static readonly TimeSpan localTimezone = DateTimeOffset.Now.ToLocalTime().Offset;
39+
3840
protected override void RegisterTypes(DomainConfiguration configuration)
3941
{
4042
configuration.Types.Register(typeof(SingleDateTimeOffsetEntity));
@@ -51,7 +53,7 @@ protected override void InitializeCustomSettings(DomainConfiguration configurati
5153
{
5254
var providerInfo = StorageProviderInfo.Instance.Info;
5355
if (providerInfo.ProviderName==WellKnown.Provider.PostgreSql) {
54-
var localZone = DateTimeOffset.Now.ToLocalTime().Offset;
56+
var localZone = localTimezone;
5557
var localZoneString = ((localZone < TimeSpan.Zero) ? "-" : "+") + localZone.ToString(@"hh\:mm");
5658
configuration.ConnectionInitializationSql = string.Format("SET TIME ZONE INTERVAL '{0}' HOUR TO MINUTE", localZoneString);
5759
}

0 commit comments

Comments
 (0)