package com.truckmuncher.app.data; import android.util.Base64; import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import retrofit.RequestInterceptor; import static org.assertj.core.api.Assertions.assertThat; public abstract class ApiRequestInterceptorTest { ApiRequestInterceptor interceptor; StubFacade facade; @Before public void setUp() { facade = new StubFacade(); } @Test public void timeStampHeaderIsAdded() { interceptor.intercept(facade); assertThat(facade.headers).containsKey(ApiRequestInterceptor.HEADER_TIMESTAMP); String value = facade.headers.get(ApiRequestInterceptor.HEADER_TIMESTAMP); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); try { format.parse(value); } catch (ParseException e) { Assertions.fail("Unable to parse the header timestamp", e); } } @Test public void nonceHeaderIsAdded() { interceptor.intercept(facade); assertThat(facade.headers).containsKey(ApiRequestInterceptor.HEADER_NONCE); String value = facade.headers.get(ApiRequestInterceptor.HEADER_NONCE); assertThat(Base64.decode(value, Base64.DEFAULT)).hasSize(32); } @Test public void nonceAreUnique() { Set<String> nonce = new HashSet<>(10000); for (int i = 0; i < 10000; i++) { interceptor.intercept(facade); String value = facade.headers.get(ApiRequestInterceptor.HEADER_NONCE); assertThat(nonce.add(value)).isTrue(); } } public static class StubFacade implements RequestInterceptor.RequestFacade { Map<String, String> headers = new HashMap<>(); @Override public void addHeader(String name, String value) { headers.put(name, value); } @Override public void addPathParam(String name, String value) { } @Override public void addEncodedPathParam(String name, String value) { } @Override public void addQueryParam(String name, String value) { } @Override public void addEncodedQueryParam(String name, String value) { } } }