package io.kaif.web.v1; import static java.util.Arrays.asList; import static org.hamcrest.Matchers.is; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.time.Instant; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.springframework.dao.DuplicateKeyException; import io.kaif.flake.FlakeId; import io.kaif.model.account.Account; import io.kaif.model.clientapp.ClientAppUserAccessToken; import io.kaif.model.vote.ArticleVoter; import io.kaif.model.vote.DebateVoter; import io.kaif.model.vote.VoteState; import io.kaif.test.MvcIntegrationTests; public class V1VoteResourceTest extends MvcIntegrationTests { private Account user; @Before public void setUp() throws Exception { user = accountCitizen("user1"); } @Test public void article() throws Exception { ArticleVoter articleVoter = articleVoter(VoteState.UP, "foo1"); when(voteService.listArticleVoters(isA(ClientAppUserAccessToken.class), eq(asList(FlakeId.fromString("foo1"), FlakeId.fromString("foo2"))))).thenReturn(asList( articleVoter)); oauthPerform(user, get("/v1/vote/article").param("article-id", "foo1,foo2")).andExpect(status().isOk()) .andExpect(jsonPath("$.data[0].voteState", is("UP"))); } @Test public void debate() throws Exception { DebateVoter debateVoter = debateVoter(VoteState.DOWN, "foo1", "bar123"); when(voteService.listDebateVotersByIds(isA(ClientAppUserAccessToken.class), eq(asList(FlakeId.fromString("bar123"), FlakeId.fromString("bar456"))))).thenReturn(asList( debateVoter)); oauthPerform(user, get("/v1/vote/debate").param("debate-id", "bar123,bar456")).andExpect(status().isOk()) .andExpect(jsonPath("$.data[0].voteState", is("DOWN"))) .andExpect(jsonPath("$.data[0].targetId", is("bar123"))); } @Test public void voteDebate() throws Exception { DebateVoter debateVoter = debateVoter(VoteState.DOWN, "foo1", "bar123"); when(voteService.listDebateVotersByIds(isA(ClientAppUserAccessToken.class), eq(asList(FlakeId.fromString("bar123"))))).thenReturn(asList(debateVoter)); oauthPerform(user, post("/v1/vote/debate").content(q("{'voteState':'UP','debateId':'bar123'}"))) .andExpect(status().isOk()); verify(voteService).voteDebate(eq(VoteState.UP), eq(FlakeId.fromString("bar123")), isA(ClientAppUserAccessToken.class), eq(VoteState.DOWN), eq(0L)); } @Test public void voteArticle() throws Exception { ArticleVoter articleVoter = articleVoter(VoteState.UP, "foo1"); when(voteService.listArticleVoters(isA(ClientAppUserAccessToken.class), eq(asList(FlakeId.fromString("foo1"))))).thenReturn(asList(articleVoter)); oauthPerform(user, post("/v1/vote/article").content(q("{'voteState':'EMPTY','articleId':'foo1'}"))).andExpect( status().isOk()); verify(voteService).voteArticle(eq(VoteState.EMPTY), eq(FlakeId.fromString("foo1")), isA(ClientAppUserAccessToken.class), eq(VoteState.UP), eq(0L)); } @Test public void ignoreDuplicateKeyException() throws Exception { ArticleVoter articleVoter = articleVoter(VoteState.UP, "foo1"); when(voteService.listArticleVoters(isA(ClientAppUserAccessToken.class), eq(asList(FlakeId.fromString("foo1"))))).thenReturn(asList(articleVoter)); Mockito.doThrow(new DuplicateKeyException("fake")) .when(voteService) .voteArticle(eq(VoteState.EMPTY), eq(FlakeId.fromString("foo1")), isA(ClientAppUserAccessToken.class), eq(VoteState.UP), eq(0L)); oauthPerform(user, post("/v1/vote/article").content(q("{'voteState':'EMPTY','articleId':'foo1'}"))).andExpect( status().isOk()); } private ArticleVoter articleVoter(VoteState voteState, String articleId) { return ArticleVoter.create(voteState, FlakeId.fromString(articleId), user.getAccountId(), 0, Instant.now()); } @Test public void debateOfArticles() throws Exception { DebateVoter debateVoter = debateVoter(VoteState.DOWN, "foo1", "bar123"); when(voteService.listDebateVoters(isA(ClientAppUserAccessToken.class), eq(FlakeId.fromString("foo1")))).thenReturn(asList(debateVoter)); oauthPerform(user, get("/v1/vote/debate/article/foo1")).andExpect(status().isOk()) .andExpect(jsonPath("$.data[0].voteState", is("DOWN"))) .andExpect(jsonPath("$.data[0].targetId", is("bar123"))); } private DebateVoter debateVoter(VoteState voteState, String articleId, String debateId) { return DebateVoter.create(voteState, FlakeId.fromString(articleId), FlakeId.fromString(debateId), user.getAccountId(), 0, Instant.now()); } }