Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ private static void Main(string[] args)
var services = builder.Services;

services.AddControllers()
.AddNewtonsoftJson()
.AddXmlSerializerFormatters();
services.AddScoped<IValuesRepository, ValuesRepository>();
services.AddLinks(config =>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
Expand All @@ -8,8 +8,4 @@
<ItemGroup>
<ProjectReference Include="..\..\..\..\src\RiskFirst.Hateoas\RiskFirst.Hateoas.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.2" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
using System.Net.Http.Headers;
using System.Xml.Serialization;
using Microsoft.AspNetCore.Mvc.Testing;
using Newtonsoft.Json;
using RiskFirst.Hateoas.BasicSample.Models;
using RiskFirst.Hateoas.Models;

namespace RiskFirst.Hateoas.BasicSample.Tests;

public class BasicTests
: IClassFixture<WebApplicationFactory<Program>>
public class BasicTests : IClassFixture<WebApplicationFactory<Program>>
{
private readonly WebApplicationFactory<Program> _factory;

Expand All @@ -24,13 +22,12 @@ public async Task GetAllValues_Json_ReturnsObjectsWithLinks()
var client = _factory.CreateClient();

// Act
var response = await client.GetAsync("/api/values");
response.EnsureSuccessStatusCode();
var values = await client.GetFromJsonAsync<ItemsLinkContainer<ValueInfo>>("/api/values");

var responseString = await response.Content.ReadAsStringAsync();
var values = JsonConvert.DeserializeObject<ItemsLinkContainer<ValueInfo>>(responseString);
// Assert
var items = values?.Items ?? Enumerable.Empty<ValueInfo>();

Assert.All(values.Items, i => Assert.True(i.Links.Count > 0, "Invalid number of links"));
Assert.All(items, i => Assert.True(i.Links.Count > 0, "Invalid number of links"));
}

[Fact]
Expand All @@ -41,13 +38,14 @@ public async Task GetAllValues_Xml_ReturnsObjectsWithLinks()

// Act
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
var response = await client.GetAsync("/api/values");
response.EnsureSuccessStatusCode();
var responseString = await client.GetStringAsync("/api/values");

var responseString = await response.Content.ReadAsStringAsync();
var values = DeserializeXml<ItemsLinkContainer<ValueInfo>>(responseString);

Assert.All(values.Items, i => Assert.True(i.Links.Count > 0, "Invalid number of links"));
// Assert
var items = values?.Items ?? Enumerable.Empty<ValueInfo>();

Assert.All(items, i => Assert.True(i.Links.Count > 0, "Invalid number of links"));
}

[Fact]
Expand All @@ -56,14 +54,13 @@ public async Task GetValue_Json_AlternateRoute_ReturnsObjectsWithLinks()
// Arrange
var client = _factory.CreateClient();

// Act
var response = await client.GetAsync("/api/values/v2/1");
response.EnsureSuccessStatusCode();
var test = await client.GetStringAsync("/api/values/v2/1");

var responseString = await response.Content.ReadAsStringAsync();
var value = JsonConvert.DeserializeObject<ValueInfo>(responseString);
// Act
var value = await client.GetFromJsonAsync<ValueInfo>("/api/values/v2/1");

Assert.True(value.Links.Count > 0, "Invalid number of links");
// Assert
Assert.True(value?.Links.Count > 0, "Invalid number of links");
}

[Fact]
Expand All @@ -74,13 +71,12 @@ public async Task GetValue_Xml_AlternateRoute_ReturnsObjectsWithLinks()

// Act
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
var response = await client.GetAsync("/api/values/v2/1");
response.EnsureSuccessStatusCode();
var responseString = await client.GetStringAsync("/api/values/v2/1");

var responseString = await response.Content.ReadAsStringAsync();
var value = DeserializeXml<ValueInfo>(responseString);

Assert.True(value.Links.Count > 0, "Invalid number of links");
// Assert
Assert.True(value?.Links.Count > 0, "Invalid number of links");
}

[Fact]
Expand All @@ -89,14 +85,11 @@ public async Task GetValue_Json_ReturnsObjectsWithLinks()
// Arrange
var client = _factory.CreateClient();

// Act
var response = await client.GetAsync("/api/values/1");
response.EnsureSuccessStatusCode();

var responseString = await response.Content.ReadAsStringAsync();
var value = JsonConvert.DeserializeObject<ValueInfo>(responseString);
// Value
var value = await client.GetFromJsonAsync<ValueInfo>("/api/values/1");

Assert.True(value.Links.Count > 0, "Invalid number of links");
// Assert
Assert.True(value?.Links.Count > 0, "Invalid number of links");
}

[Fact]
Expand All @@ -107,21 +100,19 @@ public async Task GetValue_Xml_ReturnsObjectsWithLinks()

// Act
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
var response = await client.GetAsync("/api/values/1");
response.EnsureSuccessStatusCode();
var responseString = await client.GetStringAsync("/api/values/1");

var responseString = await response.Content.ReadAsStringAsync();
var value = DeserializeXml<ValueInfo>(responseString);

Assert.True(value.Links.Count > 0, "Invalid number of links");
// Assert
Assert.True(value?.Links.Count > 0, "Invalid number of links");
}

private static T DeserializeXml<T>(string xml)
private static T? DeserializeXml<T>(string xml)
{
using (var reader = new StringReader(xml))
{
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(reader);
}
using var reader = new StringReader(xml);

var serializer = new XmlSerializer(typeof(T));
return (T?)serializer.Deserialize(reader);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
Expand All @@ -10,7 +10,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="7.0.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ private static void Main(string[] args)

var services = builder.Services;

services.AddControllers()
.AddNewtonsoftJson();
services.AddControllers();

services.AddTransient<ILinksHandler, ApiRootLinkHandler>();
services.AddScoped<IValuesRepository, ValuesRepository>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
Expand All @@ -9,8 +9,4 @@
<ItemGroup>
<ProjectReference Include="..\..\..\..\src\RiskFirst.Hateoas\RiskFirst.Hateoas.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.2" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using Microsoft.AspNetCore.Mvc.Testing;
using Newtonsoft.Json;
using RiskFirst.Hateoas.CustomRequirementSample.Models;
using RiskFirst.Hateoas.CustomRequirementsSample.Tests;
using RiskFirst.Hateoas.Models;
using System.Net.Http.Json;

namespace RiskFirst.Hateoas.CustomRequirementsSample.TestsNew;

Expand All @@ -23,11 +23,9 @@ public async Task GetAllValues_Json_ReturnsLinksWithRootApi()
var client = _factory.CreateClient();

// Act
var response = await client.GetAsync("/api/values");
response.EnsureSuccessStatusCode();
var test = await client.GetStringAsync("/api/values");

var responseString = await response.Content.ReadAsStringAsync();
var values = JsonConvert.DeserializeObject<ItemsLinkContainer<ValueInfo>>(responseString);
var values = await client.GetFromJsonAsync<ItemsLinkContainer<ValueInfo>>("/api/values");

Assert.Contains(
new Link
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
Expand All @@ -10,7 +10,6 @@
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="7.0.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ private static void Main(string[] args)

var services = builder.Services;

services.AddControllers()
.AddNewtonsoftJson();
services.AddControllers();
services.AddScoped<IValuesRepository, ValuesRepository>();
services.AddLinks(config =>
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
Expand All @@ -9,8 +9,4 @@
<ItemGroup>
<ProjectReference Include="..\..\..\..\src\RiskFirst.Hateoas\RiskFirst.Hateoas.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.2" />
</ItemGroup>
</Project>
2 changes: 1 addition & 1 deletion src/RiskFirst.Hateoas.Models/Link.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
using System.Xml.Serialization;

namespace RiskFirst.Hateoas.Models
Expand Down
4 changes: 2 additions & 2 deletions src/RiskFirst.Hateoas.Models/LinkCollection.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using Newtonsoft.Json;
using System.Collections;
using System.Collections;
using System.Collections.Generic;
using System.Text.Json.Serialization;

namespace RiskFirst.Hateoas.Models
{
Expand Down
19 changes: 10 additions & 9 deletions src/RiskFirst.Hateoas.Models/LinkCollectionConverter.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
using Newtonsoft.Json;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace RiskFirst.Hateoas.Models
{
public class LinkCollectionConverter : JsonConverter<LinkCollection>
{
public override LinkCollection ReadJson(JsonReader reader, Type objectType, LinkCollection existingValue, bool hasExistingValue, JsonSerializer serializer)
public override LinkCollection Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var links = (Dictionary<string, Link>)serializer
.Deserialize(reader, typeof(Dictionary<string, Link>));
var links = JsonSerializer.Deserialize<Dictionary<string, Link>>(ref reader, options);

var existingValue = new LinkCollection();

foreach (var link in links)
{
Expand All @@ -21,12 +23,11 @@ public override LinkCollection ReadJson(JsonReader reader, Type objectType, Link
return existingValue;
}

public override void WriteJson(JsonWriter writer, LinkCollection value, JsonSerializer serializer)
public override void Write(Utf8JsonWriter writer, LinkCollection value, JsonSerializerOptions options)
{
var links = value?
.ToDictionary(x => x.Name, x => x);
var links = value?.ToDictionary(x => x.Name, x => x);

serializer.Serialize(writer, links);
JsonSerializer.Serialize(writer, links);
}
}
}
7 changes: 3 additions & 4 deletions src/RiskFirst.Hateoas.Models/LinkContainer.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System.Xml.Serialization;
using System.Xml.Serialization;
using System.Text.Json.Serialization;

namespace RiskFirst.Hateoas.Models
{
public abstract class LinkContainer : ILinkContainer
{
[XmlElement("link")]
[JsonProperty(PropertyName = "_links")]
[JsonPropertyName("_links")]
public LinkCollection Links { get; set; } = new LinkCollection();

public void Add(Link link)
Expand Down
9 changes: 5 additions & 4 deletions src/RiskFirst.Hateoas.Models/RiskFirst.Hateoas.Models.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,16 @@
v3.1.1 - version bump to match main assembly
v3.1.2 - Patch Security Issues
v4.0.0 - version bump to match main assembly
v5.0.0 - using System.Text.Json
</PackageReleaseNotes>
<Version>4.0.0</Version>
<Version>5.0.0</Version>
<PackageIconUrl>https://raw.githubusercontent.com/riskfirst/pkgicons/master/riskfirst-pkg.png</PackageIconUrl>
<AssemblyVersion>4.0.0.0</AssemblyVersion>
<FileVersion>4.0.0.0</FileVersion>
<AssemblyVersion>5.0.0.0</AssemblyVersion>
<FileVersion>5.0.0.0</FileVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="newtonsoft.json" Version="13.0.2" />
<PackageReference Include="System.Text.Json" Version="8.0.5" />
</ItemGroup>

</Project>
7 changes: 4 additions & 3 deletions src/RiskFirst.Hateoas/RiskFirst.Hateoas.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,12 @@
v3.1.1 - bug fix for routes with more than 1 HttpMethodAttribute
v3.1.2 - Patch Security Issues
v4.0.0 - Drop .NET Framework support
v5.0.0 - RiskFirst.Hateoas.Models v5.0.0
</PackageReleaseNotes>
<Version>4.0.0</Version>
<Version>5.0.0</Version>
<PackageIconUrl>https://raw.githubusercontent.com/riskfirst/pkgicons/master/riskfirst-pkg.png</PackageIconUrl>
<AssemblyVersion>4.0.0.0</AssemblyVersion>
<FileVersion>4.0.0.0</FileVersion>
<AssemblyVersion>5.0.0.0</AssemblyVersion>
<FileVersion>5.0.0.0</FileVersion>
</PropertyGroup>

<ItemGroup>
Expand Down
Loading