public HalClientTestContext()
        {
            _fixture = new Fixture().Customize(new AutoRhinoMockCustomization());

            _http = _fixture.Freeze <IJsonHttpClient>();

            _version   = _fixture.Create <Version>();
            _order     = _fixture.Build <Order>().With(x => x.DeliveryDate, null).Create();
            _orderItem = _fixture.Create <OrderItem>();
            _paged     = _fixture.Create <PagedList>();
            OrderAdd   = _fixture.Create <OrderAdd>();
            OrderEdit  = _fixture.Create <OrderEdit>();
            _resourceWithJsonAttribute = _fixture.Create <ResourceWithJsonAttribute>();

            _sut = new HalClient(_http);

            _curies =
                new[]
            {
                new
                {
                    href      = "https://retail.com/v1/docs/{rel}",
                    name      = Curie,
                    templated = true
                }
            };
            _hasCurie = true;
        }
        public static async Task <IHalClient> GetAsync(
            this IHalClient client,
            IResource resource,
            string rel,
            object parameters,
            string curie)
        {
            var relationship = HalClientExtensions.Relationship(rel, curie);

            if (resource.Embedded.Any(e => e.Rel == relationship))
            {
                var current = resource.Embedded.Where(e => e.Rel == relationship);

                return(new HalClient(client, current));
            }

            var link = resource.Links.FirstOrDefault(l => l.Rel == relationship);

            if (link == null)
            {
                throw new FailedToResolveRelationship(relationship);
            }

            return(await client.ExecuteAsync(
                       HalClientExtensions.Construct(resource.BaseAddress, link, parameters),
                       uri => client.Client.GetAsync(uri)));
        }
Example #3
0
        /// <summary>
        /// Gets the <typeparamref name="T"/> resources that have changed since
        /// your application's last request.
        /// </summary>
        /// <param name="nextLink">The <see cref="Link"/> that was stored from
        /// your last request.</param>
        public static Task <ChangedResources <T> > GetChangedResourcesAsync <T>(
            this IHalClient client,
            Link nextLink,
            IDictionary <string, string> parameters,
            IDictionary <string, IEnumerable <string> > headers,
            CancellationToken cancellationToken) where T : Resource
        {
            var parametersWithResourceVersionSort
                = new Dictionary <string, string>(parameters ?? new Dictionary <string, string>());

            if (parametersWithResourceVersionSort.ContainsKey("sort"))
            {
                parametersWithResourceVersionSort["sort"] = "resource_version";
            }
            else
            {
                parametersWithResourceVersionSort.Add("sort", "resource_version");
            }

            return(client.GetChangedResourcesInternalAsync <T>(
                       nextLink,
                       parametersWithResourceVersionSort,
                       headers,
                       cancellationToken));
        }
        private static ReadAllPage ReadAllBackwardsInternal(IHalClient client, bool prefetch)
        {
            var resource = client.Current.First();

            var pageInfo = resource.Data <HalReadAllPage>();

            var streamMessages = Convert(
                resource.Embedded
                .Where(r => r.Rel == Constants.Relations.Message)
                .ToArray(),
                client,
                prefetch);

            var readAllPage = new ReadAllPage(
                pageInfo.FromPosition,
                pageInfo.NextPosition,
                pageInfo.IsEnd,
                ReadDirection.Backward,
                async(position, cancellationToken) => ReadAllBackwardsInternal(
                    await client.GetAsync(resource, Constants.Relations.Previous, cancellationToken),
                    prefetch),
                streamMessages);

            return(readAllPage);
        }
        public HalClientTestContext()
        {
            _fixture = new Fixture().Customize(new AutoRhinoMockCustomization());

            _http = _fixture.Freeze<IJsonHttpClient>();

            _version = _fixture.Create<Version>();
            _order = _fixture.Create<Order>();
            _orderItem = _fixture.Create<OrderItem>();
            _paged = _fixture.Create<PagedList>();
            OrderAdd = _fixture.Create<OrderAdd>();
            OrderEdit = _fixture.Create<OrderEdit>();

            _sut = new HalClient(_http);

            _curies =
                new[]
                {
                    new
                    {
                        href = "https://retail.com/v1/docs/{rel}",
                        name = Curie,
                        templated = true
                    }
                };
            _hasCurie = true;
        }
Example #6
0
 private static void CheckThatApiRootIsAvailable(IHalClient halRoot, string desiredMethod)
 {
     if (!halRoot.Has(desiredMethod))
     {
         throw new Exception(
                   $"Could not access the root of the API, either Authentication failed or the URL \"{Constants.GlobalXHost}{Constants.DocumentsRoute}\" could not be reached.");
     }
 }
Example #7
0
        public SellerListingsClient(IHalClient halClient, ILinkFactory linkFactory)
        {
            Requires.ArgumentNotNull(halClient, nameof(halClient));
            Requires.ArgumentNotNull(linkFactory, nameof(linkFactory));

            _halClient   = halClient;
            _linkFactory = linkFactory;
        }
Example #8
0
 public PaymentMethodsClient(IUserClient userClient,
                             IHalClient halClient,
                             ILinkFactory linkFactory)
 {
     _userClient  = userClient;
     _halClient   = halClient;
     _linkFactory = linkFactory;
 }
Example #9
0
 public PurchasesClient(IUserClient userClient,
                        IHalClient halClient,
                        ILinkFactory linkFactory)
 {
     _userClient  = userClient;
     _halClient   = halClient;
     _linkFactory = linkFactory;
 }
        public static bool Has(this IHalClient client, string rel, string curie)
        {
            var relationship = HalClientExtensions.Relationship(rel, curie);

            return
                (client.Current.Any(r => r.Embedded.Any(e => e.Rel == relationship)) ||
                 client.Current.Any(r => r.Links.Any(l => l.Rel == relationship)));
        }
Example #11
0
 public WebhooksClient(
     IHalClient halClient,
     ILinkFactory linkFactory)
 {
     _halClient    = halClient;
     _linkFactory  = linkFactory;
     _linkResolver = new LinkResolver();
 }
Example #12
0
        private static async Task <ChangedResources <T> > GetChangedResourcesInternalAsync <T>(
            this IHalClient client,
            Link link,
            IDictionary <string, string> parameters,
            IDictionary <string, IEnumerable <string> > headers,
            CancellationToken cancellationToken) where T : Resource
        {
            Requires.ArgumentNotNull(client, nameof(client));
            Requires.ArgumentNotNull(link, nameof(link));

            var currentLink       = link;
            var currentParameters = new Dictionary <string, string>(parameters ?? new Dictionary <string, string>());
            // Increase page-size to reduce the number of round-trips
            var maxPageSize = "10000";

            if (currentParameters.ContainsKey("page_size"))
            {
                currentParameters["page_size"] = maxPageSize;
            }
            else
            {
                currentParameters.Add("page_size", maxPageSize);
            }

            var items        = new List <T>();
            var deletedItems = new List <T>();

            while (true)
            {
                cancellationToken.ThrowIfCancellationRequested();

                var currentPage = await client.GetAsync <PagedResource <T> >(
                    currentLink,
                    currentParameters,
                    headers,
                    cancellationToken).ConfigureAwait(client.Configuration);

                items.AddRange(currentPage.Items);
                if (currentPage.DeletedItems != null)
                {
                    deletedItems.AddRange(currentPage.DeletedItems);
                }

                if (currentPage.NextLink == null)
                {
                    // This is the last page
                    break;
                }

                // Stop passing parameters on subsequent calls since the "next" links
                // will already be assembled with all the parameters needed
                currentParameters = null;
                currentLink       = currentPage.NextLink;
            }

            return(new ChangedResources <T>(items, deletedItems, currentLink));
        }
Example #13
0
 public static Task <IReadOnlyList <T> > GetAllPagesAsync <T>(
     this IHalClient client,
     Link link,
     IRequestParameters request) where T : Resource
 {
     return(GetAllPagesAsync <T>(
                client,
                link,
                request,
                CancellationToken.None));
 }
Example #14
0
 /// <summary>
 /// Gets the <typeparamref name="T"/> resources that have changed since
 /// your application's last request.
 /// </summary>
 /// <param name="nextLink">The <see cref="Link"/> that was stored from
 /// your last request.</param>
 public static Task <ChangedResources <T> > GetChangedResourcesAsync <T>(
     this IHalClient client,
     Link nextLink,
     IRequestParameters request,
     CancellationToken cancellationToken) where T : Resource
 {
     return(client.GetChangedResourcesAsync <T>(
                nextLink,
                request?.Parameters,
                request?.Headers,
                cancellationToken));
 }
Example #15
0
 public static Task <IReadOnlyList <T> > GetAllPagesAsync <T>(
     this IHalClient client,
     Link link,
     IDictionary <string, string> parameters,
     IDictionary <string, IEnumerable <string> > headers) where T : Resource
 {
     return(GetAllPagesAsync <T>(
                client,
                link,
                parameters,
                headers,
                CancellationToken.None));
 }
Example #16
0
        private static StreamMessage[] Convert(IResource[] streamMessages, IHalClient client, bool prefetch = false)
        => Array.ConvertAll(
            streamMessages,
            streamMessage =>
        {
            var httpStreamMessage = streamMessage.Data <HttpStreamMessage>();

            return(httpStreamMessage.ToStreamMessage(
                       ct =>
                       prefetch
                                ? Task.FromResult(httpStreamMessage.Payload.ToString())
                                : Task.Run(() => GetPayload(client, streamMessage, ct), ct)));
        });
        public static Task <IHalClient> Delete(
            this IHalClient client,
            string rel,
            object parameters,
            string curie,
            IDictionary <string, string[]> headers = null,
            CancellationToken cancellationToken    = default)
        {
            var relationship = HalClientExtensions.Relationship(rel, curie);

            return(client.BuildAndExecuteAsync(
                       relationship,
                       parameters,
                       uri => client.Client.DeleteAsync(uri, headers, cancellationToken)));
        }
Example #18
0
        public static async Task <IReadOnlyList <T> > GetAllPagesAsync <T>(
            this IHalClient client,
            Link link,
            IDictionary <string, string> parameters,
            IDictionary <string, IEnumerable <string> > headers,
            CancellationToken cancellationToken) where T : Resource
        {
            var changedResources = await client.GetChangedResourcesInternalAsync <T>(
                link,
                parameters,
                headers,
                cancellationToken).ConfigureAwait(client);

            return(changedResources.NewOrUpdatedResources);
        }
Example #19
0
        private static ReadStreamPage ReadStreamBackwardsInternal(
            IHalClient client,
            StreamId streamId,
            int fromVersionInclusive,
            bool prefetchJsonData)
        {
            var resource = client.Current.First();

            if (client.StatusCode == HttpStatusCode.NotFound)
            {
                return(new ReadStreamPage(
                           streamId,
                           PageReadStatus.StreamNotFound,
                           fromVersionInclusive,
                           -1,
                           -1,
                           -1,
                           ReadDirection.Backward,
                           true));
            }

            var pageInfo = resource.Data <HalReadPage>();

            var streamMessages = Convert(
                resource.Embedded
                .Where(r => r.Rel == Constants.Relations.Message)
                .ToArray(),
                client,
                prefetchJsonData);

            var readStreamPage = new ReadStreamPage(
                streamId,
                PageReadStatus.Success,
                pageInfo.FromStreamVersion,
                pageInfo.NextStreamVersion,
                pageInfo.LastStreamVersion,
                pageInfo.LastStreamPosition,
                ReadDirection.Backward,
                pageInfo.IsEnd,
                async(nextVersion, token) => ReadStreamBackwardsInternal(
                    await client.GetAsync(resource, Constants.Relations.Previous),
                    streamId,
                    pageInfo.LastStreamVersion,
                    prefetchJsonData),
                streamMessages);

            return(readStreamPage);
        }
        public static Task <IHalClient> BuildAndExecuteAsync(
            this IHalClient client,
            string relationship,
            object parameters,
            Func <string, Task <HttpResponseMessage> > command)
        {
            var resource = client.Current.FirstOrDefault(r => r.Links.Any(l => l.Rel == relationship));

            if (resource == null)
            {
                throw new FailedToResolveRelationship(relationship);
            }

            var link = resource.Links.FirstOrDefault(l => l.Rel == relationship);

            return(ExecuteAsync(client, Construct(resource.BaseAddress, link, parameters), command));
        }
Example #21
0
        private static void ThrowOnError(IHalClient client)
        {
            switch (client.StatusCode ?? default)
            {
            case default(HttpStatusCode):
                return;

            case HttpStatusCode.Conflict:
                var resource = client.Current.First();
                throw new WrongExpectedVersionException(resource.Data <HttpError>().Detail);

            case var status when status >= HttpStatusCode.BadRequest:
                throw new HttpRequestException($"Response status code does not indicate success: {status}");

            default:
                return;
            }
        }
        public static async Task <IHalClient> ExecuteAsync(
            this IHalClient client,
            string uri,
            Func <string, Task <HttpResponseMessage> > command)
        {
            var result = await command(uri);

            var current =
                new[]
            {
                (result.Content.Headers.ContentLength == 0
                        ? new Resource()
                        : await result.Content.ReadResource())
                .WithBaseAddress(new Uri(client.Client.BaseAddress, uri))
            };

            return(new HalClient(client, current, result.StatusCode));
        }
Example #23
0
 private static async Task <string> GetPayload(
     IHalClient client,
     IResource streamMessage,
     CancellationToken cancellationToken)
 => (await client.GetAsync(streamMessage, Constants.Relations.Self, cancellationToken))
 .Current.FirstOrDefault()?.Data <HttpStreamMessage>()?.Payload?.ToString();
 public void Act(Func<IHalClient, IHalClient> act)
 {
     _result = act(_sut);
 }
Example #25
0
 public static Task <Root> GetRootAsync(this IHalClient client)
 {
     return(client.GetRootAsync(new RootRequest()));
 }
Example #26
0
        private static ReadStreamPage ReadStreamForwardsInternal(
            IHalClient client,
            StreamId streamId,
            int fromVersionInclusive,
            bool prefetchJsonData)
        {
            var resource = client.Current.First();

            if (client.StatusCode == HttpStatusCode.NotFound)
            {
                return(new ReadStreamPage(
                           streamId,
                           PageReadStatus.StreamNotFound,
                           fromVersionInclusive,
                           -1,
                           -1,
                           -1,
                           ReadDirection.Forward,
                           true));
            }

            var pageInfo = resource.Data <HalReadPage>();

            var streamMessages = Convert(
                resource.Embedded
                .Where(r => r.Rel == Constants.Relations.Message)
                .Reverse()
                .ToArray(),
                client,
                prefetchJsonData);

            var readStreamPage = new ReadStreamPage(
                streamId,
                PageReadStatus.Success,
                pageInfo.FromStreamVersion,
                pageInfo.NextStreamVersion,
                pageInfo.LastStreamVersion,
                pageInfo.LastStreamPosition,
                ReadDirection.Forward,
                pageInfo.IsEnd,
                ReadNextStreamPage,
                streamMessages);

            return(readStreamPage);

            async Task <ReadStreamPage> ReadNextStreamPage(int nextVersion, CancellationToken ct)
            => resource.Links.Any(link => link.Rel == Constants.Relations.Next)
                    ? ReadStreamForwardsInternal(
                await client.GetAsync(resource, Constants.Relations.Next),
                streamId,
                pageInfo.LastStreamVersion,
                prefetchJsonData)
                    : new ReadStreamPage(
                streamId,
                PageReadStatus.Success,
                pageInfo.LastStreamVersion,
                nextVersion,
                pageInfo.LastStreamVersion,
                pageInfo.LastStreamPosition,
                ReadDirection.Forward,
                true,
                ReadNextStreamPage);
        }
Example #27
0
 public CategoriesClient(IHalClient halClient, ILinkFactory linkFactory)
 {
     _halClient   = halClient;
     _linkFactory = linkFactory;
 }
Example #28
0
 public VenuesClient(IHalClient halClient)
 {
     _halClient = halClient;
 }
 public SourceController(
     IHalClient client)
 {
     _client = client;
 }
Example #30
0
 public static Task <Root> GetRootAsync(this IHalClient client, RootRequest request)
 {
     return(client.GetRootAsync <Root>(request));
 }
Example #31
0
 public static Task <IReadOnlyList <T> > GetAllPagesAsync <T>(
     this IHalClient client,
     Link link) where T : Resource
 {
     return(GetAllPagesAsync <T>(client, link, null, null));
 }
Example #32
0
 public CurrenciesClient(IHalClient halClient,
                         ILinkFactory linkFactory)
 {
     _halClient   = halClient;
     _linkFactory = linkFactory;
 }