package com.stripe.model; import java.io.IOException; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import com.stripe.BaseStripeTest; import com.stripe.exception.StripeException; import com.stripe.net.APIResource; import com.stripe.net.LiveStripeResponseGetter; import com.stripe.net.RequestOptions; import com.stripe.net.RequestOptions.RequestOptionsBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; public class AccountTest extends BaseStripeTest { @Before public void mockStripeResponseGetter() { APIResource.setStripeResponseGetter(networkMock); } @After public void unmockStripeResponseGetter() { /* This needs to be done because tests aren't isolated in Java */ APIResource.setStripeResponseGetter(new LiveStripeResponseGetter()); } @Test public void testDeserialize() throws StripeException, IOException { String json = resource("account.json"); Account acc = APIResource.GSON.fromJson(json, Account.class); assertEquals("acct_1032D82eZvKYlo2C", acc.getId()); assertEquals(false, acc.getChargesEnabled()); assertEquals(false, acc.getDetailsSubmitted()); assertEquals(false, acc.getPayoutsEnabled()); assertEquals("http://www.business.com", acc.getBusinessURL()); assertEquals("http://support.business.com", acc.getSupportURL()); LinkedList<String> cs = new LinkedList<String>(); cs.add("usd"); cs.add("aud"); assertEquals(cs, acc.getCurrenciesSupported()); LegalEntity le = new LegalEntity(); le.type = "company"; le.address = new Address(); le.address.city = "San Francisco"; le.businessTaxIdProvided = true; le.personalIdNumberProvided = false; le.ssnLast4Provided = true; LegalEntity.Verification leVerif = new LegalEntity.Verification(); leVerif.detailsCode = "failed_other"; leVerif.status = "unverified"; le.verification = leVerif; assertEquals(le, acc.getLegalEntity()); AccountPayoutSchedule payoutSchedule = new AccountPayoutSchedule(); payoutSchedule.delayDays = 10; payoutSchedule.interval = "weekly"; payoutSchedule.weeklyAnchor = "wednesday"; assertEquals(payoutSchedule, acc.getPayoutSchedule()); Account.Verification verif = new Account.Verification(); verif.disabledReason = "fields_needed"; verif.dueBy = (long) 1457913600; LinkedList<String> fn = new LinkedList<String>(); fn.add("legal_entity.first_name"); fn.add("legal_entity.last_name"); verif.fieldsNeeded = fn; assertEquals(verif, acc.getVerification()); assertEquals("site@stripe.com", acc.getEmail()); assertEquals("usd", acc.getDefaultCurrency()); assertEquals("US", acc.getCountry()); assertEquals("US/Pacific", acc.getTimezone()); assertEquals("Stripe.com", acc.getDisplayName()); assertEquals("Stripe.com", acc.getBusinessName()); assertEquals(true, acc.getExternalAccounts() instanceof ExternalAccountCollection); } @Test public void testRetrieve() throws StripeException { Account.retrieve(); verifyGet(Account.class, "https://api.stripe.com/v1/account"); verifyNoMoreInteractions(networkMock); } @Test public void testOverloadedSingleArgumentRetrieve() throws StripeException { Account.retrieve("sk_foobar"); RequestOptions options = (new RequestOptionsBuilder()).setApiKey("sk_foobar").build(); verifyGet(Account.class, "https://api.stripe.com/v1/account", options); Account.retrieve("anything_else"); verifyGet(Account.class, "https://api.stripe.com/v1/accounts/anything_else"); verifyNoMoreInteractions(networkMock); } @Test public void testRetrieveAccountWithId() throws StripeException { Account.retrieve("acct_something", null); verifyGet(Account.class, "https://api.stripe.com/v1/accounts/acct_something"); verifyNoMoreInteractions(networkMock); } @Test public void testAccountReject() throws StripeException, IOException { String json = resource("account.json"); stubNetwork(Account.class, json); Account acc = Account.retrieve("acct_1032D82eZvKYlo2C"); verifyGet(Account.class, "https://api.stripe.com/v1/accounts/acct_1032D82eZvKYlo2C"); Map<String, Object> rejectParams = new HashMap<String, Object>(); rejectParams.put("reason", "fraud"); acc.reject(rejectParams); verifyPost(Account.class, "https://api.stripe.com/v1/accounts/acct_1032D82eZvKYlo2C/reject", rejectParams); verifyNoMoreInteractions(networkMock); } @Test public void testAccountUpdateById() throws StripeException, IOException { String json = resource("account.json"); stubNetwork(Account.class, json); Account acc = Account.retrieve("acct_1032D82eZvKYlo2C"); verifyGet(Account.class, "https://api.stripe.com/v1/accounts/acct_1032D82eZvKYlo2C"); Map<String, Object> params = new HashMap<String, Object>(); Map<String, Object> legalEntity = new HashMap<String, Object>(); legalEntity.put("type", "individual"); params.put("legal_entity", legalEntity); acc.update(params); verifyPost(Account.class, "https://api.stripe.com/v1/accounts/acct_1032D82eZvKYlo2C", params); verifyNoMoreInteractions(networkMock); } @Test public void testAccountCreateExternalAccount() throws StripeException, IOException { String json = resource("account.json"); stubNetwork(Account.class, json); Account acc = Account.retrieve("acct_1032D82eZvKYlo2C"); verifyGet(Account.class, "https://api.stripe.com/v1/accounts/acct_1032D82eZvKYlo2C"); Map<String, Object> params = new HashMap<String, Object>(); params.put("external_account", "tok_1234"); stubNetwork(Card.class, "{\"id\": \"tok_1234\", \"object\": \"card\", \"last4\": \"1234\"}"); ExternalAccount ea = acc.getExternalAccounts().create(params); assertEquals("card", ea.getObject()); assertEquals("1234", ((Card)ea).getLast4()); verifyPost(ExternalAccount.class, "https://api.stripe.com/v1/accounts/acct_1032D82eZvKYlo2C/external_accounts", params); verifyNoMoreInteractions(networkMock); } @Test public void testAccountDelete() throws StripeException, IOException { String json = resource("account.json"); stubNetwork(Account.class, json); Account acc = Account.retrieve("acct_1032D82eZvKYlo2C"); verifyGet(Account.class, "https://api.stripe.com/v1/accounts/acct_1032D82eZvKYlo2C"); stubNetwork(DeletedAccount.class, "{\"id\": \"acct_1032D82eZvKYlo2C\", \"deleted\": \"true\"}"); acc.delete(); verifyDelete(DeletedAccount.class, "https://api.stripe.com/v1/accounts/acct_1032D82eZvKYlo2C"); verifyNoMoreInteractions(networkMock); } }