Skip to content
This repository was archived by the owner on Jan 24, 2021. It is now read-only.

Commit d67d8b1

Browse files
author
Adam Hathcock
committed
Merge remote-tracking branch 'upstream/master' into non_buffered_requests
2 parents c7c11f6 + 188bc90 commit d67d8b1

File tree

18 files changed

+252
-147
lines changed

18 files changed

+252
-147
lines changed

src/Nancy.Demo.Razor.Localization/DemoBoostrapper.cs renamed to src/Nancy.Demo.Razor.Localization/DemoBootstrapper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{
33
using Bootstrapper;
44

5-
public class DemoBoostrapper : DefaultNancyBootstrapper
5+
public class DemoBootstrapper : DefaultNancyBootstrapper
66
{
77
protected override NancyInternalConfiguration InternalConfiguration
88
{

src/Nancy.Demo.Razor.Localization/Nancy.Demo.Razor.Localization.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080
</ItemGroup>
8181
<ItemGroup>
8282
<Compile Include="CustomResourceAssemblyProvider.cs" />
83-
<Compile Include="DemoBoostrapper.cs" />
83+
<Compile Include="DemoBootstrapper.cs" />
8484
<Compile Include="Modules\HomeModule.cs" />
8585
<Compile Include="Resources\Text.Designer.cs">
8686
<AutoGen>True</AutoGen>

src/Nancy.Tests/Nancy.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@
156156
<Compile Include="Unit\Json\TestData.cs" />
157157
<Compile Include="Unit\Json\TestPrimitiveConverter.cs" />
158158
<Compile Include="Unit\Json\TestPrimitiveConverterType.cs" />
159+
<Compile Include="Unit\Json\TypeWithTuple.cs" />
159160
<Compile Include="Unit\MimeTypesFixture.cs" />
160161
<Compile Include="Unit\ModelBinding\BindingMemberInfoFixture.cs" />
161162
<Compile Include="Unit\ModelBinding\ModelBindingExceptionFixture.cs" />
Lines changed: 178 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -1,134 +1,181 @@
11
namespace Nancy.Tests.Unit.Json
22
{
3-
using System;
4-
using System.Collections.Generic;
5-
using System.IO;
6-
using FakeItEasy;
7-
using Nancy.IO;
8-
using Nancy.Json;
9-
using Xunit;
10-
using Xunit.Extensions;
11-
using Xunit.Sdk;
12-
13-
public class JavaScriptSerializerFixture
14-
{
15-
[Fact]
16-
public void Should_register_converters_when_asked()
17-
{
18-
// Given
19-
JsonSettings.Converters.Add(new TestConverter());
20-
JsonSettings.PrimitiveConverters.Add(new TestPrimitiveConverter());
21-
22-
var defaultSerializer = new JavaScriptSerializer();
23-
24-
// When
25-
var serializer = new JavaScriptSerializer(
26-
registerConverters: true,
27-
resolver: null,
28-
maxJsonLength: defaultSerializer.MaxJsonLength,
29-
recursionLimit: defaultSerializer.RecursionLimit,
30-
retainCasing: defaultSerializer.RetainCasing,
31-
iso8601DateFormat: defaultSerializer.ISO8601DateFormat);
32-
33-
var data =
34-
new TestData()
35-
{
36-
ConverterData =
37-
new TestConverterType()
38-
{
39-
Data = 42,
40-
},
41-
42-
PrimitiveConverterData =
43-
new TestPrimitiveConverterType()
44-
{
45-
Data = 1701,
46-
},
47-
};
48-
49-
const string ExpectedJSON = @"{""converterData"":{""dataValue"":42},""primitiveConverterData"":1701}";
50-
51-
// Then
52-
serializer.Serialize(data).ShouldEqual(ExpectedJSON);
53-
54-
serializer.Deserialize<TestData>(ExpectedJSON).ShouldEqual(data);
55-
}
56-
57-
[Fact]
58-
public void Should_not_register_converters_when_not_asked()
59-
{
60-
// Given
61-
JsonSettings.Converters.Add(new TestConverter());
62-
JsonSettings.PrimitiveConverters.Add(new TestPrimitiveConverter());
63-
64-
var defaultSerializer = new JavaScriptSerializer();
65-
66-
// When
67-
var serializer = new JavaScriptSerializer(
68-
registerConverters: false,
69-
resolver: null,
70-
maxJsonLength: defaultSerializer.MaxJsonLength,
71-
recursionLimit: defaultSerializer.RecursionLimit,
72-
retainCasing: defaultSerializer.RetainCasing,
73-
iso8601DateFormat: defaultSerializer.ISO8601DateFormat);
74-
75-
var data =
76-
new TestData()
77-
{
78-
ConverterData =
79-
new TestConverterType()
80-
{
81-
Data = 42,
82-
},
83-
84-
PrimitiveConverterData =
85-
new TestPrimitiveConverterType()
86-
{
87-
Data = 1701,
88-
},
89-
};
90-
91-
const string ExpectedJSON = @"{""converterData"":{""data"":42},""primitiveConverterData"":{""data"":1701}}";
92-
93-
// Then
94-
serializer.Serialize(data).ShouldEqual(ExpectedJSON);
95-
96-
serializer.Deserialize<TestData>(ExpectedJSON).ShouldEqual(data);
97-
}
98-
99-
[Fact]
100-
public void Should_use_primitive_converter_when_available()
101-
{
102-
// When
103-
var serializer = new JavaScriptSerializer();
104-
105-
serializer.RegisterConverters(new JavaScriptPrimitiveConverter[] { new TestPrimitiveConverter() });
106-
107-
// Then
108-
serializer.Serialize(new TestPrimitiveConverterType() { Data = 12345 }).ShouldEqual("12345");
109-
110-
serializer.Deserialize<TestPrimitiveConverterType>("12345").ShouldEqual(new TestPrimitiveConverterType() { Data = 12345 });
111-
}
112-
113-
[Fact]
114-
public void Should_not_use_primitive_converter_for_wrong_type()
115-
{
116-
// When
117-
var serializer = new JavaScriptSerializer();
118-
119-
serializer.RegisterConverters(new JavaScriptPrimitiveConverter[] { new TestPrimitiveConverter() });
120-
121-
// Then
122-
serializer.Serialize(new TestConverterType() { Data = 12345 }).ShouldEqual(@"{""data"":12345}");
123-
124-
serializer.Deserialize<TestConverterType>(@"{""data"":12345}").ShouldEqual(new TestConverterType() { Data = 12345 });
125-
126-
try
127-
{
128-
serializer.Deserialize<TestConverterType>("12345");
129-
throw new ThrowsException(typeof(InvalidCastException));
130-
}
131-
catch { }
132-
}
133-
}
3+
using System;
4+
using System.Collections.Generic;
5+
using System.IO;
6+
using FakeItEasy;
7+
using Nancy.IO;
8+
using Nancy.Json;
9+
using Nancy.Json.Converters;
10+
11+
using Xunit;
12+
using Xunit.Extensions;
13+
using Xunit.Sdk;
14+
15+
public class JavaScriptSerializerFixture
16+
{
17+
[Fact]
18+
public void Should_register_converters_when_asked()
19+
{
20+
// Given
21+
JsonSettings.Converters.Add(new TestConverter());
22+
JsonSettings.PrimitiveConverters.Add(new TestPrimitiveConverter());
23+
24+
var defaultSerializer = new JavaScriptSerializer();
25+
26+
// When
27+
var serializer = new JavaScriptSerializer(
28+
registerConverters: true,
29+
resolver: null,
30+
maxJsonLength: defaultSerializer.MaxJsonLength,
31+
recursionLimit: defaultSerializer.RecursionLimit,
32+
retainCasing: defaultSerializer.RetainCasing,
33+
iso8601DateFormat: defaultSerializer.ISO8601DateFormat);
34+
35+
var data =
36+
new TestData()
37+
{
38+
ConverterData =
39+
new TestConverterType()
40+
{
41+
Data = 42,
42+
},
43+
44+
PrimitiveConverterData =
45+
new TestPrimitiveConverterType()
46+
{
47+
Data = 1701,
48+
},
49+
};
50+
51+
const string ExpectedJSON = @"{""converterData"":{""dataValue"":42},""primitiveConverterData"":1701}";
52+
53+
// Then
54+
serializer.Serialize(data).ShouldEqual(ExpectedJSON);
55+
56+
serializer.Deserialize<TestData>(ExpectedJSON).ShouldEqual(data);
57+
}
58+
59+
[Fact]
60+
public void Should_not_register_converters_when_not_asked()
61+
{
62+
// Given
63+
JsonSettings.Converters.Add(new TestConverter());
64+
JsonSettings.PrimitiveConverters.Add(new TestPrimitiveConverter());
65+
66+
var defaultSerializer = new JavaScriptSerializer();
67+
68+
// When
69+
var serializer = new JavaScriptSerializer(
70+
registerConverters: false,
71+
resolver: null,
72+
maxJsonLength: defaultSerializer.MaxJsonLength,
73+
recursionLimit: defaultSerializer.RecursionLimit,
74+
retainCasing: defaultSerializer.RetainCasing,
75+
iso8601DateFormat: defaultSerializer.ISO8601DateFormat);
76+
77+
var data =
78+
new TestData()
79+
{
80+
ConverterData =
81+
new TestConverterType()
82+
{
83+
Data = 42,
84+
},
85+
86+
PrimitiveConverterData =
87+
new TestPrimitiveConverterType()
88+
{
89+
Data = 1701,
90+
},
91+
};
92+
93+
const string ExpectedJSON = @"{""converterData"":{""data"":42},""primitiveConverterData"":{""data"":1701}}";
94+
95+
// Then
96+
serializer.Serialize(data).ShouldEqual(ExpectedJSON);
97+
98+
serializer.Deserialize<TestData>(ExpectedJSON).ShouldEqual(data);
99+
}
100+
101+
[Fact]
102+
public void Should_use_primitive_converter_when_available()
103+
{
104+
// When
105+
var serializer = new JavaScriptSerializer();
106+
107+
serializer.RegisterConverters(new JavaScriptPrimitiveConverter[] { new TestPrimitiveConverter() });
108+
109+
// Then
110+
serializer.Serialize(new TestPrimitiveConverterType() { Data = 12345 }).ShouldEqual("12345");
111+
112+
serializer.Deserialize<TestPrimitiveConverterType>("12345").ShouldEqual(new TestPrimitiveConverterType() { Data = 12345 });
113+
}
114+
115+
[Fact]
116+
public void Should_not_use_primitive_converter_for_wrong_type()
117+
{
118+
// When
119+
var serializer = new JavaScriptSerializer();
120+
121+
serializer.RegisterConverters(new JavaScriptPrimitiveConverter[] { new TestPrimitiveConverter() });
122+
123+
// Then
124+
serializer.Serialize(new TestConverterType() { Data = 12345 }).ShouldEqual(@"{""data"":12345}");
125+
126+
serializer.Deserialize<TestConverterType>(@"{""data"":12345}").ShouldEqual(new TestConverterType() { Data = 12345 });
127+
128+
try
129+
{
130+
serializer.Deserialize<TestConverterType>("12345");
131+
throw new ThrowsException(typeof(InvalidCastException));
132+
}
133+
catch { }
134+
}
135+
136+
[Fact]
137+
public void Should_serialize_tuples()
138+
{
139+
var serializer = new JavaScriptSerializer();
140+
serializer.RegisterConverters(new[] { new TupleConverter() });
141+
142+
var tuple = Tuple.Create(10, 11);
143+
serializer.Serialize(tuple).ShouldEqual(@"{""item1"":10,""item2"":11}");
144+
}
145+
146+
[Fact]
147+
public void Should_deserialize_tuple()
148+
{
149+
var serializer = new JavaScriptSerializer();
150+
serializer.RegisterConverters(new[] { new TupleConverter() });
151+
152+
string body = @"{""item1"":10,""item2"":11}";
153+
Tuple<int, int> result = serializer.Deserialize<Tuple<int, int>>(body);
154+
result.ToString().ShouldEqual("(10, 11)");
155+
}
156+
157+
[Fact]
158+
public void Should_deserialize_string_tuple()
159+
{
160+
var serializer = new JavaScriptSerializer();
161+
serializer.RegisterConverters(new[] { new TupleConverter() });
162+
163+
string body = @"{""item1"":""Hello"",""item2"":""World"",""item3"":42}";
164+
var result = serializer.Deserialize<Tuple<string, string, int>>(body);
165+
result.ToString().ShouldEqual("(Hello, World, 42)");
166+
}
167+
168+
[Fact]
169+
public void Should_deserialize_type_with_tuples()
170+
{
171+
// When
172+
var serializer = new JavaScriptSerializer();
173+
serializer.RegisterConverters(new[] { new TupleConverter() });
174+
175+
// Then
176+
var typeWithTuple = serializer.Deserialize<TypeWithTuple>(@"{""value"":{""item1"":10,""item2"":11}}");
177+
typeWithTuple.Value.Item1.ShouldEqual(10);
178+
typeWithTuple.Value.Item2.ShouldEqual(11);
179+
}
180+
}
134181
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace Nancy.Tests.Unit.Json
2+
{
3+
using System;
4+
5+
public class TypeWithTuple
6+
{
7+
public Tuple<int, int> Value { get; set; }
8+
}
9+
}

src/Nancy.Tests/Unit/Responses/EmbeddedFileResponseFixture.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public void Should_contain_etag_in_response_header_if_embedded_resource_exists()
1414
new EmbeddedFileResponse(this.GetType().Assembly, "Nancy.Tests", "Resources.Views.staticviewresource.html");
1515

1616
// Then
17-
response.Headers["ETag"].ShouldEqual("\"5D6EFDFDB135DC90F16D57E05603DA1E\"");
17+
response.Headers["ETag"].ShouldEqual("\"B9D9DC2B50ADFD0867749D4837C63556339080CE\"");
1818
}
1919

2020
[Fact]
@@ -30,7 +30,7 @@ public void Should_contain_etag_in_response_header_if_embedded_resource_exists_w
3030
response.Contents.Invoke(outputStream);
3131

3232
// Then
33-
response.Headers["ETag"].ShouldEqual("\"5D6EFDFDB135DC90F16D57E05603DA1E\"");
33+
response.Headers["ETag"].ShouldEqual("\"B9D9DC2B50ADFD0867749D4837C63556339080CE\"");
3434
}
3535

3636
[Fact]

src/Nancy/Bootstrapper/NancyBootstrapperBase.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,9 @@ public void Initialise()
244244

245245
this.ConfigureApplicationContainer(this.ApplicationContainer);
246246

247+
// We need to call this to fix an issue with assemblies that are referenced by DI not being loaded
248+
AppDomainAssemblyTypeScanner.UpdateTypes();
249+
247250
var typeRegistrations = this.InternalConfiguration.GetTypeRegistations()
248251
.Concat(this.GetAdditionalTypes());
249252

src/Nancy/Bootstrapper/NancyBootstrapperLocator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
/// <summary>
88
/// Class for locating an INancyBootstrapper implementation.
9-
///
9+
///
1010
/// Will search the app domain for a non-abstract one, and if it can't find one
1111
/// it will use the default nancy one that uses TinyIoC.
1212
/// </summary>
@@ -70,7 +70,7 @@ internal static bool TryFindMostDerivedType(List<Type> customBootstrappers, out
7070
var set = new HashSet<Type>();
7171
bootstrapper = null;
7272

73-
if (customBootstrappers.All(boostrapper => set.Add(boostrapper.BaseType)))
73+
if (customBootstrappers.All(b => set.Add(b.BaseType)))
7474
{
7575
var except = customBootstrappers.Except(set).ToList();
7676
bootstrapper = except.Count == 1 ? except[0] : null;

0 commit comments

Comments
 (0)