diff --git a/wrapper/src/main/java/wekan/wrapper/api/SwimlanesService.java b/wrapper/src/main/java/wekan/wrapper/api/SwimlanesService.java new file mode 100644 index 0000000..8a3cae9 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/api/SwimlanesService.java @@ -0,0 +1,48 @@ +package wekan.wrapper.api; + +import retrofit2.Call; +import retrofit2.http.*; +import wekan.wrapper.entity.Swimlane; + +import java.util.List; + +public interface SwimlanesService { + /** + * Get the list of swimlanes attached to a board. + * + * @param boardId The ID of the board + * @return The list of swimlanes + */ + @GET("/api/boards/{boardId}/swimlanes") + Call> getAllSwimlanes(@Path("boardId") String boardId); + + /** + * Add a swimlane to a board. + * + * @param boardId The ID of the board + * @param swimlaneTitle The new title of the swimlane + * @return The new swimlane + */ + @FormUrlEncoded + @POST("/api/boards/{boardId}/swimlanes") + Call newSwimlane(@Path("boardId") String boardId, @Field("title") String swimlaneTitle); + + /** + * Get a swimlane. + * + * @param boardId The ID of the board + * @param swimlaneId The ID of the swimlane + * @return The swimlane + */ + @GET("/api/boards/{boardId}/swimlanes/{swimlaneId}") + Call getSwimlane(@Path("boardId") String boardId, @Path("swimlaneId") String swimlaneId); + + /** + * Delete a swimlane. + * + * @param boardId The ID of the board + * @param swimlaneId The ID of the swimlane + */ + @DELETE("/api/boards/{boardId}/swimlanes/{swimlaneId}") + Call deleteSwimlane(@Path("boardId") String boardId, @Path("swimlaneId") String swimlaneId); +} diff --git a/wrapper/src/main/java/wekan/wrapper/entity/Swimlane.java b/wrapper/src/main/java/wekan/wrapper/entity/Swimlane.java new file mode 100644 index 0000000..c814763 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/Swimlane.java @@ -0,0 +1,68 @@ +package wekan.wrapper.entity; + +import com.google.gson.annotations.SerializedName; + +import java.util.Date; + +public class Swimlane { + @SerializedName("_id") + private String id; + private String title; + private String boardId; + private Date createdAt; + private int sort; + private Color color; + private Date updatedAt; + private Date modifiedAt; + private String type; + + public String getId() { + return id; + } + + public String getTitle() { + return title; + } + + public String getBoardId() { + return boardId; + } + + public Date getCreatedAt() { + return createdAt; + } + + public int getSort() { + return sort; + } + + public Color getColor() { + return color; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public Date getModifiedAt() { + return modifiedAt; + } + + public String getType() { + return type; + } + + @Override + public String toString() { + return "Swimlane{" + + "id='" + id + '\'' + + ", title='" + title + '\'' + + ", boardId='" + boardId + '\'' + + ", createdAt=" + createdAt + + ", sort=" + sort + + ", updatedAt=" + updatedAt + + ", modifiedAt=" + modifiedAt + + ", type='" + type + '\'' + + '}'; + } +} diff --git a/wrapper/src/test/java/wekan/wrapper/api/SwimlanesServiceTest.java b/wrapper/src/test/java/wekan/wrapper/api/SwimlanesServiceTest.java new file mode 100644 index 0000000..7686589 --- /dev/null +++ b/wrapper/src/test/java/wekan/wrapper/api/SwimlanesServiceTest.java @@ -0,0 +1,124 @@ +package wekan.wrapper.api; + +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import wekan.wrapper.entity.Color; +import wekan.wrapper.entity.Swimlane; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.util.List; + +import static org.junit.Assert.*; + +public class SwimlanesServiceTest { + private MockWebServer mockWebServer = new MockWebServer(); + private SwimlanesService service = null; + + @Before + public void setUp() { + try { + mockWebServer.start(); + service = new Retrofit.Builder() + .baseUrl(mockWebServer.url("/")) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(SwimlanesService.class); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @After + public void teardown() { + try { + mockWebServer.shutdown(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void getAllSwimlanes() { + MockResponse response = new MockResponse() + .setResponseCode(HttpURLConnection.HTTP_OK) + .setBody( + "[ " + SWIMLANE_1 + ", " + SWIMLANE_2 + " ]" + ); + + mockWebServer.enqueue(response); + + try { + List lists = service.getAllSwimlanes("board id").execute().body(); + + assertNotNull(lists); + + assertEquals(2, lists.size()); + + for (int i = 0; i < 2; i++) + assertEquals("title " + (i + 1), lists.get(i).getTitle()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void newSwimlane() { + MockResponse response = new MockResponse() + .setResponseCode(HttpURLConnection.HTTP_OK) + .setBody( + "{\"_id\":\"ixM8fvtBMuNPqGRSX\"}" + ); + + mockWebServer.enqueue(response); + + try { + Swimlane sl = service.newSwimlane("board id", "new swimlane").execute().body(); + + assertNotNull(sl); + assertEquals("ixM8fvtBMuNPqGRSX", sl.getId()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void getSwimlane() { + MockResponse response = new MockResponse() + .setResponseCode(HttpURLConnection.HTTP_OK) + .setBody(SWIMLANE_2); + + mockWebServer.enqueue(response); + + try { + Swimlane sl = service.getSwimlane("TtjXrJyvPkG3xsbkw", "JNmpXKCupbtyPkYMG") + .execute().body(); + + assertNotNull(sl); + assertEquals("JNmpXKCupbtyPkYMG", sl.getId()); + assertEquals("title 2", sl.getTitle()); + assertEquals(Color.NAVY, sl.getColor()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + final static String SWIMLANE_1 = "{\n\"_id\": \"BS4AA79YABBCpDDau\",\n\"title\": \"title 1\"\n}"; + final static String SWIMLANE_2 = "{" + + "\"_id\":\"JNmpXKCupbtyPkYMG\"," + + "\"title\":\"title 2\"," + + "\"boardId\":\"TtjXrJyvPkG3xsbkw\"," + + "\"sort\":1," + + "\"archived\":false," + + "\"createdAt\":\"2019-11-11T20:34:57.649Z\"," + + "\"updatedAt\":\"2019-11-12T13:56:13.844Z\"," + + "\"modifiedAt\":\"2019-11-12T13:56:13.844Z\"," + + "\"type\":\"swimlane\"," + + "\"color\":\"navy\"" + + "}"; +}