public async void UpdateLimits_given_headers_with_reset_limits_updates_limits()
        {
            var limitSourceMock = new Mock <ISource <ImgurRatelimitResponse> >();

            var limitResponse = new ImgurRatelimitResponse {
                ClientLimit = 12500, ClientRemaining = 1000, UserLimit = 500, UserRemaining = 50, StatusCode = HttpStatusCode.OK
            };

            limitSourceMock.Setup(m => m.GetContent(It.IsAny <string>())).ReturnsAsync(limitResponse);

            var source = new ImgurRatelimiter(limitSourceMock.Object);
            await source.LoadLimits();

            var headers = new List <KeyValuePair <string, IEnumerable <string> > >
            {
                new KeyValuePair <string, IEnumerable <string> >("X-RateLimit-ClientRemaining", Enumerable.Repeat("12490", 1)),
                new KeyValuePair <string, IEnumerable <string> >("X-RateLimit-UserLimit", Enumerable.Repeat("498", 1))
            };

            source.UpdateLimit(headers);
            var vals = source.GetLimiterValues();

            Assert.Equal(limitResponse.ClientLimit, vals.Item1);
            Assert.Equal(limitResponse.UserLimit, vals.Item2);
            Assert.Equal(12490, vals.Item3);
            Assert.Equal(498, vals.Item4);
        }
        public async void IsRequestAllowed_when_limists_are_hit_returns_false()
        {
            var limitSourceMock = new Mock <ISource <ImgurRatelimitResponse> >();

            var limitResponse = new ImgurRatelimitResponse {
                ClientLimit = 12500, ClientRemaining = 0, UserLimit = 500, UserRemaining = 0, StatusCode = HttpStatusCode.OK
            };

            limitSourceMock.Setup(m => m.GetContent(It.IsAny <string>())).ReturnsAsync(limitResponse);

            var source = new ImgurRatelimiter(limitSourceMock.Object);
            await source.LoadLimits();

            Assert.False(source.IsRequestAllowed());
        }
        public async void LoadLimits_given_successful_ratelimitresponse_sets_values()
        {
            var limitSourceMock = new Mock <ISource <ImgurRatelimitResponse> >();

            var limitResponse = new ImgurRatelimitResponse {
                ClientLimit = 10, ClientRemaining = 20, UserLimit = 30, UserRemaining = 40, StatusCode = HttpStatusCode.OK
            };

            limitSourceMock.Setup(m => m.GetContent(It.IsAny <string>())).ReturnsAsync(limitResponse);

            var source = new ImgurRatelimiter(limitSourceMock.Object);
            await source.LoadLimits();

            var vals = source.GetLimiterValues();

            Assert.Equal(limitResponse.ClientLimit, vals.Item1);
            Assert.Equal(limitResponse.UserLimit, vals.Item2);
            Assert.Equal(limitResponse.ClientRemaining, vals.Item3);
            Assert.Equal(limitResponse.UserRemaining, vals.Item4);
            limitSourceMock.Verify(i => i.GetContent(It.IsAny <string>()), Times.Once);
        }
        public async void LoadLimits_when_connection_forbidden_sets_expected_values()
        {
            var limitSourceMock = new Mock <ISource <ImgurRatelimitResponse> >();

            var limitResponse = new ImgurRatelimitResponse {
                StatusCode = HttpStatusCode.Forbidden
            };

            limitSourceMock.Setup(m => m.GetContent(It.IsAny <string>())).ReturnsAsync(limitResponse);

            var source = new ImgurRatelimiter(limitSourceMock.Object);

            await Assert.ThrowsAsync <InvalidClientIDException>(source.LoadLimits);

            var vals = source.GetLimiterValues();

            Assert.Equal(-1, vals.Item1);
            Assert.Equal(-1, vals.Item2);
            Assert.Equal(-1, vals.Item3);
            Assert.Equal(-1, vals.Item4);
            limitSourceMock.Verify(i => i.GetContent(It.IsAny <string>()), Times.Once);
        }
 /// <summary>
 /// Initializes a new instance of an ImgurImageSource
 /// </summary>
 /// <param name="client">A HttpClient containing the Client-ID authentication header </param>
 /// <param name="ratelimiter">The ratelimiter whose limits should be respected</param>
 public ImgurImageSource(HttpClient client, ImgurRatelimiter ratelimiter)
 {
     _client      = client;
     _ratelimiter = ratelimiter;
 }
Esempio n. 6
0
 public Ratelimiter(ImgurRatelimiter imgurLimiter)
 {
     _imgurLimiter = imgurLimiter;
 }