public async Task Creates_single_resource_document_for_registered_non_collection_types()
        {
            // Arrange
            var objectContent = new Fruit { Id = "984", Name = "Kiwi" };

            var mockDocument = new Mock<ISingleResourceDocument>(MockBehavior.Strict);

            var singleResourceDocumentBuilder = new Mock<ISingleResourceDocumentBuilder>(MockBehavior.Strict);
            singleResourceDocumentBuilder.Setup(b => b.BuildDocument(objectContent, It.IsAny<string>(), null, null)).Returns(mockDocument.Object);

            var mockQueryableDocumentBuilder = new Mock<IQueryableResourceCollectionDocumentBuilder>(MockBehavior.Strict);
            var mockResourceCollectionDocumentBuilder = new Mock<IResourceCollectionDocumentBuilder>(MockBehavior.Strict);

            var cancellationTokenSource = new CancellationTokenSource();

            var request = new HttpRequestMessage(HttpMethod.Get, "https://www.example.com/fruits");
            var mockBaseUrlService = new Mock<IBaseUrlService>(MockBehavior.Strict);
            mockBaseUrlService.Setup(s => s.GetBaseUrl(request)).Returns("https://www.example.com");

            // Act
            var fallbackDocumentBuilder = new FallbackDocumentBuilder(singleResourceDocumentBuilder.Object,
                mockQueryableDocumentBuilder.Object, mockResourceCollectionDocumentBuilder.Object, mockBaseUrlService.Object);
            var resultDocument = await fallbackDocumentBuilder.BuildDocument(objectContent, request, cancellationTokenSource.Token);

            // Assert
            resultDocument.Should().BeSameAs(mockDocument.Object);
        }
        public async Task Creates_resource_collection_document_for_queryables()
        {
            // Arrange
            var items = new[]
            {
                new Fruit {Id = "43", Name = "Strawberry"},
                new Fruit {Id = "43", Name = "Grape"}
            }.AsQueryable();

            var mockDocument = new Mock<IResourceCollectionDocument>(MockBehavior.Strict);

            var singleResourceDocumentBuilder = new Mock<ISingleResourceDocumentBuilder>(MockBehavior.Strict);

            var request = new HttpRequestMessage();

            var mockBaseUrlService = new Mock<IBaseUrlService>(MockBehavior.Strict);
            mockBaseUrlService.Setup(s => s.GetBaseUrl(request)).Returns("https://www.example.com/");
            
            var cancellationTokenSource = new CancellationTokenSource();

            var mockQueryableDocumentBuilder = new Mock<IQueryableResourceCollectionDocumentBuilder>(MockBehavior.Strict);
            mockQueryableDocumentBuilder
                .Setup(b => b.BuildDocument(items, request, cancellationTokenSource.Token, null))
                .Returns(Task.FromResult(mockDocument.Object));

            var mockResourceCollectionDocumentBuilder = new Mock<IResourceCollectionDocumentBuilder>(MockBehavior.Strict);

            // Act
            var fallbackDocumentBuilder = new FallbackDocumentBuilder(singleResourceDocumentBuilder.Object,
                mockQueryableDocumentBuilder.Object, mockResourceCollectionDocumentBuilder.Object, mockBaseUrlService.Object);
            var resultDocument = await fallbackDocumentBuilder.BuildDocument(items, request, cancellationTokenSource.Token);

            // Assert
            resultDocument.Should().BeSameAs(mockDocument.Object);
        }
        public async Task Creates_resource_collection_document_for_non_queryable_enumerables()
        {
            // Arrange
            var items = new[]
            {
                new Fruit {Id = "43", Name = "Strawberry"},
                new Fruit {Id = "43", Name = "Grape"}
            };

            var mockDocument = new Mock<IResourceCollectionDocument>(MockBehavior.Strict);

            var singleResourceDocumentBuilder = new Mock<ISingleResourceDocumentBuilder>(MockBehavior.Strict);

            var cancellationTokenSource = new CancellationTokenSource();

            var request = new HttpRequestMessage(HttpMethod.Get, "https://www.example.com/fruits");

            var mockBaseUrlService = new Mock<IBaseUrlService>(MockBehavior.Strict);
            mockBaseUrlService.Setup(s => s.GetBaseUrl(request)).Returns("https://www.example.com/");
            
            var mockQueryableDocumentBuilder = new Mock<IQueryableResourceCollectionDocumentBuilder>(MockBehavior.Strict);
            var mockResourceCollectionDocumentBuilder = new Mock<IResourceCollectionDocumentBuilder>(MockBehavior.Strict);
            mockResourceCollectionDocumentBuilder
                .Setup(b => b.BuildDocument(items, "https://www.example.com/", It.IsAny<string[]>(), It.IsAny<IMetadata>(), null))
                .Returns(() => (mockDocument.Object));

            var mockSortExpressionExtractor = new Mock<ISortExpressionExtractor>(MockBehavior.Strict);
            mockSortExpressionExtractor.Setup(e => e.ExtractSortExpressions(request)).Returns(new[] { "id " });

            // Act
            var fallbackDocumentBuilder = new FallbackDocumentBuilder(singleResourceDocumentBuilder.Object,
                mockQueryableDocumentBuilder.Object, mockResourceCollectionDocumentBuilder.Object, mockSortExpressionExtractor.Object, mockBaseUrlService.Object);
            var resultDocument = await fallbackDocumentBuilder.BuildDocument(items, request, cancellationTokenSource.Token);

            // Assert
            resultDocument.Should().BeSameAs(mockDocument.Object);
        }