public static DocumentRoot <List <Article> > GenerateDocumentRoot(int listSize)
        {
            var fixture = new Fixture();

            fixture.Customize <Article>(composer => composer.Without(x => x.Type).Without(x => x.Links));
            fixture.Customize <Comment>(composer => composer.Without(x => x.Type).Without(x => x.Links));
            fixture.Customize <Person>(composer => composer.Without(x => x.Type).Without(x => x.Links));
            fixture.Customize <Person>(composer => new ElementsBuilder <Person>(fixture.CreateMany <Person>(Math.Max(1, listSize / 10)).ToList()));


            return(DocumentRoot.Create(fixture.CreateMany <Article>(listSize).ToList()));
        }
        public void When_id_null_should_serialize_as_string()
        {
            var root = DocumentRoot.Create(new
            {
                Id     = (int?)null,
                Type   = "articles",
                Title  = "My title",
                Author = ResourceIdentifier.Create(new
                {
                    Id   = 7357, //int relationship
                    Type = "person",
                    Name = "Scribble McPen"
                })
            });

            var json = JsonConvert.SerializeObject(root, new JsonApiSerializerSettings()
            {
                NullValueHandling = NullValueHandling.Include,
                Formatting        = Formatting.Indented
            });
            var expectedjson = @"{
              ""data"": {
                ""id"": null,
                ""type"": ""articles"",
                ""attributes"": {
                  ""title"": ""My title""
                },
                ""relationships"": {
                  ""author"": {
                    ""data"": {
                      ""id"": ""7357"",
                      ""type"": ""person""
                    }
                  }
                }
              },
              ""included"": [
                {
                  ""id"": ""7357"",
                  ""type"": ""person"",
                  ""attributes"": {
                    ""name"": ""Scribble McPen""
                  }
                }
              ]
            }";

            Assert.Equal(expectedjson, json, JsonStringEqualityComparer.Instance);
        }
        public void When_id_int_in_explicit_identifier_should_serialize_as_string()
        {
            var root = DocumentRoot.Create(new
            {
                Id     = 7357, //int id
                Type   = "articles",
                Title  = "My title",
                Author = ResourceIdentifier.Create(new
                {
                    Id   = 7357, //int relationship
                    Type = "person",
                    Name = "Scribble McPen"
                })
            });

            var json         = JsonConvert.SerializeObject(root, settings);
            var expectedjson = @"{
              ""data"": {
                ""id"": ""7357"",
                ""type"": ""articles"",
                ""attributes"": {
                  ""title"": ""My title""
                },
                ""relationships"": {
                  ""author"": {
                    ""data"": {
                      ""id"": ""7357"",
                      ""type"": ""person""
                    }
                  }
                }
              },
              ""included"": [
                {
                  ""id"": ""7357"",
                  ""type"": ""person"",
                  ""attributes"": {
                    ""name"": ""Scribble McPen""
                  }
                }
              ]
            }";

            Assert.Equal(expectedjson, json, JsonStringEqualityComparer.Instance);
        }
        public void When_relationshp_with_resource_identifier_should_serialize()
        {
            var root = DocumentRoot.Create(new
            {
                Id     = "1234",
                Type   = "articles",
                Title  = "My Article",
                Author = new Relationship <ResourceIdentifier <Person> >()
                {
                    Data = new ResourceIdentifier <Person>()
                    {
                        Meta = new Meta {
                            { "primary-author", true }
                        },
                        Value = new Person
                        {
                            Id        = "333",
                            Type      = "people",
                            FirstName = "John",
                            LastName  = "Smith",
                            Twitter   = "jsmi",
                            Meta      = new Meta()
                            {
                                { "best-sellers", 4 }
                            }
                        }
                    },
                    Meta = new Meta {
                        { "self-published", true }
                    }
                },
                Comments = Relationship.Create(new List <ResourceIdentifier <Comment> >
                {
                    ResourceIdentifier.Create(new Comment()
                    {
                        Id   = "57",
                        Type = "comments",
                        Body = "I give it a 5 out of 7"
                    })
                })
            });

            var json         = JsonConvert.SerializeObject(root, settings);
            var expectedjson = @"{
                ""data"": {
                    ""id"": ""1234"",
                    ""type"": ""articles"",
                    ""attributes"": {
                        ""title"": ""My Article""
                    },
                    ""relationships"": {
                        ""author"": {
                            ""data"": { 
                                ""id"":""333"", 
                                ""type"":""people"",
                                ""meta"":{ ""primary-author"": true}
                            },
                            ""meta"": {""self-published"": true},
                        },
                        ""comments"": {
                            ""data"": [{ 
                                ""id"":""57"", 
                                ""type"":""comments"",
                            }]
                        }
                    }
                },
                ""included"" : [
                    {
                        ""id"": ""333"",
                        ""type"": ""people"",
                        ""attributes"":{
                            ""first-name"": ""John"",
                            ""last-name"": ""Smith"",
                            ""twitter"": ""jsmi""
                        },
                        ""meta"":{ ""best-sellers"": 4}

                    },
                    {
                        ""id"": ""57"",
                        ""type"": ""comments"",
                        ""attributes"":{
                            ""body"": ""I give it a 5 out of 7""
                        }
                    }
                ]
            }";

            Assert.Equal(expectedjson, json, JsonStringEqualityComparer.Instance);
        }
        public void When_relationship_not_identifable_from_property_type_should_serialize_as_relationship()
        {
            var article = new
            {
                id     = "1234",
                Title  = "My Article",
                type   = "articles",
                author = (object)new //declared object but actaul type is relationship
                {
                    Id        = "333",
                    type      = "people",
                    FirstName = "John",
                    LastName  = "Smith",
                    Twitter   = "jsmi"
                },
                timestamps = (object)new //declared object but actaul type is attribute
                {
                    published = new DateTime(2018, 10, 28),
                    edited    = new DateTime(2018, 10, 31),
                }
            };
            var root = DocumentRoot.Create((object)article);

            var json = JsonConvert.SerializeObject(root, settings);

            var expectedjson = @"{
                ""data"": {
                    ""id"": ""1234"",
                    ""type"": ""articles"",
                    ""attributes"": {
                        ""title"": ""My Article"",
                        ""timestamps"": {
                            ""published"": ""2018-10-28T00:00:00"",
                            ""edited"": ""2018-10-31T00:00:00""
                        }
                    },
                    ""relationships"": {
                        ""author"": {
                            ""data"": { 
                                ""id"":""333"", 
                                ""type"":""people""
                            }
                        }
                    }
                },
                ""included"" : [
                    {
                        ""id"": ""333"",
                        ""type"": ""people"",
                        ""attributes"":{
                            ""firstName"": ""John"",
                            ""lastName"": ""Smith"",
                            ""twitter"": ""jsmi""
                        }

                    }
                ]
            }";

            Assert.Equal(expectedjson, json, JsonStringEqualityComparer.Instance);
        }