package co.omise.requests;

import co.omise.Endpoint;
import co.omise.models.Card;
import co.omise.models.OmiseException;
import co.omise.models.Token;
import org.joda.time.Period;
import org.joda.time.YearMonth;
import org.junit.Test;

import java.io.IOException;

public class TokenRequestTest extends RequestTest {
    private static final String TOKEN_ID = "tokn_test_4yq8lbecl0q6dsjzxr5";

    @Test
    public void testGet() throws IOException, OmiseException {
        Request<Token> request = new Token.GetRequestBuilder(TOKEN_ID).build();
        Token token = getTestRequester().sendRequest(request);

        assertRequested("GET", "/tokens/" + TOKEN_ID, 200);
        assertVaultRequest();

        assertEquals(TOKEN_ID, token.getId());
        assertEquals("card_test_4yq6tuucl9h4erukfl0", token.getCard().getId());
        assertEquals("sRF/oMw2UQJJp/WbU+2/ZbVzwROjpMf1lyhOHhOqziw=", token.getCard().getFingerprint());
    }

    @Test
    public void testCreate() throws IOException, OmiseException {
        Request<Token> request = new Token.CreateRequestBuilder()
                .card(new Card.Create()
                        .name("JOHN DOE")
                        .number("4242424242424242")
                        .expiration(YearMonth.now().withPeriodAdded(Period.years(1), 1))
                        .securityCode("123")
                        .city("Bangkok")
                        .postalCode("10240"))
                .build();

        Token token = getTestRequester().sendRequest(request);

        assertRequested("POST", "/tokens", 200);
        assertVaultRequest();

        assertEquals(TOKEN_ID, token.getId());
        assertFalse(token.isLiveMode());
        assertEquals("card_test_4yq6tuucl9h4erukfl0", token.getCard().getId());
    }

    private void assertVaultRequest() {
        assertEquals(Endpoint.VAULT.host(), lastRequest().url().host());
    }
}