Skip to content

Commit 5aa1835

Browse files
committed
Fix #35
1 parent 32e9bb3 commit 5aa1835

File tree

5 files changed

+123
-5
lines changed

5 files changed

+123
-5
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Newtonsoft.Json;
5+
using Newtonsoft.Json.Linq;
6+
7+
namespace Postgrest.Converters
8+
{
9+
public class DateTimeConverter : JsonConverter
10+
{
11+
public override bool CanConvert(Type objectType)
12+
{
13+
throw new NotImplementedException();
14+
}
15+
16+
public override bool CanWrite => false;
17+
18+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
19+
{
20+
if (reader.Value != null)
21+
{
22+
var str = reader.Value.ToString();
23+
var date = DateTime.Parse(str);
24+
return date;
25+
}
26+
else
27+
{
28+
List<DateTime> result = new List<DateTime>();
29+
JArray jo = JArray.Load(reader);
30+
31+
foreach (var item in jo.ToArray())
32+
{
33+
var date = DateTime.Parse(item.ToString());
34+
result.Add(date);
35+
}
36+
37+
return result;
38+
}
39+
}
40+
41+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
42+
{
43+
throw new NotImplementedException();
44+
}
45+
}
46+
}

Postgrest/CustomContractResolver.cs renamed to Postgrest/PostgrestContractResolver.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,18 @@ protected override JsonProperty CreateProperty(MemberInfo member, MemberSerializ
2323
{
2424
prop.Converter = new RangeConverter();
2525
}
26-
27-
if (prop.PropertyType == typeof(List<int>))
26+
else if (prop.PropertyType == typeof(DateTime))
27+
{
28+
prop.Converter = new DateTimeConverter();
29+
}
30+
else if (prop.PropertyType == typeof(List<int>))
2831
{
2932
prop.Converter = new IntArrayConverter();
3033
}
34+
else if (prop.PropertyType == typeof(List<DateTime>))
35+
{
36+
prop.Converter = new DateTimeConverter();
37+
}
3138

3239
// Dynamically set the name of the key we are serializing/deserializing from the model.
3340
if (member.CustomAttributes.Count() > 0)

PostgrestTests/Api.cs renamed to PostgrestTests/ClientApi.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
namespace PostgrestTests
1212
{
1313
[TestClass]
14-
public class Api
14+
public class ClientApi
1515
{
1616
private static string baseUrl = "http://localhost:3000";
1717

@@ -981,7 +981,7 @@ public async Task TestSupportIntArraysAsLists()
981981
var client = Client.Initialize(baseUrl);
982982

983983
var numbers = new List<int> { 1, 2, 3 };
984-
var result = await client.Table<User>().Insert(new User { Username = "WALRUS", FavoriteNumbers = numbers, AgeRange = new IntRange(15, 25) }, new QueryOptions { Upsert = true });
984+
var result = await client.Table<User>().Insert(new User { Username = "WALRUS", Status = "ONLINE", Catchphrase = "I'm a walrus", FavoriteNumbers = numbers, AgeRange = new IntRange(15, 25) }, new QueryOptions { Upsert = true });
985985

986986
CollectionAssert.AreEqual(numbers, result.Models.First().FavoriteNumbers);
987987
}

PostgrestTests/Coercion.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading.Tasks;
5+
using Microsoft.VisualStudio.TestTools.UnitTesting;
6+
using Postgrest;
7+
using PostgrestTests.Models;
8+
9+
namespace PostgrestTests
10+
{
11+
[TestClass]
12+
public class Coercion
13+
{
14+
private static string baseUrl = "http://localhost:3000";
15+
16+
[TestMethod]
17+
public async Task CanCoerceData()
18+
{
19+
var options = new StatelessClientOptions(baseUrl);
20+
21+
var stringValue = "test";
22+
var intValue = 1;
23+
var floatValue = 1.1f;
24+
var doubleValue = 1.1d;
25+
var dateTimeValue = new DateTime(2021, 12, 12);
26+
var listOfStrings = new List<string> { "test", "1", "2", "3" };
27+
var listOfDateTime = new List<DateTime> { new DateTime(2021, 12, 10), new DateTime(2021, 12, 11), new DateTime(2021, 12, 12) };
28+
var listOfInts = new List<int> { 1, 2, 3 };
29+
var listOfFloats = new List<float> { 1.1f, 1.2f, 1.3f };
30+
var intRange = new IntRange(0, 1);
31+
32+
33+
var model = new KitchenSink
34+
{
35+
StringValue = stringValue,
36+
IntValue = intValue,
37+
FloatValue = floatValue,
38+
DoubleValue = doubleValue,
39+
DateTimeValue = dateTimeValue,
40+
ListOfStrings = listOfStrings,
41+
ListOfDateTimes = listOfDateTime,
42+
ListOfInts = listOfInts,
43+
ListOfFloats = listOfFloats,
44+
IntRange = intRange
45+
};
46+
47+
48+
var insertedModel = await StatelessClient.Table<KitchenSink>(options).Insert(model);
49+
var actual = insertedModel.Models.First();
50+
51+
Assert.AreEqual(model.StringValue, actual.StringValue);
52+
Assert.AreEqual(model.IntValue, actual.IntValue);
53+
Assert.AreEqual(model.FloatValue, actual.FloatValue);
54+
Assert.AreEqual(model.DoubleValue, actual.DoubleValue);
55+
Assert.AreEqual(model.DateTimeValue, actual.DateTimeValue);
56+
CollectionAssert.AreEquivalent(model.ListOfStrings, actual.ListOfStrings);
57+
CollectionAssert.AreEquivalent(model.ListOfDateTimes, actual.ListOfDateTimes);
58+
CollectionAssert.AreEquivalent(model.ListOfInts, actual.ListOfInts);
59+
CollectionAssert.AreEquivalent(model.ListOfFloats, actual.ListOfFloats);
60+
Assert.AreEqual(model.IntRange.Start, actual.IntRange.Start);
61+
Assert.AreEqual(model.IntRange.End, actual.IntRange.End);
62+
63+
}
64+
}
65+
}

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ services:
1313
db:
1414
image: postgres:12
1515
ports:
16-
- "6543:5432"
16+
- "5432:5432"
1717
volumes:
1818
- ./PostgrestTests/db:/docker-entrypoint-initdb.d/
1919
environment:

0 commit comments

Comments
 (0)