public static IResourceGraph CreateResourceGraph()
        {
            IResourceGraphBuilder builder = new ResourceGraphBuilder();

            builder.AddResource <BenchmarkResource>(BenchmarkResourcePublicNames.Type);
            return(builder.Build());
        }
Example #2
0
        public static IResourceGraph CreateResourceGraph(IJsonApiOptions options)
        {
            ResourceGraphBuilder builder = new ResourceGraphBuilder(options, NullLoggerFactory.Instance);

            builder.Add <BenchmarkResource>(BenchmarkResourcePublicNames.Type);
            return(builder.Build());
        }
Example #3
0
        protected IResourceGraph BuildGraph()
        {
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <TestResource>("testResource");
            resourceGraphBuilder.AddResource <TestResourceWithList>("testResource-with-list");
            // one to one relationships
            resourceGraphBuilder.AddResource <OneToOnePrincipal>("oneToOnePrincipals");
            resourceGraphBuilder.AddResource <OneToOneDependent>("oneToOneDependents");
            resourceGraphBuilder.AddResource <OneToOneRequiredDependent>("oneToOneRequiredDependents");
            // one to many relationships
            resourceGraphBuilder.AddResource <OneToManyPrincipal>("oneToManyPrincipals");
            resourceGraphBuilder.AddResource <OneToManyDependent>("oneToManyDependents");
            resourceGraphBuilder.AddResource <OneToManyRequiredDependent>("oneToMany-requiredDependents");
            // collective relationships
            resourceGraphBuilder.AddResource <MultipleRelationshipsPrincipalPart>("multiPrincipals");
            resourceGraphBuilder.AddResource <MultipleRelationshipsDependentPart>("multiDependents");

            resourceGraphBuilder.AddResource <Article>();
            resourceGraphBuilder.AddResource <Person>();
            resourceGraphBuilder.AddResource <Blog>();
            resourceGraphBuilder.AddResource <Food>();
            resourceGraphBuilder.AddResource <Song>();

            return(resourceGraphBuilder.Build());
        }
        protected IResourceGraph BuildGraph()
        {
            var resourceGraphBuilder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            resourceGraphBuilder.Add <TestResource>("testResource");
            resourceGraphBuilder.Add <TestResourceWithList>("testResource-with-list");
            // one to one relationships
            resourceGraphBuilder.Add <OneToOnePrincipal>("oneToOnePrincipals");
            resourceGraphBuilder.Add <OneToOneDependent>("oneToOneDependents");
            resourceGraphBuilder.Add <OneToOneRequiredDependent>("oneToOneRequiredDependents");
            // one to many relationships
            resourceGraphBuilder.Add <OneToManyPrincipal>("oneToManyPrincipals");
            resourceGraphBuilder.Add <OneToManyDependent>("oneToManyDependents");
            resourceGraphBuilder.Add <OneToManyRequiredDependent>("oneToMany-requiredDependents");
            // collective relationships
            resourceGraphBuilder.Add <MultipleRelationshipsPrincipalPart>("multiPrincipals");
            resourceGraphBuilder.Add <MultipleRelationshipsDependentPart>("multiDependents");

            resourceGraphBuilder.Add <Article>();
            resourceGraphBuilder.Add <Person>();
            resourceGraphBuilder.Add <Blog>();
            resourceGraphBuilder.Add <Food>();
            resourceGraphBuilder.Add <Song>();

            return(resourceGraphBuilder.Build());
        }
        public void Can_Deserialize_Object_With_HasManyRelationship()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <OneToManyIndependent>("independents");
            resourceGraphBuilder.AddResource <OneToManyDependent>("dependents");
            var resourceGraph = resourceGraphBuilder.Build();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary <AttrAttribute, object>());
            jsonApiContextMock.Setup(m => m.RelationshipsToUpdate).Returns(new Dictionary <RelationshipAttribute, object>());
            jsonApiContextMock.Setup(m => m.HasManyRelationshipPointers).Returns(new HasManyRelationshipPointers());

            var jsonApiOptions = new JsonApiOptions();

            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);

            var deserializer = new JsonApiDeSerializer(jsonApiContextMock.Object);

            var contentString =
                @"{
                ""data"": {
                    ""type"": ""independents"",
                    ""id"": ""1"",
                    ""attributes"": { },
                    ""relationships"": {
                        ""dependents"": {
                            ""data"": [
                                {
                                    ""type"": ""dependents"",
                                    ""id"": ""2""
                                }
                            ]
                        }
                    }
                }
            }";

            // act
            var result = deserializer.Deserialize <OneToManyIndependent>(contentString);

            // assert
            Assert.NotNull(result);
            Assert.Equal(1, result.Id);
            Assert.NotNull(result.Dependents);
            Assert.NotEmpty(result.Dependents);
            Assert.Single(result.Dependents);

            var dependent = result.Dependents[0];

            Assert.Equal(2, dependent.Id);
        }
        public void Immutable_Attrs_Are_Not_Included_In_AttributesToUpdate()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <TestResource>("test-resource");
            var resourceGraph = resourceGraphBuilder.Build();

            var attributesToUpdate = new Dictionary <AttrAttribute, object>();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(attributesToUpdate);

            var jsonApiOptions = new JsonApiOptions();

            jsonApiOptions.SerializerSettings.ContractResolver = new DasherizedResolver();
            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);

            var deserializer = new JsonApiDeSerializer(jsonApiContextMock.Object);

            var content = new Document
            {
                Data = new ResourceObject {
                    Type       = "test-resource",
                    Id         = "1",
                    Attributes = new Dictionary <string, object>
                    {
                        {
                            "complex-member", new Dictionary <string, string> {
                                { "compound-name", "testName" }
                            }
                        },
                        { "immutable", "value" }
                    }
                }
            };

            var contentString = JsonConvert.SerializeObject(content);

            // act
            var result = deserializer.Deserialize <TestResource>(contentString);

            // assert
            Assert.NotNull(result.ComplexMember);
            Assert.Single(attributesToUpdate);

            foreach (var attr in attributesToUpdate)
            {
                Assert.False(attr.Key.IsImmutable);
            }
        }
        public void Can_Deserialize_Independent_Side_Of_One_To_One_Relationship_With_Relationship_Body()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <Independent>("independents");
            resourceGraphBuilder.AddResource <Dependent>("dependents");
            var resourceGraph = resourceGraphBuilder.Build();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary <AttrAttribute, object>());
            jsonApiContextMock.Setup(m => m.HasOneRelationshipPointers).Returns(new HasOneRelationshipPointers());

            var jsonApiOptions = new JsonApiOptions();

            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);

            var deserializer = new JsonApiDeSerializer(jsonApiContextMock.Object);

            var property = Guid.NewGuid().ToString();
            var content  = new Document
            {
                Data = new ResourceObject {
                    Type       = "independents",
                    Id         = "1",
                    Attributes = new Dictionary <string, object> {
                        { "property", property }
                    },
                    // a common case for this is deserialization in unit tests
                    Relationships = new Dictionary <string, RelationshipData> {
                        {
                            "dependent", new RelationshipData
                            {
                                SingleData = new ResourceIdentifierObject("dependents", "1")
                            }
                        }
                    }
                }
            };

            var contentString = JsonConvert.SerializeObject(content);

            // act
            var result = deserializer.Deserialize <Independent>(contentString);

            // assert
            Assert.NotNull(result);
            Assert.Equal(property, result.Property);
            Assert.NotNull(result.Dependent);
            Assert.Equal(1, result.Dependent.Id);
        }
        public void Can_add_resources_from_assembly_to_graph()
        {
            // Arrange
            var facade = new ServiceDiscoveryFacade(_services, _resourceGraphBuilder, _options, LoggerFactory);

            facade.AddAssembly(typeof(Person).Assembly);

            // Act
            facade.DiscoverResources();

            // Assert
            IResourceGraph resourceGraph = _resourceGraphBuilder.Build();

            ResourceContext personContext = resourceGraph.GetResourceContext(typeof(Person));

            personContext.Should().NotBeNull();

            ResourceContext todoItemContext = resourceGraph.GetResourceContext(typeof(TodoItem));

            todoItemContext.Should().NotBeNull();
        }
Example #9
0
        public QueryParametersUnitTestCollection()
        {
            var builder = new ResourceGraphBuilder();

            builder.AddResource <Article>();
            builder.AddResource <Person>();
            builder.AddResource <Blog>();
            builder.AddResource <Food>();
            builder.AddResource <Song>();
            _resourceGraph          = builder.Build();
            _articleResourceContext = _resourceGraph.GetResourceContext <Article>();
        }
Example #10
0
        public QueryParametersUnitTestCollection()
        {
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.AddResource <Article>();
            builder.AddResource <Person>();
            builder.AddResource <Blog>();
            builder.AddResource <Food>();
            builder.AddResource <Song>();
            _resourceGraph          = builder.Build();
            _articleResourceContext = _resourceGraph.GetResourceContext <Article>();
        }
        public void AddDbContext_Does_Not_Throw_If_Context_Contains_Members_That_Do_Not_Implement_IIdentifiable()
        {
            // Arrange
            var resourceGraphBuilder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            // Act
            resourceGraphBuilder.AddResource(typeof(TestContext));
            var resourceGraph = (ResourceGraph)resourceGraphBuilder.Build();

            // Assert
            Assert.Empty(resourceGraph.GetResourceContexts());
        }
Example #12
0
        public void AddDbContext_Does_Not_Throw_If_Context_Contains_Members_That_DoNot_Implement_IIdentifiable()
        {
            // Arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            // Act
            resourceGraphBuilder.AddDbContext <TestContext>();
            var resourceGraph = resourceGraphBuilder.Build() as ResourceGraph;

            // Assert
            Assert.Empty(resourceGraph.GetResourceContexts());
        }
        public void Sets_The_DocumentMeta_Property_In_JsonApiContext()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <Independent>("independents");
            resourceGraphBuilder.AddResource <Dependent>("dependents");
            var resourceGraph = resourceGraphBuilder.Build();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary <AttrAttribute, object>());

            var jsonApiOptions = new JsonApiOptions();

            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);


            var deserializer = new JsonApiDeSerializer(jsonApiContextMock.Object);

            var property = Guid.NewGuid().ToString();

            var content = new Document
            {
                Meta = new Dictionary <string, object>()
                {
                    { "foo", "bar" }
                },
                Data = new ResourceObject {
                    Type       = "independents",
                    Id         = "1",
                    Attributes = new Dictionary <string, object> {
                        { "property", property }
                    },
                    // a common case for this is deserialization in unit tests
                    Relationships = new Dictionary <string, RelationshipData> {
                        { "dependent", new RelationshipData {
                          } }
                    }
                }
            };

            var contentString = JsonConvert.SerializeObject(content);

            // act
            var result = deserializer.Deserialize <Independent>(contentString);

            // assert
            jsonApiContextMock.VerifySet(mock => mock.DocumentMeta = content.Meta);
        }
Example #14
0
        public void Adding_DbContext_Members_That_DoNot_Implement_IIdentifiable_Creates_Warning()
        {
            // Arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            // Act
            resourceGraphBuilder.AddDbContext <TestContext>();
            var resourceGraph = resourceGraphBuilder.Build() as ResourceGraph;

            // Assert
            Assert.Single(resourceGraph.ValidationResults);
            Assert.Contains(resourceGraph.ValidationResults, v => v.LogLevel == LogLevel.Warning);
        }
        public void GetResourceContext_Yields_Right_Type_For_Identifiable()
        {
            // Arrange
            var resourceGraphBuilder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            resourceGraphBuilder.AddResource <Bar>();
            var resourceGraph = (ResourceGraph)resourceGraphBuilder.Build();

            // Act
            var result = resourceGraph.GetResourceContext(typeof(Bar));

            // Assert
            Assert.Equal(typeof(Bar), result.ResourceType);
        }
Example #16
0
        public void Resources_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Equal("testResources", resource.ResourceName);
        }
Example #17
0
        public void Resources_Without_Names_Specified_Will_Use_Default_Formatter()
        {
            // arrange
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // act
            var graph = builder.Build();

            // assert
            var resource = graph.GetContextEntity(typeof(TestResource));

            Assert.Equal("test-resources", resource.EntityName);
        }
Example #18
0
        public void Attrs_Without_Names_Specified_Will_Use_Default_Formatter()
        {
            // arrange
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // act
            var graph = builder.Build();

            // assert
            var resource = graph.GetContextEntity(typeof(TestResource));

            Assert.Equal("compound-attribute", resource.Attributes.Single().PublicAttributeName);
        }
Example #19
0
        public void Attrs_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Contains(resource.Attributes, (i) => i.PublicName == "compoundAttribute");
        }
        public void Resources_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new CamelCaseNameFormatter());

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Equal("testResources", resource.ResourceName);
        }
        public void Attrs_Without_Names_Specified_Will_Use_Default_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Contains(resource.Attributes, (i) => i.PublicAttributeName == "compoundAttribute");
        }
Example #22
0
        public void Resources_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // arrange
            JsonApiOptions.ResourceNameFormatter = new CamelCaseNameFormatter();
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // act
            var graph = builder.Build();

            // assert
            var resource = graph.GetContextEntity(typeof(TestResource));

            Assert.Equal("testResources", resource.EntityName);
        }
        public void GetResourceContext_Yields_Right_Type_For_LazyLoadingProxy()
        {
            // Arrange
            var resourceGraphBuilder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            resourceGraphBuilder.AddResource <Bar>();
            var resourceGraph  = (ResourceGraph)resourceGraphBuilder.Build();
            var proxyGenerator = new ProxyGenerator();

            // Act
            var proxy  = proxyGenerator.CreateClassProxy <Bar>();
            var result = resourceGraph.GetResourceContext(proxy.GetType());

            // Assert
            Assert.Equal(typeof(Bar), result.ResourceType);
        }
Example #24
0
        public void Relationships_Without_Names_Specified_Will_Use_Default_Formatter()
        {
            // arrange
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // act
            var graph = builder.Build();

            // assert
            var resource = graph.GetContextEntity(typeof(TestResource));

            Assert.Equal("related-resource", resource.Relationships.Single(r => r.IsHasOne).PublicRelationshipName);
            Assert.Equal("related-resources", resource.Relationships.Single(r => r.IsHasMany).PublicRelationshipName);
        }
Example #25
0
        public void Relationships_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance);

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Equal("relatedResource", resource.Relationships.Single(r => r is HasOneAttribute).PublicName);
            Assert.Equal("relatedResources", resource.Relationships.Single(r => !(r is HasOneAttribute)).PublicName);
        }
        public void Relationships_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // Arrange
            var builder = new ResourceGraphBuilder(new JsonApiOptions());

            builder.AddResource <TestResource>();

            // Act
            var resourceGraph = builder.Build();

            // Assert
            var resource = resourceGraph.GetResourceContext(typeof(TestResource));

            Assert.Equal("relatedResource", resource.Relationships.Single(r => r.IsHasOne).PublicRelationshipName);
            Assert.Equal("relatedResources", resource.Relationships.Single(r => r.IsHasMany).PublicRelationshipName);
        }
        public void Adding_DbContext_Members_That_Do_Not_Implement_IIdentifiable_Logs_Warning()
        {
            // Arrange
            var loggerFactory        = new FakeLoggerFactory();
            var resourceGraphBuilder = new ResourceGraphBuilder(new JsonApiOptions(), loggerFactory);

            resourceGraphBuilder.AddResource(typeof(TestContext));

            // Act
            resourceGraphBuilder.Build();

            // Assert
            Assert.Single(loggerFactory.Logger.Messages);
            Assert.Equal(LogLevel.Warning, loggerFactory.Logger.Messages[0].LogLevel);
            Assert.Equal("Entity 'UnitTests.Internal.ResourceGraphBuilder_Tests+TestContext' does not implement 'IIdentifiable'.", loggerFactory.Logger.Messages[0].Text);
        }
        public void Attrs_Without_Names_Specified_Will_Use_Configured_Formatter()
        {
            // arrange
            JsonApiOptions.ResourceNameFormatter = new CamelCaseNameFormatter();
            var builder = new ResourceGraphBuilder();

            builder.AddResource <TestResource>();

            // act
            var graph = builder.Build();

            // assert
            var resource = graph.GetContextEntity(typeof(TestResource));

            Assert.Contains(resource.Attributes, (i) => i.PublicAttributeName == "compoundAttribute");
        }
        protected IResponseDeserializer GetDeserializer()
        {
            var formatter         = GetService <IResourceNameFormatter>();
            var resourcesContexts = GetService <IResourceGraph>().GetResourceContexts();
            var builder           = new ResourceGraphBuilder(formatter);

            foreach (var rc in resourcesContexts)
            {
                if (rc.ResourceType == typeof(TodoItem) || rc.ResourceType == typeof(TodoItemCollection))
                {
                    continue;
                }
                builder.AddResource(rc.ResourceType, rc.IdentityType, rc.ResourceName);
            }
            builder.AddResource <TodoItemClient>(formatter.FormatResourceName(typeof(TodoItem)));
            builder.AddResource <TodoItemCollectionClient, Guid>(formatter.FormatResourceName(typeof(TodoItemCollection)));
            return(new ResponseDeserializer(builder.Build()));
        }
        public void Can_Deserialize_Complex_Types_With_Dasherized_Attrs()
        {
            // arrange
            var resourceGraphBuilder = new ResourceGraphBuilder();

            resourceGraphBuilder.AddResource <TestResource>("test-resource");
            var resourceGraph = resourceGraphBuilder.Build();

            var jsonApiContextMock = new Mock <IJsonApiContext>();

            jsonApiContextMock.SetupAllProperties();
            jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
            jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary <AttrAttribute, object>());

            var jsonApiOptions = new JsonApiOptions();

            jsonApiOptions.SerializerSettings.ContractResolver = new DasherizedResolver(); // <--
            jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions);

            var deserializer = new JsonApiDeSerializer(jsonApiContextMock.Object);

            var content = new Document
            {
                Data = new ResourceObject {
                    Type       = "test-resource",
                    Id         = "1",
                    Attributes = new Dictionary <string, object>
                    {
                        {
                            "complex-member", new Dictionary <string, string> {
                                { "compound-name", "testName" }
                            }
                        }
                    }
                }
            };

            // act
            var result = deserializer.Deserialize <TestResource>(JsonConvert.SerializeObject(content));

            // assert
            Assert.NotNull(result.ComplexMember);
            Assert.Equal("testName", result.ComplexMember.CompoundName);
        }