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; }
public Ratelimiter(ImgurRatelimiter imgurLimiter) { _imgurLimiter = imgurLimiter; }