diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 848b885a..32054b53 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -26,8 +26,8 @@ jobs: cache: gradle - name: Grant execute permission for gradlew run: chmod +x gradlew - - name: Meilisearch (v0.29.3 version) setup with Docker - run: docker run -d -p 7700:7700 getmeili/meilisearch:v0.29.3 meilisearch --no-analytics --master-key='masterKey' + - name: Meilisearch (v0.30.5 version) setup with Docker + run: docker run -d -p 7700:7700 getmeili/meilisearch:v0.30.5 meilisearch --no-analytics --master-key='masterKey' - name: Build and run unit and integration tests run: ./gradlew build integrationTest - name: Archive test report diff --git a/README.md b/README.md index 94c4af33..50dfe81d 100644 --- a/README.md +++ b/README.md @@ -263,7 +263,7 @@ Client client = new Client(config); ## 🤖 Compatibility with Meilisearch -This package only guarantees compatibility with the [version v0.29.0 of Meilisearch](https://github.com/meilisearch/meilisearch/releases/tag/v0.29.0). +This package only guarantees compatibility with the [version v0.30.0 of Meilisearch](https://github.com/meilisearch/meilisearch/releases/tag/v0.30.0). ## 💡 Learn more diff --git a/src/main/java/com/meilisearch/sdk/Client.java b/src/main/java/com/meilisearch/sdk/Client.java index 33d624a7..3e7ba0c9 100644 --- a/src/main/java/com/meilisearch/sdk/Client.java +++ b/src/main/java/com/meilisearch/sdk/Client.java @@ -7,12 +7,15 @@ import com.auth0.jwt.algorithms.Algorithm; import com.meilisearch.sdk.exceptions.MeilisearchException; import com.meilisearch.sdk.json.JsonHandler; +import com.meilisearch.sdk.model.CancelTasksQuery; +import com.meilisearch.sdk.model.DeleteTasksQuery; import com.meilisearch.sdk.model.IndexesQuery; import com.meilisearch.sdk.model.Key; import com.meilisearch.sdk.model.KeyUpdate; import com.meilisearch.sdk.model.KeysQuery; import com.meilisearch.sdk.model.Results; import com.meilisearch.sdk.model.Stats; +import com.meilisearch.sdk.model.SwapIndexesParams; import com.meilisearch.sdk.model.Task; import com.meilisearch.sdk.model.TaskInfo; import com.meilisearch.sdk.model.TasksQuery; @@ -175,6 +178,18 @@ public TaskInfo deleteIndex(String uid) throws MeilisearchException { return this.indexesHandler.deleteIndex(uid); } + /** + * Swap the documents, settings, and task history of two or more indexes + * https://docs.meilisearch.com/reference/api/indexes.html#swap-indexes + * + * @param param accepted by the swap-indexes route + * @return Meilisearch API response as TaskInfo + * @throws MeilisearchException if an error occurs + */ + public TaskInfo swapIndexes(SwapIndexesParams[] param) throws MeilisearchException { + return config.httpClient.post("/swap-indexes", param, TaskInfo.class); + } + /** * Triggers the creation of a Meilisearch dump. * https://docs.meilisearch.com/reference/api/dump.html#create-a-dump @@ -264,6 +279,30 @@ public TasksResults getTasks(TasksQuery param) throws MeilisearchException { return this.tasksHandler.getTasks(param); } + /** + * Cancel any number of enqueued or processing tasks + * https://docs.meilisearch.com/reference/api/tasks.html#cancel-tasks + * + * @param param accept by the tasks route + * @return Meilisearch API response as TaskInfo + * @throws MeilisearchException if an error occurs + */ + public TaskInfo cancelTasks(CancelTasksQuery param) throws MeilisearchException { + return this.tasksHandler.cancelTasks(param); + } + + /** + * Delete a finished (succeeded, failed, or canceled) task + * https://docs.meilisearch.com/reference/api/tasks.html#delete-tasks + * + * @param param accept by the tasks route + * @return Meilisearch API response as TaskInfo + * @throws MeilisearchException if an error occurs + */ + public TaskInfo deleteTasks(DeleteTasksQuery param) throws MeilisearchException { + return this.tasksHandler.deleteTasks(param); + } + /** * Waits for a task to be processed * diff --git a/src/main/java/com/meilisearch/sdk/Index.java b/src/main/java/com/meilisearch/sdk/Index.java index 91ad9515..de31e0de 100644 --- a/src/main/java/com/meilisearch/sdk/Index.java +++ b/src/main/java/com/meilisearch/sdk/Index.java @@ -6,6 +6,7 @@ import com.meilisearch.sdk.model.IndexStats; import com.meilisearch.sdk.model.Results; import com.meilisearch.sdk.model.SearchResult; +import com.meilisearch.sdk.model.Searchable; import com.meilisearch.sdk.model.Settings; import com.meilisearch.sdk.model.Task; import com.meilisearch.sdk.model.TaskInfo; @@ -345,7 +346,7 @@ public SearchResult search(String q) throws MeilisearchException { * @return Meilisearch API response * @throws MeilisearchException if an error occurs */ - public SearchResult search(SearchRequest searchRequest) throws MeilisearchException { + public Searchable search(SearchRequest searchRequest) throws MeilisearchException { return this.search.search(this.uid, searchRequest); } diff --git a/src/main/java/com/meilisearch/sdk/Search.java b/src/main/java/com/meilisearch/sdk/Search.java index de5862c6..d2a9e2ca 100644 --- a/src/main/java/com/meilisearch/sdk/Search.java +++ b/src/main/java/com/meilisearch/sdk/Search.java @@ -2,6 +2,8 @@ import com.meilisearch.sdk.exceptions.MeilisearchException; import com.meilisearch.sdk.model.SearchResult; +import com.meilisearch.sdk.model.SearchResultPaginated; +import com.meilisearch.sdk.model.Searchable; /** * Class used for searching on Meilisearch indexes @@ -67,7 +69,10 @@ SearchResult search(String uid, String q) throws MeilisearchException { * @return search results * @throws MeilisearchException Search Exception or Client Error */ - SearchResult search(String uid, SearchRequest sr) throws MeilisearchException { + Searchable search(String uid, SearchRequest sr) throws MeilisearchException { + if (sr != null && (sr.getPage() != null || sr.getHitsPerPage() != null)) { + return httpClient.jsonHandler.decode(rawSearch(uid, sr), SearchResultPaginated.class); + } return httpClient.jsonHandler.decode(rawSearch(uid, sr), SearchResult.class); } } diff --git a/src/main/java/com/meilisearch/sdk/SearchRequest.java b/src/main/java/com/meilisearch/sdk/SearchRequest.java index 2a7ebf50..825f9762 100644 --- a/src/main/java/com/meilisearch/sdk/SearchRequest.java +++ b/src/main/java/com/meilisearch/sdk/SearchRequest.java @@ -34,6 +34,8 @@ public class SearchRequest { private Boolean showMatchesPosition; private String[] facets; private String[] sort; + protected Integer page; + protected Integer hitsPerPage; /** * Constructor for SearchRequest for building search queries with the default values: offset: 0, @@ -85,6 +87,8 @@ public String toString() { .put("showMatchesPosition", this.showMatchesPosition) .put("facets", this.facets) .put("sort", this.sort) + .put("page", this.page) + .put("hitsPerPage", this.hitsPerPage) .putOpt("attributesToCrop", this.attributesToCrop) .putOpt("attributesToHighlight", this.attributesToHighlight) .putOpt("filter", this.filter) diff --git a/src/main/java/com/meilisearch/sdk/TasksHandler.java b/src/main/java/com/meilisearch/sdk/TasksHandler.java index 637aaf10..9471e797 100644 --- a/src/main/java/com/meilisearch/sdk/TasksHandler.java +++ b/src/main/java/com/meilisearch/sdk/TasksHandler.java @@ -3,7 +3,10 @@ import com.meilisearch.sdk.exceptions.MeilisearchException; import com.meilisearch.sdk.exceptions.MeilisearchTimeoutException; import com.meilisearch.sdk.http.URLBuilder; +import com.meilisearch.sdk.model.CancelTasksQuery; +import com.meilisearch.sdk.model.DeleteTasksQuery; import com.meilisearch.sdk.model.Task; +import com.meilisearch.sdk.model.TaskInfo; import com.meilisearch.sdk.model.TasksQuery; import com.meilisearch.sdk.model.TasksResults; import java.util.Date; @@ -88,18 +91,40 @@ TasksResults getTasks(String indexUid) throws MeilisearchException { * @throws MeilisearchException if client request causes an error */ TasksResults getTasks(String indexUid, TasksQuery param) throws MeilisearchException { - String[] newIndexUid = new String[param.getIndexUid().length + 1]; - if (param != null && param.getIndexUid() != null) { - for (int i = 0; i < param.getIndexUid().length; i++) - newIndexUid[i] = param.getIndexUid()[i]; - newIndexUid[param.getIndexUid().length] = indexUid; - } + param = addIndexUidToQuery(indexUid, param); TasksResults result = httpClient.get(tasksPath().addQuery(param.toQuery()).getURL(), TasksResults.class); return result; } + /** + * Delete tasks from the client + * + * @param param accept by the tasks route + * @return Meilisearch API response as TaskInfo + * @throws MeilisearchException if client request causes an error + */ + TaskInfo cancelTasks(CancelTasksQuery param) throws MeilisearchException { + URLBuilder urlb = tasksPath().addSubroute("cancel"); + TaskInfo result = + httpClient.post(urlb.addQuery(param.toQuery()).getURL(), null, TaskInfo.class); + return result; + } + + /** + * Delete tasks from the client + * + * @param param accept by the tasks route + * @return Meilisearch API response as TaskInfo + * @throws MeilisearchException if client request causes an error + */ + TaskInfo deleteTasks(DeleteTasksQuery param) throws MeilisearchException { + TaskInfo result = + httpClient.delete(tasksPath().addQuery(param.toQuery()).getURL(), TaskInfo.class); + return result; + } + /** * Waits for a task to be processed * @@ -143,4 +168,20 @@ void waitForTask(int taskUid, int timeoutInMs, int intervalInMs) throws Meilisea private URLBuilder tasksPath() { return new URLBuilder("/tasks"); } + + /** Add index uid to index uids list in task query */ + TasksQuery addIndexUidToQuery(String indexUid, TasksQuery param) { + if (param != null && param.getIndexUids() != null) { + String[] newIndexUid = new String[param.getIndexUids().length + 1]; + for (int i = 0; i < param.getIndexUids().length; i++) + newIndexUid[i] = param.getIndexUids()[i]; + newIndexUid[param.getIndexUids().length] = indexUid; + param.setIndexUids(newIndexUid); + } else if (param != null) { + param.setIndexUids(new String[] {indexUid}); + } else { + param = new TasksQuery().setIndexUids(new String[] {indexUid}); + } + return param; + } } diff --git a/src/main/java/com/meilisearch/sdk/http/URLBuilder.java b/src/main/java/com/meilisearch/sdk/http/URLBuilder.java index 180f33e6..d7ffc325 100644 --- a/src/main/java/com/meilisearch/sdk/http/URLBuilder.java +++ b/src/main/java/com/meilisearch/sdk/http/URLBuilder.java @@ -1,5 +1,8 @@ package com.meilisearch.sdk.http; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; import lombok.Getter; @Getter @@ -52,6 +55,27 @@ public URLBuilder addParameter(String parameter, String[] value) { return this; } + public URLBuilder addParameter(String parameter, int[] value) { + if (value != null && value.length > 0) { + addSeparator(); + params.append(parameter); + params.append("="); + params.append(formatArrayParameters(value)); + } + return this; + } + + public URLBuilder addParameter(String parameter, Date value) { + if (value != null) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + addSeparator(); + params.append(parameter); + params.append("="); + params.append(formatter.format(value)); + } + return this; + } + public URLBuilder addQuery(String query) { this.params.append(query); return this; @@ -70,6 +94,11 @@ private String formatArrayParameters(String[] fields) { return String.join(",", fields); } + private String formatArrayParameters(int[] fields) { + String[] arr = Arrays.stream(fields).mapToObj(String::valueOf).toArray(String[]::new); + return String.join(",", arr); + } + public String getURL() { return routes.toString() + params.toString(); } diff --git a/src/main/java/com/meilisearch/sdk/model/CancelTasksQuery.java b/src/main/java/com/meilisearch/sdk/model/CancelTasksQuery.java new file mode 100644 index 00000000..d78382df --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/model/CancelTasksQuery.java @@ -0,0 +1,42 @@ +package com.meilisearch.sdk.model; + +import com.meilisearch.sdk.http.URLBuilder; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + * Data structure of a query parameter for tasks route + * + *

https://docs.meilisearch.com/reference/api/tasks.html#query-parameters + */ +@Setter +@Getter +@Accessors(chain = true) +public class CancelTasksQuery { + private int[] uids; + private String[] statuses; + private String[] types; + private String[] indexUids; + private Date beforeEnqueuedAt; + private Date afterEnqueuedAt; + private Date beforeStartedAt; + private Date afterStartedAt; + + public CancelTasksQuery() {} + + public String toQuery() { + URLBuilder urlb = + new URLBuilder() + .addParameter("uids", this.getUids()) + .addParameter("statuses", this.getStatuses()) + .addParameter("types", this.getTypes()) + .addParameter("indexUids", this.getIndexUids()) + .addParameter("beforeEnqueuedAt", this.getBeforeEnqueuedAt()) + .addParameter("afterEnqueuedAt", this.getAfterEnqueuedAt()) + .addParameter("beforeStartedAt", this.getBeforeStartedAt()) + .addParameter("afterStartedAt", this.getAfterStartedAt()); + return urlb.getURL(); + } +} diff --git a/src/main/java/com/meilisearch/sdk/model/DeleteTasksQuery.java b/src/main/java/com/meilisearch/sdk/model/DeleteTasksQuery.java new file mode 100644 index 00000000..607f16b3 --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/model/DeleteTasksQuery.java @@ -0,0 +1,48 @@ +package com.meilisearch.sdk.model; + +import com.meilisearch.sdk.http.URLBuilder; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + * Data structure of a query parameter for tasks route + * + *

https://docs.meilisearch.com/reference/api/tasks.html#query-parameters + */ +@Setter +@Getter +@Accessors(chain = true) +public class DeleteTasksQuery { + private int[] uids; + private String[] statuses; + private String[] types; + private String[] indexUids; + private int[] canceledBy; + private Date beforeEnqueuedAt; + private Date afterEnqueuedAt; + private Date beforeStartedAt; + private Date afterStartedAt; + private Date beforeFinishedAt; + private Date afterFinishedAt; + + public DeleteTasksQuery() {} + + public String toQuery() { + URLBuilder urlb = + new URLBuilder() + .addParameter("uids", this.getUids()) + .addParameter("statuses", this.getStatuses()) + .addParameter("types", this.getTypes()) + .addParameter("indexUids", this.getIndexUids()) + .addParameter("canceledBy", this.getCanceledBy()) + .addParameter("beforeEnqueuedAt", this.getBeforeEnqueuedAt()) + .addParameter("afterEnqueuedAt", this.getAfterEnqueuedAt()) + .addParameter("beforeStartedAt", this.getBeforeStartedAt()) + .addParameter("afterStartedAt", this.getAfterStartedAt()) + .addParameter("beforeFinishedAt", this.getBeforeFinishedAt()) + .addParameter("afterFinishedAt", this.getAfterFinishedAt()); + return urlb.getURL(); + } +} diff --git a/src/main/java/com/meilisearch/sdk/model/Faceting.java b/src/main/java/com/meilisearch/sdk/model/Faceting.java new file mode 100644 index 00000000..2083d59d --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/model/Faceting.java @@ -0,0 +1,12 @@ +package com.meilisearch.sdk.model; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class Faceting { + protected int maxValuesPerFacet; + + public Faceting() {} +} diff --git a/src/main/java/com/meilisearch/sdk/model/Pagination.java b/src/main/java/com/meilisearch/sdk/model/Pagination.java new file mode 100644 index 00000000..2dafc456 --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/model/Pagination.java @@ -0,0 +1,12 @@ +package com.meilisearch.sdk.model; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class Pagination { + protected int maxTotalHits; + + public Pagination() {} +} diff --git a/src/main/java/com/meilisearch/sdk/model/SearchResult.java b/src/main/java/com/meilisearch/sdk/model/SearchResult.java index 2e8c0ced..2bbc3d1a 100644 --- a/src/main/java/com/meilisearch/sdk/model/SearchResult.java +++ b/src/main/java/com/meilisearch/sdk/model/SearchResult.java @@ -1,26 +1,25 @@ package com.meilisearch.sdk.model; -import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import lombok.Getter; import lombok.ToString; /** - * Meilisearch search response data structure + * Meilisearch search response data structure for infinite pagination * *

https://docs.meilisearch.com/references/search.html */ @Getter @ToString -public class SearchResult implements Serializable { - protected ArrayList> hits; - protected int offset; - protected int limit; - protected int estimatedTotalHits; - protected Object facetDistribution; - protected int processingTimeMs; - protected String query; +public class SearchResult implements Searchable { + ArrayList> hits; + Object facetDistribution; + int processingTimeMs; + String query; + int offset; + int limit; + int estimatedTotalHits; public SearchResult() {} } diff --git a/src/main/java/com/meilisearch/sdk/model/SearchResultPaginated.java b/src/main/java/com/meilisearch/sdk/model/SearchResultPaginated.java new file mode 100644 index 00000000..e492bb9a --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/model/SearchResultPaginated.java @@ -0,0 +1,26 @@ +package com.meilisearch.sdk.model; + +import java.util.ArrayList; +import java.util.HashMap; +import lombok.Getter; +import lombok.ToString; + +/** + * Meilisearch search response data structure for limited pagination + * + *

https://docs.meilisearch.com/learn/advanced/pagination.html#numbered-page-selectors + */ +@Getter +@ToString +public class SearchResultPaginated implements Searchable { + protected int totalHits; + protected int hitsPerPage; + protected int page; + protected int totalPages; + ArrayList> hits; + Object facetDistribution; + int processingTimeMs; + String query; + + public SearchResultPaginated() {} +} diff --git a/src/main/java/com/meilisearch/sdk/model/Searchable.java b/src/main/java/com/meilisearch/sdk/model/Searchable.java new file mode 100644 index 00000000..f11b21ae --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/model/Searchable.java @@ -0,0 +1,19 @@ +package com.meilisearch.sdk.model; + +import java.util.ArrayList; +import java.util.HashMap; + +/** + * Meilisearch search common response data structure + * + *

https://docs.meilisearch.com/references/search.html + */ +public interface Searchable { + ArrayList> getHits(); + + Object getFacetDistribution(); + + int getProcessingTimeMs(); + + String getQuery(); +} diff --git a/src/main/java/com/meilisearch/sdk/model/SwapIndexesParams.java b/src/main/java/com/meilisearch/sdk/model/SwapIndexesParams.java new file mode 100644 index 00000000..53229791 --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/model/SwapIndexesParams.java @@ -0,0 +1,15 @@ +package com.meilisearch.sdk.model; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** Swap Indexes Params data structure */ +@Getter +@Setter +@Accessors(chain = true) +public class SwapIndexesParams { + protected String[] indexes; + + public SwapIndexesParams() {} +} diff --git a/src/main/java/com/meilisearch/sdk/model/TaskDetails.java b/src/main/java/com/meilisearch/sdk/model/TaskDetails.java index f97b8a1d..65ce7921 100644 --- a/src/main/java/com/meilisearch/sdk/model/TaskDetails.java +++ b/src/main/java/com/meilisearch/sdk/model/TaskDetails.java @@ -19,6 +19,15 @@ public class TaskDetails { protected Map synonyms; protected String distinctAttribute; protected TypoTolerance typoTolerance; + protected int providedIds; + protected Pagination pagination; + protected Faceting faceting; + protected String dumpUid; + protected int matchedTasks; + protected int canceledTasks; + protected String originalFilter; + protected int deletedTasks; + protected SwapIndexesParams[] swaps; public TaskDetails() {} } diff --git a/src/main/java/com/meilisearch/sdk/model/TaskInfo.java b/src/main/java/com/meilisearch/sdk/model/TaskInfo.java index dde50fc6..c8d23141 100644 --- a/src/main/java/com/meilisearch/sdk/model/TaskInfo.java +++ b/src/main/java/com/meilisearch/sdk/model/TaskInfo.java @@ -1,6 +1,5 @@ package com.meilisearch.sdk.model; -import com.meilisearch.sdk.TaskError; import java.util.Date; import lombok.Getter; @@ -15,12 +14,7 @@ public class TaskInfo { protected int taskUid = 0; protected String indexUid = ""; protected String type = null; - protected String duration = ""; protected Date enqueuedAt = null; - protected Date startedAt = null; - protected Date finishedAt = null; - protected TaskError error = null; - protected TaskDetails details = null; public TaskInfo() {} } diff --git a/src/main/java/com/meilisearch/sdk/model/TasksQuery.java b/src/main/java/com/meilisearch/sdk/model/TasksQuery.java index 43326615..312656c2 100644 --- a/src/main/java/com/meilisearch/sdk/model/TasksQuery.java +++ b/src/main/java/com/meilisearch/sdk/model/TasksQuery.java @@ -1,6 +1,7 @@ package com.meilisearch.sdk.model; import com.meilisearch.sdk.http.URLBuilder; +import java.util.Date; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -14,11 +15,19 @@ @Getter @Accessors(chain = true) public class TasksQuery { + private int[] uids; private int limit = -1; private int from = -1; - private String[] status; - private String[] type; - private String[] indexUid; + private String[] statuses; + private String[] types; + private String[] indexUids; + private int[] canceledBy; + private Date beforeEnqueuedAt; + private Date afterEnqueuedAt; + private Date beforeStartedAt; + private Date afterStartedAt; + private Date beforeFinishedAt; + private Date afterFinishedAt; public TasksQuery() {} @@ -27,9 +36,17 @@ public String toQuery() { new URLBuilder() .addParameter("limit", this.getLimit()) .addParameter("from", this.getFrom()) - .addParameter("status", this.getStatus()) - .addParameter("type", this.getType()) - .addParameter("indexUid", this.getIndexUid()); + .addParameter("uids", this.getUids()) + .addParameter("statuses", this.getStatuses()) + .addParameter("types", this.getTypes()) + .addParameter("indexUids", this.getIndexUids()) + .addParameter("canceledBy", this.getCanceledBy()) + .addParameter("beforeEnqueuedAt", this.getBeforeEnqueuedAt()) + .addParameter("afterEnqueuedAt", this.getAfterEnqueuedAt()) + .addParameter("beforeStartedAt", this.getBeforeStartedAt()) + .addParameter("afterStartedAt", this.getAfterStartedAt()) + .addParameter("beforeFinishedAt", this.getBeforeFinishedAt()) + .addParameter("afterFinishedAt", this.getAfterFinishedAt()); return urlb.getURL(); } } diff --git a/src/test/java/com/meilisearch/integration/ClientTest.java b/src/test/java/com/meilisearch/integration/ClientTest.java index d867f152..8a2cf4d1 100644 --- a/src/test/java/com/meilisearch/integration/ClientTest.java +++ b/src/test/java/com/meilisearch/integration/ClientTest.java @@ -11,6 +11,7 @@ import com.meilisearch.sdk.exceptions.MeilisearchApiException; import com.meilisearch.sdk.model.IndexesQuery; import com.meilisearch.sdk.model.Results; +import com.meilisearch.sdk.model.SwapIndexesParams; import com.meilisearch.sdk.model.Task; import com.meilisearch.sdk.model.TaskInfo; import com.meilisearch.sdk.utils.Movie; @@ -220,6 +221,39 @@ public void testDeleteIndex() throws Exception { assertThrows(MeilisearchApiException.class, () -> client.getIndex(indexUid)); } + /** Test swapIndexes */ + @Test + public void testSwapIndexes() throws Exception { + String indexUidA = "IndexA"; + String indexUidB = "IndexB"; + Index indexA = createEmptyIndex(indexUidA); + Index indexB = createEmptyIndex(indexUidB); + TaskInfo taskAddDocumentIndexA = + indexA.addDocuments( + "[{" + + "\"id\": 1," + + "\"title\": \"Document1\"" + + "}," + + "{" + + "\"id\": 2," + + "\"title\": \"Document2\"" + + "}]"); + indexA.waitForTask(taskAddDocumentIndexA.getTaskUid()); + + SwapIndexesParams[] params = + new SwapIndexesParams[] { + new SwapIndexesParams().setIndexes(new String[] {indexUidA, indexUidB}) + }; + TaskInfo task = client.swapIndexes(params); + client.waitForTask(task.getTaskUid()); + + assertEquals("indexSwap", task.getType()); + assertEquals("Document1", indexB.getDocument("1", Movie.class).getTitle()); + assertEquals("Document2", indexB.getDocument("2", Movie.class).getTitle()); + assertThrows(MeilisearchApiException.class, () -> indexA.getDocument("1", Movie.class)); + assertThrows(MeilisearchApiException.class, () -> indexA.getDocument("2", Movie.class)); + } + /** Test call to index method with an inexistent index */ @Test public void testIndexMethodCallInexistentIndex() throws Exception { diff --git a/src/test/java/com/meilisearch/integration/SearchTest.java b/src/test/java/com/meilisearch/integration/SearchTest.java index 819eec77..d2eead4c 100644 --- a/src/test/java/com/meilisearch/integration/SearchTest.java +++ b/src/test/java/com/meilisearch/integration/SearchTest.java @@ -11,6 +11,8 @@ import com.meilisearch.sdk.json.GsonJsonHandler; import com.meilisearch.sdk.model.MatchingStrategy; import com.meilisearch.sdk.model.SearchResult; +import com.meilisearch.sdk.model.SearchResultPaginated; +import com.meilisearch.sdk.model.Searchable; import com.meilisearch.sdk.model.Settings; import com.meilisearch.sdk.model.TaskInfo; import com.meilisearch.sdk.utils.Movie; @@ -78,7 +80,7 @@ public void testSearchOffset() throws Exception { index.waitForTask(task.getTaskUid()); SearchRequest searchRequest = SearchRequest.builder().q("a").offset(20).build(); - SearchResult searchResult = index.search(searchRequest); + SearchResult searchResult = (SearchResult) index.search(searchRequest); assertEquals(10, searchResult.getHits().size()); assertEquals(30, searchResult.getEstimatedTotalHits()); @@ -96,7 +98,7 @@ public void testSearchLimit() throws Exception { index.waitForTask(task.getTaskUid()); SearchRequest searchRequest = SearchRequest.builder().q("a").limit(2).build(); - SearchResult searchResult = index.search(searchRequest); + SearchResult searchResult = (SearchResult) index.search(searchRequest); assertEquals(2, searchResult.getHits().size()); assertEquals(30, searchResult.getEstimatedTotalHits()); @@ -246,7 +248,7 @@ public void testSearchWithMatchingStrategy() throws Exception { SearchRequest searchRequest = SearchRequest.builder().q("and").matchingStrategy(MatchingStrategy.ALL).build(); - SearchResult searchResult = index.search(searchRequest); + SearchResult searchResult = (SearchResult) index.search(searchRequest); assertEquals(20, searchResult.getHits().size()); assertEquals(21, searchResult.getEstimatedTotalHits()); @@ -344,7 +346,7 @@ public void testSearchFacetsDistribution() throws Exception { SearchRequest searchRequest = new SearchRequest("knight").setFacets(new String[] {"*"}); - SearchResult searchResult = index.search(searchRequest); + Searchable searchResult = index.search(searchRequest); assertEquals(1, searchResult.getHits().size()); assertNotNull(searchResult.getFacetDistribution()); @@ -484,11 +486,53 @@ public void testSearchMatches() throws Exception { index.waitForTask(task.getTaskUid()); SearchRequest searchRequest = new SearchRequest("and").setShowMatchesPosition(true); - SearchResult searchResult = index.search(searchRequest); + Searchable searchResult = index.search(searchRequest); assertEquals(20, searchResult.getHits().size()); } + /** Test search page */ + @Test + public void testSearchPage() throws Exception { + String indexUid = "SearchOffset"; + Index index = client.index(indexUid); + + TestData testData = this.getTestData(MOVIES_INDEX, Movie.class); + TaskInfo task = index.addDocuments(testData.getRaw()); + + index.waitForTask(task.getTaskUid()); + + SearchRequest searchRequest = SearchRequest.builder().q("a").page(1).build(); + SearchResultPaginated searchResult = (SearchResultPaginated) index.search(searchRequest); + + assertEquals(20, searchResult.getHits().size()); + assertEquals(1, searchResult.getPage()); + assertEquals(20, searchResult.getHitsPerPage()); + assertEquals(30, searchResult.getTotalHits()); + assertEquals(2, searchResult.getTotalPages()); + } + + /** Test search pagination */ + @Test + public void testSearchPagination() throws Exception { + String indexUid = "SearchOffset"; + Index index = client.index(indexUid); + + TestData testData = this.getTestData(MOVIES_INDEX, Movie.class); + TaskInfo task = index.addDocuments(testData.getRaw()); + + index.waitForTask(task.getTaskUid()); + + SearchRequest searchRequest = SearchRequest.builder().q("a").page(2).hitsPerPage(2).build(); + SearchResultPaginated searchResult = (SearchResultPaginated) index.search(searchRequest); + + assertEquals(2, searchResult.getHits().size()); + assertEquals(2, searchResult.getPage()); + assertEquals(2, searchResult.getHitsPerPage()); + assertEquals(30, searchResult.getTotalHits()); + assertEquals(15, searchResult.getTotalPages()); + } + /** Test place holder search */ @Test public void testPlaceHolder() throws Exception { @@ -499,7 +543,7 @@ public void testPlaceHolder() throws Exception { TaskInfo task = index.addDocuments(testData.getRaw()); index.waitForTask(task.getTaskUid()); - SearchResult result = index.search(""); + SearchResult result = (SearchResult) index.search(""); assertEquals(20, result.getLimit()); } @@ -514,7 +558,7 @@ public void testPlaceHolderWithLimit() throws Exception { TaskInfo task = index.addDocuments(testData.getRaw()); index.waitForTask(task.getTaskUid()); - SearchResult searchResult = index.search(new SearchRequest(null).setLimit(10)); + Searchable searchResult = index.search(new SearchRequest(null).setLimit(10)); assertEquals(10, searchResult.getHits().size()); } diff --git a/src/test/java/com/meilisearch/integration/TasksTest.java b/src/test/java/com/meilisearch/integration/TasksTest.java index 829a14f8..1b60017c 100644 --- a/src/test/java/com/meilisearch/integration/TasksTest.java +++ b/src/test/java/com/meilisearch/integration/TasksTest.java @@ -5,11 +5,14 @@ import com.meilisearch.integration.classes.AbstractIT; import com.meilisearch.integration.classes.TestData; import com.meilisearch.sdk.Index; +import com.meilisearch.sdk.model.CancelTasksQuery; +import com.meilisearch.sdk.model.DeleteTasksQuery; import com.meilisearch.sdk.model.Task; import com.meilisearch.sdk.model.TaskInfo; import com.meilisearch.sdk.model.TasksQuery; import com.meilisearch.sdk.model.TasksResults; import com.meilisearch.sdk.utils.Movie; +import java.util.Date; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; @@ -98,6 +101,43 @@ public void testClientGetTasksLimitAndFrom() throws Exception { assertNotNull(result.getResults().length); } + /** Test Get Tasks with uid as filter */ + @Test + public void testClientGetTasksWithUidFilter() throws Exception { + TasksQuery query = new TasksQuery().setUids(new int[] {1}); + TasksResults result = client.getTasks(query); + + assertNotNull(result.getLimit()); + assertNotNull(result.getFrom()); + assertNotNull(result.getNext()); + assertNotNull(result.getResults().length); + } + + /** Test Get Tasks with beforeEnqueuedAt as filter */ + @Test + public void testClientGetTasksWithDateFilter() throws Exception { + Date date = new Date(); + TasksQuery query = new TasksQuery().setBeforeEnqueuedAt(date); + TasksResults result = client.getTasks(query); + + assertNotNull(result.getLimit()); + assertNotNull(result.getFrom()); + assertNotNull(result.getNext()); + assertNotNull(result.getResults().length); + } + + /** Test Get Tasks with canceledBy as filter */ + @Test + public void testClientGetTasksWithCanceledByFilter() throws Exception { + TasksQuery query = new TasksQuery().setCanceledBy(new int[] {1}); + TasksResults result = client.getTasks(query); + + assertNotNull(result.getLimit()); + assertNotNull(result.getFrom()); + assertNotNull(result.getNext()); + assertNotNull(result.getResults().length); + } + /** Test Get Tasks with all query parameters */ @Test public void testClientGetTasksAllQueryParameters() throws Exception { @@ -107,14 +147,86 @@ public void testClientGetTasksAllQueryParameters() throws Exception { new TasksQuery() .setLimit(limit) .setFrom(from) - .setStatus(new String[] {"enqueued", "succeeded"}) - .setType(new String[] {"indexDeletion"}); + .setStatuses(new String[] {"enqueued", "succeeded"}) + .setTypes(new String[] {"indexDeletion"}); TasksResults result = client.getTasks(query); - Task[] tasks = result.getResults(); assertEquals(limit, result.getLimit()); assertNotNull(result.getFrom()); assertNotNull(result.getNext()); + assertNotNull(result.getResults().length); + } + + /** Test Cancel Task */ + @Test + public void testClientCancelTask() throws Exception { + CancelTasksQuery query = + new CancelTasksQuery().setStatuses(new String[] {"enqueued", "succeeded"}); + + TaskInfo task = client.cancelTasks(query); + + assertTrue(task instanceof TaskInfo); + assertNotNull(task.getStatus()); + assertNotEquals("", task.getStatus()); + assertNull(task.getIndexUid()); + assertEquals("taskCancelation", task.getType()); + } + + /** Test Cancel Task with multiple filters */ + @Test + public void testClientCancelTaskWithMultipleFilters() throws Exception { + Date date = new Date(); + CancelTasksQuery query = + new CancelTasksQuery() + .setUids(new int[] {0, 1, 2}) + .setStatuses(new String[] {"enqueued", "succeeded"}) + .setTypes(new String[] {"indexDeletion"}) + .setIndexUids(new String[] {"index"}) + .setBeforeEnqueuedAt(date); + + TaskInfo task = client.cancelTasks(query); + + assertTrue(task instanceof TaskInfo); + assertNotNull(task.getStatus()); + assertNotEquals("", task.getStatus()); + assertNull(task.getIndexUid()); + assertEquals("taskCancelation", task.getType()); + } + + /** Test Delete Task */ + @Test + public void testClientDeleteTask() throws Exception { + DeleteTasksQuery query = + new DeleteTasksQuery().setStatuses(new String[] {"enqueued", "succeeded"}); + + TaskInfo task = client.deleteTasks(query); + + assertTrue(task instanceof TaskInfo); + assertNotNull(task.getStatus()); + assertNotEquals("", task.getStatus()); + assertNull(task.getIndexUid()); + assertEquals("taskDeletion", task.getType()); + } + + /** Test Delete Task with multiple filters */ + @Test + public void testClientDeleteTaskWithMultipleFilters() throws Exception { + Date date = new Date(); + DeleteTasksQuery query = + new DeleteTasksQuery() + .setUids(new int[] {0, 1, 2}) + .setStatuses(new String[] {"enqueued", "succeeded"}) + .setTypes(new String[] {"indexDeletion"}) + .setIndexUids(new String[] {"index"}) + .setBeforeEnqueuedAt(date); + + TaskInfo task = client.deleteTasks(query); + + assertTrue(task instanceof TaskInfo); + assertNotNull(task.getStatus()); + assertNotEquals("", task.getStatus()); + assertNull(task.getIndexUid()); + assertEquals("taskDeletion", task.getType()); } /** Test waitForTask */ diff --git a/src/test/java/com/meilisearch/sdk/SearchRequestTest.java b/src/test/java/com/meilisearch/sdk/SearchRequestTest.java index 0ed4c330..cb2b63d8 100644 --- a/src/test/java/com/meilisearch/sdk/SearchRequestTest.java +++ b/src/test/java/com/meilisearch/sdk/SearchRequestTest.java @@ -85,10 +85,17 @@ void toStringQueryLimitOffsetAndAttributesToRetrieveWithBuilder() { @Test void toStringQueryLimitOffsetAndPageAndHitPerPage() { SearchRequest classToTest = - SearchRequest.builder().q("This is a Test").limit(20).offset(0).build(); + SearchRequest.builder() + .q("This is a Test") + .limit(20) + .offset(0) + .page(10) + .hitsPerPage(2) + .build(); assertEquals( - "{\"q\":\"This is a Test\",\"offset\":0,\"limit\":20}", classToTest.toString()); + "{\"q\":\"This is a Test\",\"offset\":0,\"hitsPerPage\":2,\"limit\":20,\"page\":10}", + classToTest.toString()); } @Test @@ -103,7 +110,9 @@ void toStringEveryParameters() { .setCropLength(900) .setFilter(new String[] {"test='test'"}) .setFacets(new String[] {"facets"}) - .setSort(new String[] {"sort"}); + .setSort(new String[] {"sort"}) + .setPage(10) + .setHitsPerPage(2); assertEquals("This is a Test", classToTest.getQ()); assertEquals(200, classToTest.getOffset()); @@ -120,6 +129,8 @@ void toStringEveryParameters() { assertEquals("facets", classToTest.getFacets()[0]); assertEquals("sort", classToTest.getSort()[0]); assertEquals(900, classToTest.getCropLength()); + assertEquals(10, classToTest.getPage()); + assertEquals(2, classToTest.getHitsPerPage()); } @Test @@ -136,6 +147,8 @@ void toStringEveryParametersWithBuilder() { .filter(new String[] {"test='test'"}) .facets(new String[] {"facets"}) .sort(new String[] {"sort"}) + .page(10) + .hitsPerPage(2) .build(); assertEquals("This is a Test", classToTest.getQ()); @@ -153,6 +166,8 @@ void toStringEveryParametersWithBuilder() { assertEquals("facets", classToTest.getFacets()[0]); assertEquals("sort", classToTest.getSort()[0]); assertEquals(900, classToTest.getCropLength()); + assertEquals(10, classToTest.getPage()); + assertEquals(2, classToTest.getHitsPerPage()); } @Test @@ -175,7 +190,9 @@ void toStringEveryParametersWithArray() { }) .setShowMatchesPosition(true) .setFacets(new String[] {"facets"}) - .setSort(new String[] {"sort"}); + .setSort(new String[] {"sort"}) + .setPage(0) + .setHitsPerPage(0); assertEquals("This is a Test", classToTest.getQ()); assertEquals(200, classToTest.getOffset()); @@ -194,8 +211,10 @@ void toStringEveryParametersWithArray() { assertEquals("facets", classToTest.getFacets()[0]); assertEquals("sort", classToTest.getSort()[0]); assertEquals(900, classToTest.getCropLength()); + assertEquals(0, classToTest.getPage()); + assertEquals(0, classToTest.getHitsPerPage()); assertEquals( - "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"matchingStrategy\":\"all\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"attributesToCrop\":[\"crop\"]}", + "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"hitsPerPage\":0,\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"matchingStrategy\":\"all\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"page\":0,\"attributesToCrop\":[\"crop\"]}", classToTest.toString()); } @@ -221,6 +240,8 @@ void toStringEveryParametersWithArrayWithBuilder() { .showMatchesPosition(true) .facets(new String[] {"facets"}) .sort(new String[] {"sort"}) + .page(0) + .hitsPerPage(0) .build(); assertEquals("This is a Test", classToTest.getQ()); @@ -240,8 +261,10 @@ void toStringEveryParametersWithArrayWithBuilder() { assertEquals("facets", classToTest.getFacets()[0]); assertEquals("sort", classToTest.getSort()[0]); assertEquals(900, classToTest.getCropLength()); + assertEquals(0, classToTest.getPage()); + assertEquals(0, classToTest.getHitsPerPage()); assertEquals( - "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"matchingStrategy\":\"all\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"attributesToCrop\":[\"crop\"]}", + "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"hitsPerPage\":0,\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"matchingStrategy\":\"all\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"page\":0,\"attributesToCrop\":[\"crop\"]}", classToTest.toString()); } @@ -267,6 +290,8 @@ void toStringEveryParametersWithArrayMatchingStrategyNull() { .showMatchesPosition(true) .facets(new String[] {"facets"}) .sort(new String[] {"sort"}) + .page(0) + .hitsPerPage(0) .build(); assertEquals("This is a Test", classToTest.getQ()); @@ -287,7 +312,7 @@ void toStringEveryParametersWithArrayMatchingStrategyNull() { assertEquals("sort", classToTest.getSort()[0]); assertEquals(900, classToTest.getCropLength()); assertEquals( - "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"attributesToCrop\":[\"crop\"]}", + "{\"attributesToRetrieve\":[\"bubble\"],\"offset\":200,\"cropMarker\":\"123\",\"hitsPerPage\":0,\"sort\":[\"sort\"],\"highlightPreTag\":\"abc\",\"facets\":[\"facets\"],\"filter\":[[\"test='test'\"],[\"test1='test1'\"]],\"q\":\"This is a Test\",\"showMatchesPosition\":true,\"limit\":900,\"cropLength\":900,\"highlightPostTag\":\"zyx\",\"attributesToHighlight\":[\"highlight\"],\"page\":0,\"attributesToCrop\":[\"crop\"]}", classToTest.toString()); } } diff --git a/src/test/java/com/meilisearch/sdk/TaskHandlerUtilsTest.java b/src/test/java/com/meilisearch/sdk/TaskHandlerUtilsTest.java new file mode 100644 index 00000000..800619d5 --- /dev/null +++ b/src/test/java/com/meilisearch/sdk/TaskHandlerUtilsTest.java @@ -0,0 +1,56 @@ +package com.meilisearch.sdk; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.meilisearch.sdk.model.TasksQuery; +import org.junit.jupiter.api.Test; + +class TasksHandlerUtilsTest { + + @Test + void addIndexUidToQueryWithParamNull() { + final Config config = new Config("http://localhost:7700", "masterKey"); + TasksHandler classToTest = new TasksHandler(config); + TasksQuery param = null; + TasksQuery query = classToTest.addIndexUidToQuery("indexName", param); + + assertEquals("?indexUids=indexName", query.toQuery().toString()); + } + + @Test + void addIndexUidToQueryWithParam() { + final Config config = new Config("http://localhost:7700", "masterKey"); + TasksHandler classToTest = new TasksHandler(config); + TasksQuery param = new TasksQuery().setIndexUids(new String[] {}); + TasksQuery query = classToTest.addIndexUidToQuery("indexName", param); + + assertEquals("?indexUids=indexName", query.toQuery().toString()); + } + + @Test + void addIndexUidToQueryWithOneIndexUid() { + final Config config = new Config("http://localhost:7700", "masterKey"); + TasksHandler classToTest = new TasksHandler(config); + TasksQuery param = new TasksQuery().setIndexUids(new String[] {"indexName2"}); + TasksQuery query = classToTest.addIndexUidToQuery("indexName1", param); + + assertEquals("?indexUids=indexName2,indexName1", query.toQuery().toString()); + } + + @Test + void addIndexUidToQueryWithMultipleIndexUids() { + final Config config = new Config("http://localhost:7700", "masterKey"); + TasksHandler classToTest = new TasksHandler(config); + TasksQuery param = + new TasksQuery() + .setIndexUids( + new String[] { + "indexName2", "indexName3", "indexName4", "indexName5" + }); + TasksQuery query = classToTest.addIndexUidToQuery("indexName1", param); + + assertEquals( + "?indexUids=indexName2,indexName3,indexName4,indexName5,indexName1", + query.toQuery().toString()); + } +} diff --git a/src/test/java/com/meilisearch/sdk/http/URLBuilderTest.java b/src/test/java/com/meilisearch/sdk/http/URLBuilderTest.java index 7d352c68..e972672f 100644 --- a/src/test/java/com/meilisearch/sdk/http/URLBuilderTest.java +++ b/src/test/java/com/meilisearch/sdk/http/URLBuilderTest.java @@ -2,6 +2,9 @@ import static org.junit.jupiter.api.Assertions.*; +import java.text.SimpleDateFormat; +import java.time.format.DateTimeFormatter; +import java.util.Date; import org.junit.jupiter.api.Test; public class URLBuilderTest { @@ -51,7 +54,7 @@ void addParameterStringString() { } @Test - void addParameterStringArray() { + void addParameterStringStringArray() { classToTest.addParameter("parameter1", new String[] {"1", "a"}); assertEquals("?parameter1=1,a", classToTest.getParams().toString()); @@ -64,6 +67,45 @@ void addParameterStringArray() { classToTest.getParams().toString()); } + @Test + void addParameterStringIntArray() { + classToTest.addParameter("parameter1", new int[] {1, 2}); + assertEquals("?parameter1=1,2", classToTest.getParams().toString()); + + classToTest.addParameter("parameter2", new int[] {3, 4}); + assertEquals("?parameter1=1,2¶meter2=3,4", classToTest.getParams().toString()); + + classToTest.addParameter("parameter3", new int[] {5, 6}); + assertEquals( + "?parameter1=1,2¶meter2=3,4¶meter3=5,6", + classToTest.getParams().toString()); + } + + @Test + void addParameterStringDate() throws Exception { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Date date = format.parse("2042-01-30"); + + classToTest.addParameter("parameter1", date); + String parameterDate1 = + classToTest + .getParams() + .toString() + .substring(12, classToTest.getParams().toString().length()); + assertDoesNotThrow(() -> DateTimeFormatter.ISO_DATE.parse(parameterDate1)); + assertEquals("?parameter1=2042-01-30", classToTest.getParams().toString()); + + classToTest.addParameter("parameter2", date); + String parameterDate2 = + classToTest + .getParams() + .toString() + .substring(34, classToTest.getParams().toString().length()); + assertDoesNotThrow(() -> DateTimeFormatter.ISO_DATE.parse(parameterDate2)); + assertEquals( + "?parameter1=2042-01-30¶meter2=2042-01-30", classToTest.getParams().toString()); + } + @Test void getURL() { assertEquals("", classToTest.getURL());