public void Can_Serialize_Complex_Types() { // arrange var contextGraphBuilder = new ContextGraphBuilder(); contextGraphBuilder.AddResource <TestResource>("test-resource"); var contextGraph = contextGraphBuilder.Build(); var jsonApiContextMock = new Mock <IJsonApiContext>(); jsonApiContextMock.SetupAllProperties(); jsonApiContextMock.Setup(m => m.ContextGraph).Returns(contextGraph); jsonApiContextMock.Setup(m => m.Options).Returns(new JsonApiOptions()); jsonApiContextMock.Setup(m => m.RequestEntity) .Returns(contextGraph.GetContextEntity("test-resource")); jsonApiContextMock.Setup(m => m.MetaBuilder).Returns(new MetaBuilder()); jsonApiContextMock.Setup(m => m.PageManager).Returns(new PageManager()); var documentBuilder = new DocumentBuilder(jsonApiContextMock.Object); var serializer = new JsonApiSerializer(jsonApiContextMock.Object, documentBuilder); var resource = new TestResource { ComplexMember = new ComplexType { CompoundName = "testname" } }; // act var result = serializer.Serialize(resource); // assert Assert.NotNull(result); Assert.Equal("{\"data\":{\"attributes\":{\"complex-member\":{\"compound-name\":\"testname\"}},\"type\":\"test-resource\",\"id\":\"\"}}", result); }
public void WorksOnHttpErrors() { var target = new JsonApiSerializer <PersonResource>(); var result = target.Serialize(new HttpError(), DefaultUrl); _output.WriteLine(result.ToString()); Assert.Null(result["data"]); Assert.NotNull(result["errors"]); }
public void Gives() { var target = new JsonApiSerializer <PersonResource>(); var initialPerson = Get.Person(); var personJson = target.Serialize(initialPerson, DefaultUrl); var dsPerson = (Person)target.Deserialize(personJson, typeof(Person)); Assert.Equal(initialPerson.FirstName, dsPerson.FirstName); }
public void UsesConverters() { var target = new JsonApiSerializer <CompanyResource>(); var company = Get.Company(); target.JsonConverters.Add(new StringEnumConverter()); var result = target.Serialize(company, DefaultUrl); _output.WriteLine(result.ToString()); Assert.Equal(company.Location.ToString(), result["data"]["attributes"].Value <string>("location")); }
public void DoesNotIncludeNullData() { var target = new JsonApiSerializer <PersonResource>(); var model = new Person() { Identifier = "Id", Job = null }; var result = target.Serialize(model, DefaultUrl); Assert.Null(result["data"]["relationships"]["job"]["data"]); }
public void ReturnEmptyModelForUnknownFieldsetExpressions() { var target = new JsonApiSerializer <CompanyResource> { AllowQuery = true }; var companies = Get.Companies(1).ToList(); var result = target.Serialize(companies, new Uri(DefaultUrl, "?fields[corporation]=Notafield")); _output.WriteLine(result.ToString()); Assert.False(((JToken)result["data"][0]["attributes"]).HasValues); }
private string GetResponseBody(object responseObject, IJsonApiContext jsonApiContext, ILogger logger) { if (responseObject == null) { return(GetNullDataResponse()); } if (responseObject.GetType() == typeof(Error) || jsonApiContext.RequestEntity == null) { return(GetErrorJson(responseObject, logger)); } return(JsonApiSerializer.Serialize(responseObject, jsonApiContext)); }
public void UsesQueryFieldsetExpressions() { var target = new JsonApiSerializer <CompanyResource> { AllowQuery = true }; var companies = Get.Companies(1).ToList(); var result = target.Serialize(companies, new Uri(DefaultUrl, "?fields[corporation]=Name,Location")); _output.WriteLine(result.ToString()); Assert.NotNull(result["data"][0]["attributes"]["name"]); Assert.NotNull(result["data"][0]["attributes"]["location"]); Assert.Null(result["data"][0]["attributes"]["number-of-employees"]); }
public void UsesUrlBuilder() { var target = new JsonApiSerializer <PersonResource> { UrlPathBuilder = new CanonicalUrlPathBuilder() }; var result = target.Serialize(Get.Person(), DefaultUrl); _output.WriteLine(result.ToString()); var related = result["data"]["relationships"]["job"]["links"]["related"].Value <Uri>() .AbsolutePath; Assert.Equal("/corporations/456/", related); }
public void GivesUsefulErrorForEnumerable() { var target = new JsonApiSerializer <PersonResource> { AllowQuery = true }; var people = Get.People(100); var result = target.Serialize(people, new Uri(DefaultUrl, "?sort=fail-me")); _output.WriteLine(result.ToString()); var error = result["errors"][0]; Assert.Equal("Attribute 'fail-me' not found.", error["title"].Value <string>()); }
public void UsesQueryFieldsetExpressionsOnRelationships() { var target = new JsonApiSerializer <PersonResource> { AllowQuery = true }; var people = Get.People(1).ToList(); var result = target.Serialize(people, new Uri(DefaultUrl, "?fields[person]=Job")); _output.WriteLine(result.ToString()); var relationships = result["data"][0]["relationships"]; Assert.Null(relationships["family-members"]); Assert.NotNull(relationships["job"]); }
public void AppliesPagination() { var target = new JsonApiSerializer <PersonResource> { ItemsPerPage = 5, Paginate = true }; var people = Get.People(20).AsQueryable(); var result = target.Serialize(people, DefaultUrl); _output.WriteLine(result.ToString()); Assert.Equal(5, result["data"].Count()); Assert.NotNull(result["links"]["next"]); Assert.NotNull(result["links"]["first"]); Assert.Null(result["links"]["prev"]); }
public void PropertyInteraction() { var target = new JsonApiSerializer <PersonResource> { ItemsPerPage = 2, Paginate = false }; var people = Get.People(5); var result = target.Serialize(people, DefaultUrl); _output.WriteLine(result.ToString()); Assert.Equal(5, result["data"].Count()); Assert.Null(result["links"]["next"]); Assert.Null(result["links"]["first"]); Assert.NotNull(result["links"]["self"]); }
public void AppliesFilters() { var target = new JsonApiSerializer <CompanyResource> { AllowQuery = true }; var companies = Get.Companies(100).ToList().AsQueryable(); var result = target.Serialize(companies, new Uri(DefaultUrl, "?filter[location]=1")); _output.WriteLine(result.ToString()); var filtered = ((JArray)result["data"]).ToList(); var expected = companies.Where(x => x.Location == LocationType.National).ToList(); Assert.Equal(expected.Count, filtered.Count); }
public void when_serializing() { // Given JsonConvert.DefaultSettings = GetJsonSerializerSettings; var data = new Thing { Id = 5, SomeString = "some string value", SomeGuid = new Guid("77f8195e-ac2e-4c5f-9d0a-f7663ca24435"), NullValue = default(Uri), Bert = new Bert { Id = 45, Banaan = "fiets" }, Ernie = new Ernie { Banaan = "peer", Apple = "fiets" }, Fietsen = new [] { new Fiets { Id = 6, Naam = "batavia" }, new Fiets { Id = 7, Naam = "gazelle" }, new Fiets { Id = 8, Naam = "canondale" } } }; string expected = "{\"data\":{\"type\":\"things\",\"id\":\"5\",\"attributes\":{\"some-string\":\"some string value\",\"some-guid\":\"77f8195e-ac2e-4c5f-9d0a-f7663ca24435\",\"null-value\":null,\"ernie\":{\"banaan\":\"peer\",\"apple\":\"fiets\"}},\"relationships\":{\"bert\":{\"data\":{\"type\":\"berts\",\"id\":\"45\"}},\"fietsen\":{\"data\":[{\"type\":\"fiets\",\"id\":\"6\"},{\"type\":\"fiets\",\"id\":\"7\"},{\"type\":\"fiets\",\"id\":\"8\"}]}}}}"; // When string actual; using (var stream = new MemoryStream()) { ISerializer sut = new JsonApiSerializer(); sut.Serialize("application/vnd.api+json", data, stream); actual = Encoding.UTF8.GetString(stream.ToArray()); } // Then Assert.Equal(expected, actual); }
public void AppliesIncluding() { var target = new JsonApiSerializer <PersonResource>() { AllowQuery = true }; var people = Get.People(2).AsQueryable(); var result = target.Serialize(people, new Uri(DefaultUrl, "?include=job,car")); _output.WriteLine(result.ToString()); var included = ((JArray)result["included"]) .Where(x => x["type"].Value <string>() == "corporation" || x["type"].Value <string>() == "car") .ToList(); Assert.Equal(2, included.Count); }
private string GetResponseBody(object responseObject, IJsonApiContext jsonApiContext, ILogger logger) { if (responseObject.GetType() == typeof(Error) || jsonApiContext.RequestEntity == null) { if (responseObject.GetType() == typeof(Error)) { var errors = new ErrorCollection(); errors.Add((Error)responseObject); return(errors.GetJson()); } else { logger?.LogInformation("Response was not a JSONAPI entity. Serializing as plain JSON."); return(JsonConvert.SerializeObject(responseObject)); } } else { return(JsonApiSerializer.Serialize(responseObject, jsonApiContext)); } }
public void QueryOrderCorrect() { var target = new JsonApiSerializer <PersonResource> { AllowQuery = true, Paginate = true, ItemsPerPage = 10 }; var people = Get.People(100).AsQueryable(); var result = target.Serialize(people, new Uri(DefaultUrl, "?sort=-id")); _output.WriteLine(result.ToString()); var ids = ((JArray)result["data"]).Select(t => t["id"].Value <string>()); var expected = Enumerable.Range(0, 100) .OrderByDescending(i => i) .Take(10) .Select(i => i.ToString()); Assert.Equal(expected, ids); }
/// <inheritdoc/> public override async Task WriteToStreamAsync( Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext) { PreprocessResult preprocessed; if (_request.Properties.ContainsKey(Constants.PreprocessResultPropertyName)) { preprocessed = _request.Properties[Constants.PreprocessResultPropertyName] as PreprocessResult; } else { // backwards compatibility with old way to do Saule setup preprocessed = PreprocessingDelegatingHandler.PreprocessRequest(value, _request, _config); } var json = JsonApiSerializer.Serialize(preprocessed); await WriteJsonToStream(json, writeStream); }
public void AppliesSorting() { var target = new JsonApiSerializer <PersonResource> { AllowQuery = true }; // people needs to be > 80 so we always get doubles and we can // verify the -id properly var people = Get.People(100).AsQueryable(); var result = target.Serialize(people, new Uri(DefaultUrl, "?sort=+age,-id")); _output.WriteLine(result.ToString()); var props = ((JArray)result["data"]).Select(t => new { Age = t["attributes"]["age"].Value <int>(), Id = t["id"].Value <string>() }).ToList(); var expected = props.OrderBy(p => p.Age).ThenByDescending(p => p.Id); Assert.Equal(expected, props); }
public void HasAContract() { var target = new JsonApiSerializer <PersonResource>(); Assert.Throws <ArgumentNullException>(() => target.Serialize(Get.Person(), null)); }