package com.asana;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import com.asana.errors.ServerError;
import com.asana.models.User;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.util.Arrays;
public class RateLimitTest extends AsanaTest
{
@Test
public void testClientGet() throws IOException
{
dispatcher.registerResponse("GET", "http://app/users/me").code(200).content("{ \"data\": { \"name\": \"me\" }}");
assertEquals("me", client.users.me().execute().name);
}
@Test
public void testRateLimiting() throws IOException
{
dispatcher.registerResponse("GET", "http://app/users/me").code(429).addHeader("Retry-After", "1.0");
dispatcher.registerResponse("GET", "http://app/users/me").code(200).content("{ \"data\": { \"name\": \"me\" }}");
assertEquals("me", client.users.me().execute().name);
assertEquals(2, dispatcher.calls.size());
assertEquals(Arrays.asList(1000), dispatcher.sleepCalls);
}
@Test
public void testRateLimitedTwice() throws IOException
{
dispatcher.registerResponse("GET", "http://app/users/me").code(429).addHeader("Retry-After", "1.0");
dispatcher.registerResponse("GET", "http://app/users/me").code(429).addHeader("Retry-After", "1.0");
dispatcher.registerResponse("GET", "http://app/users/me").code(200).content("{ \"data\": { \"name\": \"me\" }}");
assertEquals("me", client.users.me().execute().name);
assertEquals(3, dispatcher.calls.size());
assertEquals(Arrays.asList(1000, 1000), dispatcher.sleepCalls);
}
@Test
public void testServerErrorRetry() throws IOException
{
dispatcher.registerResponse("GET", "http://app/users/me").code(500);
dispatcher.registerResponse("GET", "http://app/users/me").code(200).content("{ \"data\": { \"name\": \"me\" }}");
assertEquals("me", client.users.me().execute().name);
assertEquals(2, dispatcher.calls.size());
assertEquals(Arrays.asList(1000), dispatcher.sleepCalls);
}
@Test(expected = ServerError.class)
public void testServerErrorRetryThenFail() throws IOException
{
dispatcher.registerResponse("GET", "http://app/users/me").code(500);
dispatcher.registerResponse("GET", "http://app/users/me").code(500);
client.users.me().option("max_retries", 1).execute();
}
@Test
public void testServerErrorRetryBackoff() throws IOException
{
dispatcher.registerResponse("GET", "http://app/users/me").code(500);
dispatcher.registerResponse("GET", "http://app/users/me").code(500);
dispatcher.registerResponse("GET", "http://app/users/me").code(500);
dispatcher.registerResponse("GET", "http://app/users/me").code(200).content("{ \"data\": { \"name\": \"me\" }}");
assertEquals("me", client.users.me().execute().name);
assertEquals(4, dispatcher.calls.size());
assertEquals(Arrays.asList(1000, 2000, 4000), dispatcher.sleepCalls);
}
}