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;
+ }
+}