From bfe6b9471dccf8b4634d7ec1e5240e9a63e926ac Mon Sep 17 00:00:00 2001 From: Artem Ishchenko Date: Thu, 22 Feb 2024 23:02:21 +0200 Subject: [PATCH 1/3] compleate checkbox api --- .../java/com/julienvey/trello/Trello.java | 4 +++ .../julienvey/trello/domain/CheckItem.java | 7 +++-- .../com/julienvey/trello/impl/TrelloImpl.java | 12 ++++++++ .../com/julienvey/trello/impl/TrelloUrl.java | 3 +- .../impl/domaininternal/CheckItemState.java | 19 +++++++++++++ ...etUnitTest.java => CheckListUnitTest.java} | 28 +++++++++++++++++-- 6 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/julienvey/trello/impl/domaininternal/CheckItemState.java rename src/test/java/com/julienvey/trello/unit/{CheckListGetUnitTest.java => CheckListUnitTest.java} (57%) 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/CheckListUnitTest.java similarity index 57% rename from src/test/java/com/julienvey/trello/unit/CheckListGetUnitTest.java rename to src/test/java/com/julienvey/trello/unit/CheckListUnitTest.java index 26f5dfd..2e40df6 100644 --- a/src/test/java/com/julienvey/trello/unit/CheckListGetUnitTest.java +++ b/src/test/java/com/julienvey/trello/unit/CheckListUnitTest.java @@ -2,13 +2,16 @@ import com.julienvey.trello.Trello; import com.julienvey.trello.TrelloHttpClient; -import com.julienvey.trello.domain.Card; +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; @@ -18,7 +21,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -public class CheckListGetUnitTest { +public class CheckListUnitTest { private Trello trello; @@ -49,4 +52,25 @@ public void testGetCheckList() { eq(CheckList.class), eq("idCheckList"), eq(""), eq("")); verifyNoMoreInteractions(httpClient); } + + @Test + public void testUpdateCheckItemInCheckList() { + //Given + CheckItem mockCheckItem = new CheckItem(); + mockCheckItem.setId("idCheckItem"); + mockCheckItem.setState(CheckItemState.COMPLETE); + when(httpClient.putForObject(anyString(), any(Class.class), any(), (String[]) anyVararg())).thenReturn(mockCheckItem); + + //When + CheckItem checkItem = trello.completeCheckItem("idCheckList", "idCheckItem"); + + //Then + assertThat(checkItem).isNotNull(); + assertThat(checkItem.getId()).isEqualTo("idCheckItem"); + assertThat(checkItem.getState()).isEqualTo(CheckItemState.COMPLETE); + + verify(httpClient).putForObject(eq("https://api.trello.com/1/cards/{cardId}/checkitem/{checkItemId}?key={applicationKey}&token={userToken}"), + eq(Map.of("state", CheckItemState.COMPLETE.getState())), eq(CheckItem.class), eq("idCheckList"), eq("idCheckItem"), eq(""), eq("")); + verifyNoMoreInteractions(httpClient); + } } From e539f78ac1aa8bd314200bd1b1b357d1253fbe95 Mon Sep 17 00:00:00 2001 From: Artem Ishchenko Date: Thu, 22 Feb 2024 23:18:47 +0200 Subject: [PATCH 2/3] tests --- .../trello/unit/CheckListUnitTest.java | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/test/java/com/julienvey/trello/unit/CheckListUnitTest.java b/src/test/java/com/julienvey/trello/unit/CheckListUnitTest.java index 2e40df6..81bdf21 100644 --- a/src/test/java/com/julienvey/trello/unit/CheckListUnitTest.java +++ b/src/test/java/com/julienvey/trello/unit/CheckListUnitTest.java @@ -54,23 +54,45 @@ public void testGetCheckList() { } @Test - public void testUpdateCheckItemInCheckList() { + public void testCompleteCheckItemInCheckList() { //Given - CheckItem mockCheckItem = new CheckItem(); - mockCheckItem.setId("idCheckItem"); - mockCheckItem.setState(CheckItemState.COMPLETE); - when(httpClient.putForObject(anyString(), any(Class.class), any(), (String[]) anyVararg())).thenReturn(mockCheckItem); + 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(CheckItemState.COMPLETE); + 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", CheckItemState.COMPLETE.getState())), eq(CheckItem.class), eq("idCheckList"), eq("idCheckItem"), eq(""), eq("")); + 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; + } } From 3fa1d7e6f5b7644f8741315aac63ff59106cca3a Mon Sep 17 00:00:00 2001 From: Artem Ishchenko Date: Thu, 22 Feb 2024 23:31:49 +0200 Subject: [PATCH 3/3] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) 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