public async Task HandleRateLimitTest()
        {
            // Test no delay.
            await MtgApiController.HandleRateLimit();

            // Test with delay.
            var privateController = new PrivateType(typeof(MtgApiController));

            privateController.SetStaticFieldOrProperty("RatelimitLimit", 2000);

            var limit        = new RateLimit();
            var privateLimit = new PrivateObject(limit);

            privateLimit.SetFieldOrProperty("_webServiceCalls", new List <DateTime>()
            {
                DateTime.Now.AddSeconds(-1),
                DateTime.Now.AddSeconds(-2),
                DateTime.Now.AddSeconds(-3),
                DateTime.Now.AddSeconds(-4),
                DateTime.Now.AddSeconds(-5),
                DateTime.Now.AddSeconds(-8),
            });

            privateController.SetStaticFieldOrProperty("_apiRateLimit", limit);

            await MtgApiController.HandleRateLimit();
        }
        public void ParseHeadersTest()
        {
            try
            {
                // Test exception is thrown.
                MtgApiController.ParseHeaders(null);
                Assert.Fail();
            }
            catch (ArgumentNullException ex)
            {
                Assert.AreEqual("headers", ex.ParamName);
            }
            catch
            {
                Assert.Fail();
            }

            HttpClient          client   = new HttpClient();
            HttpResponseMessage response = new HttpResponseMessage();

            // No headers.
            MtgApiController.ParseHeaders(response.Headers);
            Assert.IsNull(MtgApiController.Link);
            Assert.AreEqual(0, MtgApiController.PageSize);
            Assert.AreEqual(0, MtgApiController.Count);
            Assert.AreEqual(0, MtgApiController.TotalCount);
            Assert.AreEqual(0, MtgApiController.RatelimitLimit);
            Assert.AreEqual(0, MtgApiController.RatelimitRemaining);

            response.Headers.Add("Link", "fakelink");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.AreEqual("fakelink", MtgApiController.Link);

            response.Headers.Add("Page-Size", "2000");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.AreEqual(2000, MtgApiController.PageSize);

            response.Headers.Add("Count", "1000");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.AreEqual(1000, MtgApiController.Count);

            response.Headers.Add("Total-Count", "3000");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.AreEqual(3000, MtgApiController.TotalCount);

            response.Headers.Add("Ratelimit-Limit", "500");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.AreEqual(500, MtgApiController.RatelimitLimit);

            response.Headers.Add("Ratelimit-Remaining", "250");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.AreEqual(250, MtgApiController.RatelimitRemaining);

            var privateController = new PrivateType(typeof(MtgApiController));

            privateController.SetStaticFieldOrProperty("RatelimitLimit", 2000);
        }
        public void ParseHeadersTest()
        {
            try
            {
                // Test exception is thrown.
                MtgApiController.ParseHeaders(null);
                Assert.True(false);
            }
            catch (ArgumentNullException ex)
            {
                Assert.Equal("headers", ex.ParamName);
            }
            catch
            {
                Assert.True(false);
            }

            HttpClient          client   = new HttpClient();
            HttpResponseMessage response = new HttpResponseMessage();

            // No headers.
            MtgApiController.ParseHeaders(response.Headers);
            Assert.Null(MtgApiController.Link);
            Assert.Equal(0, MtgApiController.PageSize);
            Assert.Equal(0, MtgApiController.Count);
            Assert.Equal(0, MtgApiController.TotalCount);
            Assert.Equal(0, MtgApiController.RatelimitLimit);
            Assert.Equal(0, MtgApiController.RatelimitRemaining);

            response.Headers.Add("Link", "fakelink");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.Equal("fakelink", MtgApiController.Link);

            response.Headers.Add("Page-Size", "2000");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.Equal(2000, MtgApiController.PageSize);

            response.Headers.Add("Count", "1000");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.Equal(1000, MtgApiController.Count);

            response.Headers.Add("Total-Count", "3000");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.Equal(3000, MtgApiController.TotalCount);

            response.Headers.Add("Ratelimit-Limit", "500");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.Equal(500, MtgApiController.RatelimitLimit);

            response.Headers.Add("Ratelimit-Remaining", "250");
            MtgApiController.ParseHeaders(response.Headers);
            Assert.Equal(250, MtgApiController.RatelimitRemaining);
        }
示例#4
0
        /// <summary>
        /// Makes a GET call to the web service.
        /// </summary>
        /// <typeparam name="T">The type of object to serialize the response into.</typeparam>
        /// <param name="requestUri">The URL to call.</param>
        /// <returns>The response of the GET serialized into the specified object.</returns>
        protected async Task <T> CallWebServiceGet <T>(Uri requestUri)
            where T : Dto.MtgResponseBase
        {
            if (requestUri == null)
            {
                throw new ArgumentNullException("requestUri");
            }

            // Makes sure that th rate limit is not reached.
            await MtgApiController.HandleRateLimit();

            return(await this._adapter.WebGetAsync <T>(requestUri).ConfigureAwait(false));
        }
示例#5
0
        /// <summary>
        /// Gets all the <see cref="TModel"/> defined by the query parameters.
        /// </summary>
        /// <returns>A <see cref="Exceptional{List{Set}}"/> representing the result containing all the items.</returns>
        public override Exceptional <List <Set> > All()
        {
            try
            {
                var query       = BuildUri(_whereQueries);
                var rootSetList = CallWebServiceGet <RootSetListDto>(query).Result;

                return(Exceptional <List <Set> > .Success(MapSetsList(rootSetList), MtgApiController.CreatePagingInfo()));
            }
            catch (AggregateException ex)
            {
                return(Exceptional <List <Set> > .Failure(ex.Flatten().InnerException));
            }
        }
示例#6
0
        /// <summary>
        /// Find a specific set by its set code.
        /// </summary>
        /// <param name="code">The set code to query for.</param>
        /// <returns>A <see cref="Exceptional{Set}"/> representing the result containing a <see cref="Set"/> or an exception.</returns>
        public Exceptional <Set> Find(string code)
        {
            try
            {
                var rootSet = CallWebServiceGet <RootSetDto>(BuildUri(code)).Result;
                var model   = new Set(rootSet.Set);

                return(Exceptional <Set> .Success(model, MtgApiController.CreatePagingInfo()));
            }
            catch (AggregateException ex)
            {
                return(Exceptional <Set> .Failure(ex.Flatten().InnerException));
            }
        }
示例#7
0
        /// <summary>
        /// Gets all the <see cref="TModel"/> defined by the query parameters.
        /// </summary>
        /// <returns>A <see cref="Exceptional{List{Set}}"/> representing the result containing all the items.</returns>
        public async override Task <Exceptional <List <Set> > > AllAsync()
        {
            try
            {
                var query       = BuildUri(_whereQueries);
                var rootSetList = await CallWebServiceGet <RootSetListDto>(query).ConfigureAwait(false);

                return(Exceptional <List <Set> > .Success(MapSetsList(rootSetList), MtgApiController.CreatePagingInfo()));
            }
            catch (Exception ex)
            {
                return(Exceptional <List <Set> > .Failure(ex));
            }
        }
示例#8
0
        /// <summary>
        /// Gets a list of all the card types.
        /// </summary>
        /// <returns>A list of all the card types.</returns>
        public async Task <Exceptional <List <string> > > GetCardTypesAsync()
        {
            try
            {
                var url          = new Uri(new Uri(BaseMtgUrl), string.Concat(Version.GetDescription(), "/", ApiEndPoint.CardTypes.GetDescription()));
                var rootTypeList = await CallWebServiceGet <RootCardTypeDto>(url).ConfigureAwait(false);

                return(Exceptional <List <string> > .Success(rootTypeList.Types, MtgApiController.CreatePagingInfo()));
            }
            catch (Exception ex)
            {
                return(Exceptional <List <string> > .Failure(ex));
            }
        }
示例#9
0
        /// <summary>
        /// Gets a list of all the card types.
        /// </summary>
        /// <returns>A list of all the card types.</returns>
        public Exceptional <List <string> > GetCardTypes()
        {
            try
            {
                var url          = new Uri(new Uri(BaseMtgUrl), string.Concat(Version.GetDescription(), "/", ApiEndPoint.CardTypes.GetDescription()));
                var rootTypeList = CallWebServiceGet <RootCardTypeDto>(url).Result;

                return(Exceptional <List <string> > .Success(rootTypeList.Types, MtgApiController.CreatePagingInfo()));
            }
            catch (AggregateException ex)
            {
                return(Exceptional <List <string> > .Failure(ex.Flatten().InnerException));
            }
        }
示例#10
0
        /// <summary>
        /// Find a specific card by its multi verse identifier.
        /// </summary>
        /// <param name="id">The identifier to query for.</param>
        /// <returns>A <see cref="Exceptional{Card}"/> representing the result containing a <see cref="Card"/> or an exception.</returns>
        public Exceptional <Card> Find(string id)
        {
            try
            {
                var rootCard = CallWebServiceGet <RootCardDto>(BuildUri(id)).Result;
                var model    = new Card(rootCard.Card);

                return(Exceptional <Card> .Success(model, MtgApiController.CreatePagingInfo()));
            }
            catch (AggregateException ex)
            {
                return(Exceptional <Card> .Failure(ex.Flatten().InnerException));
            }
        }
示例#11
0
        /// <summary>
        /// Find a specific card by its set code.
        /// </summary>
        /// <param name="code">The set code to query for.</param>
        /// <returns>A <see cref="Exceptional{Set}"/> representing the result containing a <see cref="Set"/> or an exception.</returns>
        public async Task <Exceptional <Set> > FindAsync(string code)
        {
            try
            {
                var rootSet = await CallWebServiceGet <RootSetDto>(BuildUri(code)).ConfigureAwait(false);

                var model = new Set(rootSet.Set);

                return(Exceptional <Set> .Success(model, MtgApiController.CreatePagingInfo()));
            }
            catch (Exception ex)
            {
                return(Exceptional <Set> .Failure(ex));
            }
        }
示例#12
0
        /// <summary>
        /// Find a specific card by its multi verse identifier.
        /// </summary>
        /// <param name="id">The identifier to query for.</param>
        /// <returns>A <see cref="Exceptional{Card}"/> representing the result containing a <see cref="Card"/> or an exception.</returns>
        public async Task <Exceptional <Card> > FindAsync(string id)
        {
            try
            {
                var rootCard = await CallWebServiceGet <RootCardDto>(BuildUri(id)).ConfigureAwait(false);

                var model = new Card(rootCard.Card);

                return(Exceptional <Card> .Success(model, MtgApiController.CreatePagingInfo()));
            }
            catch (Exception ex)
            {
                return(Exceptional <Card> .Failure(ex));
            }
        }
示例#13
0
        /// <summary>
        /// Do a Web Get for the given request Uri .
        /// </summary>
        /// <typeparam name="T">The type to serialize into.</typeparam>
        /// <param name="requestUri">The URL to call.</param>
        /// <returns>The serialized response.</returns>
        public async Task <T> WebGetAsync <T>(Uri requestUri)
            where T : MtgResponseBase
        {
            if (requestUri == null)
            {
                throw new ArgumentNullException("requestUri");
            }

            using (var client = new HttpClient())
            {
                using (var response = await client.GetAsync(requestUri).ConfigureAwait(false))
                {
                    if (response.IsSuccessStatusCode)
                    {
                        MtgApiController.ParseHeaders(response.Headers);
                        return(JsonConvert.DeserializeObject <T>(await response.Content.ReadAsStringAsync().ConfigureAwait(false)));
                    }
                    else
                    {
                        switch ((int)response.StatusCode)
                        {
                        case (int)MtgApiError.BadRequest:
                            throw new MtgApiException <BadRequestException>(MtgApiError.BadRequest.GetDescription());

                        case (int)MtgApiError.Forbidden:
                            throw new MtgApiException <ForbiddenException>(MtgApiError.Forbidden.GetDescription());

                        case (int)MtgApiError.InternalServerError:
                            throw new MtgApiException <InternalServerErrorException>(MtgApiError.InternalServerError.GetDescription());

                        case (int)MtgApiError.NotFound:
                            throw new MtgApiException <NotFoundException>(MtgApiError.NotFound.GetDescription());

                        case (int)MtgApiError.ServiceUnavailable:
                            throw new MtgApiException <ServiceUnavailableException>(MtgApiError.ServiceUnavailable.GetDescription());

                        default:
                            response.EnsureSuccessStatusCode();
                            return(null);
                        }
                    }
                }
            }
        }
示例#14
0
        /// <summary>
        ///  Generates a booster pack for a specific set asynchronously.
        /// </summary>
        /// <param name="code">The set code to generate a booster for.</param>
        /// <returns>A <see cref="Exceptional{List{Card}}"/> representing the result containing a <see cref="List{Card}"/> or an exception.</returns>
        public async Task <Exceptional <List <Card> > > GenerateBoosterAsync(string code)
        {
            try
            {
                var url          = new Uri(Path.Combine(BuildUri(code).AbsoluteUri, "booster"));
                var rootCardList = await CallWebServiceGet <RootCardListDto>(url).ConfigureAwait(false);

                return(Exceptional <List <Card> > .Success(CardService.MapCardsList(rootCardList), MtgApiController.CreatePagingInfo()));
            }
            catch (Exception ex)
            {
                return(Exceptional <List <Card> > .Failure(ex));
            }
        }
示例#15
0
        /// <summary>
        ///  Generates a booster pack for a specific set.
        /// </summary>
        /// <param name="code">The set code to generate a booster for.</param>
        /// <returns>A <see cref="Exceptional{List{Card}}"/> representing the result containing a <see cref="List{Card}"/> or an exception.</returns>
        public Exceptional <List <Card> > GenerateBooster(string code)
        {
            try
            {
                var url          = new Uri(Path.Combine(BuildUri(code).AbsoluteUri, "booster"), UriKind.Absolute);
                var rootCardList = CallWebServiceGet <RootCardListDto>(url).Result;

                return(Exceptional <List <Card> > .Success(CardService.MapCardsList(rootCardList), MtgApiController.CreatePagingInfo()));
            }
            catch (AggregateException ex)
            {
                return(Exceptional <List <Card> > .Failure(ex.Flatten().InnerException));
            }
        }