diff --git a/README.md b/README.md index a591aff..fffa5ab 100644 --- a/README.md +++ b/README.md @@ -192,6 +192,7 @@ The new test code is implemented using Scala. The prod code is only Java - to av | PUT /1/cards/[card id or shortlink]/pos | PUT /1/cards/[card id or shortlink]/subscribed | PUT /1/cards/[card id or shortlink]/warnWhenUpcoming +| PUT /1/cards/[card id or shortlink]/checkItem/[idCheckItem] | Yes | Yes | No | POST /1/cards | Yes | POST /1/cards/[card id or shortlink]/actions/comments | Yes | No | Yes | POST /1/cards/[card id or shortlink]/attachments | Yes
(Except AsyncTrelloHttpClient) | No | Yes diff --git a/src/main/java/com/julienvey/trello/Trello.java b/src/main/java/com/julienvey/trello/Trello.java index 7d420fb..f547538 100644 --- a/src/main/java/com/julienvey/trello/Trello.java +++ b/src/main/java/com/julienvey/trello/Trello.java @@ -140,6 +140,10 @@ List getBoardMemberActivity(String boardId, String memberId, void createCheckItem(String checkListId, CheckItem checkItem); + CheckItem completeCheckItem(String cardId, String checkItemId); + + CheckItem incompleteCheckItem(String cardId, String checkItemId); + List getCardChecklists(String cardId, Argument... args); /* Organizations */ diff --git a/src/main/java/com/julienvey/trello/domain/CheckItem.java b/src/main/java/com/julienvey/trello/domain/CheckItem.java index 1f7f784..45d9a12 100644 --- a/src/main/java/com/julienvey/trello/domain/CheckItem.java +++ b/src/main/java/com/julienvey/trello/domain/CheckItem.java @@ -1,11 +1,12 @@ package com.julienvey.trello.domain; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.julienvey.trello.impl.domaininternal.CheckItemState; @JsonIgnoreProperties(ignoreUnknown = true) public class CheckItem { - private String state; + private CheckItemState state = CheckItemState.INCOMPLETE; private String id; private String name; private int pos; @@ -34,11 +35,11 @@ public void setPos(int pos) { this.pos = pos; } - public String getState() { + public CheckItemState getState() { return state; } - public void setState(String state) { + public void setState(CheckItemState state) { this.state = state; } } diff --git a/src/main/java/com/julienvey/trello/impl/TrelloImpl.java b/src/main/java/com/julienvey/trello/impl/TrelloImpl.java index 9d7acc6..42842d8 100644 --- a/src/main/java/com/julienvey/trello/impl/TrelloImpl.java +++ b/src/main/java/com/julienvey/trello/impl/TrelloImpl.java @@ -56,6 +56,7 @@ import static com.julienvey.trello.impl.TrelloUrl.REMOVE_MEMBER_FROM_CARD; import static com.julienvey.trello.impl.TrelloUrl.UPDATE_CARD; import static com.julienvey.trello.impl.TrelloUrl.UPDATE_CARD_COMMENT; +import static com.julienvey.trello.impl.TrelloUrl.UPDATE_CHECKITEM_IN_CARD; import static com.julienvey.trello.impl.TrelloUrl.UPDATE_LABEL; import static com.julienvey.trello.impl.TrelloUrl.createUrl; import static com.julienvey.trello.impl.TrelloUrl.createUrlWithNoArgs; @@ -72,6 +73,7 @@ import java.util.function.Supplier; import java.util.stream.Collectors; +import com.julienvey.trello.impl.domaininternal.CheckItemState; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -443,6 +445,16 @@ public void createCheckItem(String checkListId, CheckItem checkItem) { postForLocation(createUrl(ADD_CHECKITEMS_TO_CHECKLIST).asString(), checkItem, checkListId); } + public CheckItem completeCheckItem(String cardId, String checkItemId) { + Map body = Map.of("state", CheckItemState.COMPLETE.getState()); + return put(createUrl(UPDATE_CHECKITEM_IN_CARD).asString(), body, CheckItem.class, cardId, checkItemId); + } + + public CheckItem incompleteCheckItem(String cardId, String checkItemId) { + Map body = Map.of("state", CheckItemState.INCOMPLETE.getState()); + return put(createUrl(UPDATE_CHECKITEM_IN_CARD).asString(), body, CheckItem.class, cardId, checkItemId); + } + /* Others */ @Override diff --git a/src/main/java/com/julienvey/trello/impl/TrelloUrl.java b/src/main/java/com/julienvey/trello/impl/TrelloUrl.java index 430969a..1895ad0 100644 --- a/src/main/java/com/julienvey/trello/impl/TrelloUrl.java +++ b/src/main/java/com/julienvey/trello/impl/TrelloUrl.java @@ -58,6 +58,7 @@ public class TrelloUrl { public static final String GET_CHECK_LIST = "/checklists/{checkListId}?"; public static final String CREATE_CHECKLIST = "/checklists?"; public static final String ADD_CHECKITEMS_TO_CHECKLIST = "/checklists/{checkListId}/checkitems?"; + public static final String UPDATE_CHECKITEM_IN_CARD = "/cards/{cardId}/checkitem/{checkItemId}?"; public static final String CREATE_CARD = "/cards?pos=top&"; public static final String GET_MEMBER = "/members/{username}?"; @@ -104,4 +105,4 @@ public String asString() { } return builder.toString(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/julienvey/trello/impl/domaininternal/CheckItemState.java b/src/main/java/com/julienvey/trello/impl/domaininternal/CheckItemState.java new file mode 100644 index 0000000..eb15502 --- /dev/null +++ b/src/main/java/com/julienvey/trello/impl/domaininternal/CheckItemState.java @@ -0,0 +1,19 @@ +package com.julienvey.trello.impl.domaininternal; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum CheckItemState { + COMPLETE("complete"), + INCOMPLETE("incomplete"); + + private final String state; + + CheckItemState(String state) { + this.state = state; + } + + @JsonValue + public String getState() { + return state; + } +} diff --git a/src/test/java/com/julienvey/trello/unit/CheckListGetUnitTest.java b/src/test/java/com/julienvey/trello/unit/CheckListGetUnitTest.java deleted file mode 100644 index 26f5dfd..0000000 --- a/src/test/java/com/julienvey/trello/unit/CheckListGetUnitTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.julienvey.trello.unit; - -import com.julienvey.trello.Trello; -import com.julienvey.trello.TrelloHttpClient; -import com.julienvey.trello.domain.Card; -import com.julienvey.trello.domain.CheckList; -import com.julienvey.trello.impl.TrelloImpl; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.anyVararg; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; - -public class CheckListGetUnitTest { - - private Trello trello; - - private TrelloHttpClient httpClient; - - @Before - public void setUp() { - httpClient = Mockito.mock(TrelloHttpClient.class); - trello = new TrelloImpl("", "", httpClient); - } - - @Test - public void testGetCheckList() { - //Given - CheckList mockCheckList = new CheckList(); - mockCheckList.setId("idCheckList"); - - when(httpClient.get(anyString(), any(Class.class), (String[]) anyVararg())).thenReturn(mockCheckList); - - //When - CheckList checkList = trello.getCheckList("idCheckList"); - - //Then - assertThat(checkList).isNotNull(); - assertThat(checkList.getId()).isEqualTo("idCheckList"); - - verify(httpClient).get(eq("https://api.trello.com/1/checklists/{checkListId}?key={applicationKey}&token={userToken}"), - eq(CheckList.class), eq("idCheckList"), eq(""), eq("")); - verifyNoMoreInteractions(httpClient); - } -} diff --git a/src/test/java/com/julienvey/trello/unit/CheckListUnitTest.java b/src/test/java/com/julienvey/trello/unit/CheckListUnitTest.java new file mode 100644 index 0000000..81bdf21 --- /dev/null +++ b/src/test/java/com/julienvey/trello/unit/CheckListUnitTest.java @@ -0,0 +1,98 @@ +package com.julienvey.trello.unit; + +import com.julienvey.trello.Trello; +import com.julienvey.trello.TrelloHttpClient; +import com.julienvey.trello.domain.CheckItem; +import com.julienvey.trello.domain.CheckList; +import com.julienvey.trello.impl.TrelloImpl; +import com.julienvey.trello.impl.domaininternal.CheckItemState; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import java.util.Map; + +import static org.fest.assertions.Assertions.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.anyVararg; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; + +public class CheckListUnitTest { + + private Trello trello; + + private TrelloHttpClient httpClient; + + @Before + public void setUp() { + httpClient = Mockito.mock(TrelloHttpClient.class); + trello = new TrelloImpl("", "", httpClient); + } + + @Test + public void testGetCheckList() { + //Given + CheckList mockCheckList = new CheckList(); + mockCheckList.setId("idCheckList"); + + when(httpClient.get(anyString(), any(Class.class), (String[]) anyVararg())).thenReturn(mockCheckList); + + //When + CheckList checkList = trello.getCheckList("idCheckList"); + + //Then + assertThat(checkList).isNotNull(); + assertThat(checkList.getId()).isEqualTo("idCheckList"); + + verify(httpClient).get(eq("https://api.trello.com/1/checklists/{checkListId}?key={applicationKey}&token={userToken}"), + eq(CheckList.class), eq("idCheckList"), eq(""), eq("")); + verifyNoMoreInteractions(httpClient); + } + + @Test + public void testCompleteCheckItemInCheckList() { + //Given + CheckItem mockCheckItem = mockCheckItem(CheckItemState.COMPLETE); + when(httpClient.putForObject(anyString(), any(Class.class), any(), anyVararg())).thenReturn(mockCheckItem); + + //When + CheckItem checkItem = trello.completeCheckItem("idCheckList", "idCheckItem"); + + //Then + verifyCheckItemAndRequest(checkItem, CheckItemState.COMPLETE); + } + + @Test + public void testIncompleteCheckItemInCheckList() { + //Given + CheckItem mockCheckItem = mockCheckItem(CheckItemState.INCOMPLETE); + when(httpClient.putForObject(anyString(), any(Class.class), any(), anyVararg())).thenReturn(mockCheckItem); + + //When + CheckItem checkItem = trello.incompleteCheckItem("idCheckList", "idCheckItem"); + + //Then + verifyCheckItemAndRequest(checkItem, CheckItemState.INCOMPLETE); + } + + private void verifyCheckItemAndRequest(CheckItem checkItem, CheckItemState state) { + assertThat(checkItem).isNotNull(); + assertThat(checkItem.getId()).isEqualTo("idCheckItem"); + assertThat(checkItem.getState()).isEqualTo(state); + + verify(httpClient).putForObject(eq("https://api.trello.com/1/cards/{cardId}/checkitem/{checkItemId}?key={applicationKey}&token={userToken}"), + eq(Map.of("state", state.getState())), eq(CheckItem.class), eq("idCheckList"), eq("idCheckItem"), eq(""), eq("")); + verifyNoMoreInteractions(httpClient); + } + + private CheckItem mockCheckItem(CheckItemState state) { + CheckItem mockCheckItem = new CheckItem(); + mockCheckItem.setId("idCheckItem"); + mockCheckItem.setState(state); + return mockCheckItem; + } +}