package com.piggymetrics.account.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableList; import com.piggymetrics.account.AccountApplication; import com.piggymetrics.account.domain.*; import com.piggymetrics.account.service.AccountService; import com.sun.security.auth.UserPrincipal; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.math.BigDecimal; import java.util.Date; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = AccountApplication.class) @WebAppConfiguration public class AccountControllerTest { private static final ObjectMapper mapper = new ObjectMapper(); @InjectMocks private AccountController accountController; @Mock private AccountService accountService; private MockMvc mockMvc; @Before public void setup() { initMocks(this); this.mockMvc = MockMvcBuilders.standaloneSetup(accountController).build(); } @Test public void shouldGetAccountByName() throws Exception { final Account account = new Account(); account.setName("test"); when(accountService.findByName(account.getName())).thenReturn(account); mockMvc.perform(get("/" + account.getName())) .andExpect(jsonPath("$.name").value(account.getName())) .andExpect(status().isOk()); } @Test public void shouldGetCurrentAccount() throws Exception { final Account account = new Account(); account.setName("test"); when(accountService.findByName(account.getName())).thenReturn(account); mockMvc.perform(get("/current").principal(new UserPrincipal(account.getName()))) .andExpect(jsonPath("$.name").value(account.getName())) .andExpect(status().isOk()); } @Test public void shouldSaveCurrentAccount() throws Exception { Saving saving = new Saving(); saving.setAmount(new BigDecimal(1500)); saving.setCurrency(Currency.USD); saving.setInterest(new BigDecimal("3.32")); saving.setDeposit(true); saving.setCapitalization(false); Item grocery = new Item(); grocery.setTitle("Grocery"); grocery.setAmount(new BigDecimal(10)); grocery.setCurrency(Currency.USD); grocery.setPeriod(TimePeriod.DAY); grocery.setIcon("meal"); Item salary = new Item(); salary.setTitle("Salary"); salary.setAmount(new BigDecimal(9100)); salary.setCurrency(Currency.USD); salary.setPeriod(TimePeriod.MONTH); salary.setIcon("wallet"); final Account account = new Account(); account.setName("test"); account.setNote("test note"); account.setLastSeen(new Date()); account.setSaving(saving); account.setExpenses(ImmutableList.of(grocery)); account.setIncomes(ImmutableList.of(salary)); String json = mapper.writeValueAsString(account); mockMvc.perform(put("/current").principal(new UserPrincipal(account.getName())).contentType(MediaType.APPLICATION_JSON).content(json)) .andExpect(status().isOk()); } @Test public void shouldFailOnValidationTryingToSaveCurrentAccount() throws Exception { final Account account = new Account(); account.setName("test"); String json = mapper.writeValueAsString(account); mockMvc.perform(put("/current").principal(new UserPrincipal(account.getName())).contentType(MediaType.APPLICATION_JSON).content(json)) .andExpect(status().isBadRequest()); } @Test public void shouldRegisterNewAccount() throws Exception { final User user = new User(); user.setUsername("test"); user.setPassword("password"); String json = mapper.writeValueAsString(user); System.out.println(json); mockMvc.perform(post("/").principal(new UserPrincipal("test")).contentType(MediaType.APPLICATION_JSON).content(json)) .andExpect(status().isOk()); } @Test public void shouldFailOnValidationTryingToRegisterNewAccount() throws Exception { final User user = new User(); user.setUsername("t"); String json = mapper.writeValueAsString(user); mockMvc.perform(post("/").principal(new UserPrincipal("test")).contentType(MediaType.APPLICATION_JSON).content(json)) .andExpect(status().isBadRequest()); } }