diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a00f7cfd..c1f872759 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Mindee Java Client Library Changelog +## v5.0.0-beta2 - 2026-05-20 +### ¡Breaking Changes! +* :recycle: put error parsing in its own package +### Changes +* :sparkles: add model search API + + ## v5.0.0-beta1 - 2026-05-06 ### ¡Breaking Changes! * :coffin: Remove obsolete/unused products: diff --git a/docs/code_samples/v2_classification.txt b/docs/code_samples/v2_classification.txt index bc6b981a1..fa2e2134d 100644 --- a/docs/code_samples/v2_classification.txt +++ b/docs/code_samples/v2_classification.txt @@ -10,8 +10,8 @@ public class SimpleMindeeClientV2 { throws IOException, InterruptedException { String apiKey = "MY_API_KEY"; - String filePath = "/path/to/the/file.ext"; String modelId = "MY_MODEL_ID"; + String filePath = "/path/to/the/file.ext"; // Init a new client var mindeeClient = new MindeeClient(apiKey); @@ -38,6 +38,6 @@ public class SimpleMindeeClientV2 { // Access the classification result var result = response.getInference().getResult(); - var classification = result.getClassification(); + String documentType = result.getClassification().getDocumentType(); } } diff --git a/docs/code_samples/v2_crop.txt b/docs/code_samples/v2_crop.txt index 436894376..3f74941fd 100644 --- a/docs/code_samples/v2_crop.txt +++ b/docs/code_samples/v2_crop.txt @@ -10,8 +10,8 @@ public class SimpleMindeeClientV2 { throws IOException, InterruptedException { String apiKey = "MY_API_KEY"; - String filePath = "/path/to/the/file.ext"; String modelId = "MY_MODEL_ID"; + String filePath = "/path/to/the/file.ext"; // Init a new client var mindeeClient = new MindeeClient(apiKey); @@ -36,6 +36,6 @@ public class SimpleMindeeClientV2 { System.out.println(response.getInference().toString()); // Access the crop results - var result = response.getInference().getResult(); + var crops = response.getInference().getResult().getCrops(); } } diff --git a/docs/code_samples/v2_extraction.txt b/docs/code_samples/v2_extraction.txt index 1660c75f1..de18acbce 100644 --- a/docs/code_samples/v2_extraction.txt +++ b/docs/code_samples/v2_extraction.txt @@ -10,8 +10,8 @@ public class SimpleMindeeClientV2 { throws IOException, InterruptedException { String apiKey = "MY_API_KEY"; - String filePath = "/path/to/the/file.ext"; String modelId = "MY_MODEL_ID"; + String filePath = "/path/to/the/file.ext"; // Init a new client var mindeeClient = new MindeeClient(apiKey); diff --git a/docs/code_samples/v2_ocr.txt b/docs/code_samples/v2_ocr.txt index 56729b69f..05fdfb8f0 100644 --- a/docs/code_samples/v2_ocr.txt +++ b/docs/code_samples/v2_ocr.txt @@ -36,6 +36,6 @@ public class SimpleMindeeClientV2 { System.out.println(response.getInference().toString()); // Access the result OCR pages - var result = response.getInference().getResult(); + var pages = response.getInference().getResult().getPages(); } } diff --git a/docs/code_samples/v2_split.txt b/docs/code_samples/v2_split.txt index 7665b3dca..b84733054 100644 --- a/docs/code_samples/v2_split.txt +++ b/docs/code_samples/v2_split.txt @@ -10,8 +10,8 @@ public class SimpleMindeeClientV2 { throws IOException, InterruptedException { String apiKey = "MY_API_KEY"; - String filePath = "/path/to/the/file.ext"; String modelId = "MY_MODEL_ID"; + String filePath = "/path/to/the/file.ext"; // Init a new client var mindeeClient = new MindeeClient(apiKey); @@ -36,6 +36,6 @@ public class SimpleMindeeClientV2 { System.out.println(response.getInference().toString()); // Access the split result - var result = response.getInference().getResult(); + var splits = response.getInference().getResult().getSplits(); } } diff --git a/pom.xml b/pom.xml index f299ebf82..6b42a19da 100644 --- a/pom.xml +++ b/pom.xml @@ -372,7 +372,7 @@ - 5.0.0-beta1 + 5.0.0-beta2 diff --git a/src/main/java/com/mindee/v2/MindeeClient.java b/src/main/java/com/mindee/v2/MindeeClient.java index 744ed426d..85a3661c0 100644 --- a/src/main/java/com/mindee/v2/MindeeClient.java +++ b/src/main/java/com/mindee/v2/MindeeClient.java @@ -8,8 +8,9 @@ import com.mindee.v2.http.MindeeHttpApiV2; import com.mindee.v2.http.MindeeHttpExceptionV2; import com.mindee.v2.parsing.CommonResponse; -import com.mindee.v2.parsing.ErrorResponse; import com.mindee.v2.parsing.JobResponse; +import com.mindee.v2.parsing.error.ErrorResponse; +import com.mindee.v2.parsing.search.SearchResponse; import com.mindee.v2.product.extraction.ExtractionResponse; import java.io.IOException; @@ -172,6 +173,36 @@ public TResponse enqueueAndGetResult( return pollAndFetch(responseClass, job, pollingOptions); } + /** + * Return all models. + * + * @return an instance of {@link SearchResponse} + */ + public SearchResponse searchModels() { + return searchModels(null, null); + } + + /** + * Search for models by name. + * + * @param modelName name of the model to search for + * @return an instance of {@link SearchResponse} + */ + public SearchResponse searchModels(String modelName) { + return searchModels(modelName, null); + } + + /** + * Search for models by name and type. + * + * @param modelName name of the model to search for + * @param modelType type of the model to search for + * @return an instance of {@link SearchResponse} + */ + public SearchResponse searchModels(String modelName, String modelType) { + return mindeeApi.reqGetSearchModels(modelName, modelType); + } + /** * Common logic for polling an asynchronous job for local & url files. * diff --git a/src/main/java/com/mindee/v2/http/MindeeApiV2.java b/src/main/java/com/mindee/v2/http/MindeeApiV2.java index 178d62e00..7cd560aeb 100644 --- a/src/main/java/com/mindee/v2/http/MindeeApiV2.java +++ b/src/main/java/com/mindee/v2/http/MindeeApiV2.java @@ -6,8 +6,9 @@ import com.mindee.input.URLInputSource; import com.mindee.v2.clientoptions.BaseParameters; import com.mindee.v2.parsing.CommonResponse; -import com.mindee.v2.parsing.ErrorResponse; import com.mindee.v2.parsing.JobResponse; +import com.mindee.v2.parsing.error.ErrorResponse; +import com.mindee.v2.parsing.search.SearchResponse; import java.io.IOException; /** @@ -48,11 +49,19 @@ public abstract JobResponse reqPostEnqueue( * * @param inferenceId ID of the inference to poll. */ - abstract public TResponse reqGetResult( + public abstract TResponse reqGetResult( Class responseClass, String inferenceId ); + /** + * Retrieves a list of models. + * + * @param modelName search term for model name + * @param modelType search term for model type + */ + public abstract SearchResponse reqGetSearchModels(String modelName, String modelType); + /** * Creates an "unknown error" response from an HTTP status code. */ diff --git a/src/main/java/com/mindee/v2/http/MindeeHttpApiV2.java b/src/main/java/com/mindee/v2/http/MindeeHttpApiV2.java index 27690db04..c048655ba 100644 --- a/src/main/java/com/mindee/v2/http/MindeeHttpApiV2.java +++ b/src/main/java/com/mindee/v2/http/MindeeHttpApiV2.java @@ -8,14 +8,16 @@ import com.mindee.v2.MindeeSettings; import com.mindee.v2.clientoptions.BaseParameters; import com.mindee.v2.parsing.CommonResponse; -import com.mindee.v2.parsing.ErrorResponse; import com.mindee.v2.parsing.JobResponse; +import com.mindee.v2.parsing.error.ErrorResponse; +import com.mindee.v2.parsing.search.SearchResponse; import java.io.IOException; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import lombok.Builder; import org.apache.hc.client5.http.classic.methods.HttpGet; import org.apache.hc.client5.http.classic.methods.HttpPost; +import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase; import org.apache.hc.client5.http.config.RequestConfig; import org.apache.hc.client5.http.entity.mime.HttpMultipartMode; import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder; @@ -82,7 +84,7 @@ public JobResponse reqPostEnqueue(LocalInputSource inputSource, BaseParameters o inputSource.getFilename() ); post.setEntity(options.buildHttpBody(builder).build()); - return executeEnqueue(post); + return executeAPIRequest(post, JobResponse.class); } /** @@ -103,33 +105,7 @@ public JobResponse reqPostEnqueue(URLInputSource inputSource, BaseParameters opt builder.setMode(HttpMultipartMode.EXTENDED); builder.addTextBody("url", inputSource.getUrl().toString()); post.setEntity(options.buildHttpBody(builder).build()); - return executeEnqueue(post); - } - - /** - * Executes an enqueue action, common to URL & local inputs. - * - * @param post HTTP Post object. - * @return a valid job response. - */ - private JobResponse executeEnqueue(HttpPost post) { - try (var httpClient = httpClientBuilder.build()) { - return httpClient.execute(post, response -> { - var responseEntity = response.getEntity(); - var statusCode = response.getCode(); - if (isInvalidStatusCode(statusCode)) { - throw getHttpError(response); - } - try { - var raw = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); - return deserializeOrThrow(raw, JobResponse.class, response.getCode()); - } finally { - EntityUtils.consumeQuietly(responseEntity); - } - }); - } catch (IOException err) { - throw new MindeeException(err.getMessage(), err); - } + return executeAPIRequest(post, JobResponse.class); } @Override @@ -138,31 +114,10 @@ public JobResponse reqGetJob(String jobId) { var url = this.mindeeSettings.getBaseUrl() + "/jobs/" + jobId; var get = new HttpGet(url); - if (this.mindeeSettings.getApiKey().isPresent()) { - get.setHeader(HttpHeaders.AUTHORIZATION, this.mindeeSettings.getApiKey().get()); - } - get.setHeader(HttpHeaders.USER_AGENT, getUserAgent()); var noRedirect = RequestConfig.custom().setRedirectsEnabled(false).build(); get.setConfig(noRedirect); - try (var httpClient = httpClientBuilder.build()) { - return httpClient.execute(get, response -> { - var responseEntity = response.getEntity(); - var statusCode = response.getCode(); - if (isInvalidStatusCode(statusCode)) { - throw getHttpError(response); - } - try { - var raw = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); - - return deserializeOrThrow(raw, JobResponse.class, response.getCode()); - } finally { - EntityUtils.consumeQuietly(responseEntity); - } - }); - } catch (IOException err) { - throw new MindeeException(err.getMessage(), err); - } + return this.executeAPIRequest(get, JobResponse.class); } @Override @@ -179,25 +134,54 @@ public TResponse reqGetResult( inferenceId ); var get = new HttpGet(url); + return executeAPIRequest(get, responseClass); + } + @Override + public SearchResponse reqGetSearchModels(String modelName, String modelType) { + URIBuilder url; + try { + url = new URIBuilder(this.mindeeSettings.getBaseUrl() + "/search/models"); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + if (modelName != null) { + url.addParameter("name", modelName); + } + if (modelType != null) { + url.addParameter("type", modelType); + } + var get = new HttpGet(url.toString()); + return executeAPIRequest(get, SearchResponse.class); + } + + /** + * Executes an enqueue action, common to URL & local inputs. + * + * @param apiRequest HTTP request object. + * @return a valid job response. + */ + private TResponse executeAPIRequest( + HttpUriRequestBase apiRequest, + Class responseClass + ) { if (this.mindeeSettings.getApiKey().isPresent()) { - get.setHeader(HttpHeaders.AUTHORIZATION, this.mindeeSettings.getApiKey().get()); + apiRequest.setHeader(HttpHeaders.AUTHORIZATION, this.mindeeSettings.getApiKey().get()); } - get.setHeader(HttpHeaders.USER_AGENT, getUserAgent()); + apiRequest.setHeader(HttpHeaders.USER_AGENT, getUserAgent()); try (var httpClient = httpClientBuilder.build()) { - - return httpClient.execute(get, response -> { - var entity = response.getEntity(); - var status = response.getCode(); + return httpClient.execute(apiRequest, response -> { + var responseEntity = response.getEntity(); + var statusCode = response.getCode(); + if (isInvalidStatusCode(statusCode)) { + throw getHttpError(response); + } try { - if (isInvalidStatusCode(status)) { - throw getHttpError(response); - } - var raw = EntityUtils.toString(entity, StandardCharsets.UTF_8); - return deserializeOrThrow(raw, responseClass, status); + var raw = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); + return deserializeOrThrow(raw, responseClass, response.getCode()); } finally { - EntityUtils.consumeQuietly(entity); + EntityUtils.consumeQuietly(responseEntity); } }); } catch (IOException err) { @@ -235,11 +219,6 @@ private HttpPost buildHttpPost(String url) { catch (URISyntaxException err) { return new HttpPost("invalid URI"); } - - if (this.mindeeSettings.getApiKey().isPresent()) { - post.setHeader(HttpHeaders.AUTHORIZATION, this.mindeeSettings.getApiKey().get()); - } - post.setHeader(HttpHeaders.USER_AGENT, getUserAgent()); return post; } diff --git a/src/main/java/com/mindee/v2/parsing/Job.java b/src/main/java/com/mindee/v2/parsing/Job.java index 8d260e3fb..62414bcb5 100644 --- a/src/main/java/com/mindee/v2/parsing/Job.java +++ b/src/main/java/com/mindee/v2/parsing/Job.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.mindee.v1.parsing.common.LocalDateTimeDeserializer; +import com.mindee.v2.parsing.error.ErrorResponse; import java.time.LocalDateTime; import java.util.List; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/mindee/v2/parsing/JobWebhook.java b/src/main/java/com/mindee/v2/parsing/JobWebhook.java index fd3af5489..8e57b0b65 100644 --- a/src/main/java/com/mindee/v2/parsing/JobWebhook.java +++ b/src/main/java/com/mindee/v2/parsing/JobWebhook.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.mindee.v1.parsing.common.LocalDateTimeDeserializer; +import com.mindee.v2.parsing.error.ErrorResponse; import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/mindee/v2/parsing/ErrorItem.java b/src/main/java/com/mindee/v2/parsing/error/ErrorItem.java similarity index 94% rename from src/main/java/com/mindee/v2/parsing/ErrorItem.java rename to src/main/java/com/mindee/v2/parsing/error/ErrorItem.java index da1a9917d..e0b0687ad 100644 --- a/src/main/java/com/mindee/v2/parsing/ErrorItem.java +++ b/src/main/java/com/mindee/v2/parsing/error/ErrorItem.java @@ -1,4 +1,4 @@ -package com.mindee.v2.parsing; +package com.mindee.v2.parsing.error; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/mindee/v2/parsing/ErrorResponse.java b/src/main/java/com/mindee/v2/parsing/error/ErrorResponse.java similarity index 97% rename from src/main/java/com/mindee/v2/parsing/ErrorResponse.java rename to src/main/java/com/mindee/v2/parsing/error/ErrorResponse.java index 9aebb55cd..64f4fac28 100644 --- a/src/main/java/com/mindee/v2/parsing/ErrorResponse.java +++ b/src/main/java/com/mindee/v2/parsing/error/ErrorResponse.java @@ -1,4 +1,4 @@ -package com.mindee.v2.parsing; +package com.mindee.v2.parsing.error; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/mindee/v2/parsing/search/ModelWebhook.java b/src/main/java/com/mindee/v2/parsing/search/ModelWebhook.java new file mode 100644 index 000000000..5dd343f05 --- /dev/null +++ b/src/main/java/com/mindee/v2/parsing/search/ModelWebhook.java @@ -0,0 +1,37 @@ +package com.mindee.v2.parsing.search; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * Model webhook info. + */ +@Getter +@EqualsAndHashCode +@JsonIgnoreProperties(ignoreUnknown = true) +@AllArgsConstructor +@NoArgsConstructor +public class ModelWebhook { + /** + * ID of the webhook. + */ + @JsonProperty("id") + private String id; + + /** + * Name of the webhook. + */ + @JsonProperty("name") + private String name; + + /** + * URL of the webhook. + */ + @JsonProperty("url") + private String url; + +} diff --git a/src/main/java/com/mindee/v2/parsing/search/PaginationMetadata.java b/src/main/java/com/mindee/v2/parsing/search/PaginationMetadata.java new file mode 100644 index 000000000..9cf220a0c --- /dev/null +++ b/src/main/java/com/mindee/v2/parsing/search/PaginationMetadata.java @@ -0,0 +1,57 @@ +package com.mindee.v2.parsing.search; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.StringJoiner; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * PaginationMetadata data associated with model search. + */ +@Getter +@EqualsAndHashCode +@JsonIgnoreProperties(ignoreUnknown = true) +@AllArgsConstructor +@NoArgsConstructor +public class PaginationMetadata { + + /** + * Number of items per page. + */ + @JsonProperty("per_page") + private int perPage; + + /** + * 1-indexed page number. + */ + @JsonProperty("page") + private int page; + + /** + * Total items. + */ + @JsonProperty("total_items") + private int totalItems; + + /** + * Total number of pages. + */ + @JsonProperty("total_pages") + private int totalPages; + + /** + * String representation of the pagination metadata. + */ + @Override + public String toString() { + var joiner = new StringJoiner("\n"); + joiner.add(":Per Page: " + perPage); + joiner.add(":Page: " + page); + joiner.add(":Total Items: " + totalItems); + joiner.add(":Total Pages: " + totalPages); + return joiner.toString(); + } +} diff --git a/src/main/java/com/mindee/v2/parsing/search/SearchModel.java b/src/main/java/com/mindee/v2/parsing/search/SearchModel.java new file mode 100644 index 000000000..bc7d1c906 --- /dev/null +++ b/src/main/java/com/mindee/v2/parsing/search/SearchModel.java @@ -0,0 +1,54 @@ +package com.mindee.v2.parsing.search; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import java.util.StringJoiner; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * Models search response. + */ +@Getter +@EqualsAndHashCode +@JsonIgnoreProperties(ignoreUnknown = true) +@AllArgsConstructor +@NoArgsConstructor +public class SearchModel { + + /** + * ID of the model. + */ + @JsonProperty("id") + private String id; + + /** + * Name of the model. + */ + @JsonProperty("name") + private String name; + + /** + * Type of the model. + */ + @JsonProperty("model_type") + private String modelType; + + /** + * Webhooks associated with the model. + */ + @JsonProperty("webhooks") + private List webhooks; + + @Override + public String toString() { + var joiner = new StringJoiner("\n"); + joiner.add(":Name: " + name); + joiner.add(":ID: " + id); + joiner.add(":Model Type: " + modelType); + return joiner.toString(); + } +} diff --git a/src/main/java/com/mindee/v2/parsing/search/SearchResponse.java b/src/main/java/com/mindee/v2/parsing/search/SearchResponse.java new file mode 100644 index 000000000..07b0a2f04 --- /dev/null +++ b/src/main/java/com/mindee/v2/parsing/search/SearchResponse.java @@ -0,0 +1,45 @@ +package com.mindee.v2.parsing.search; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.mindee.v2.parsing.CommonResponse; +import java.util.List; +import java.util.StringJoiner; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * Models search response. + */ +@Getter +@EqualsAndHashCode(callSuper = true) +@JsonIgnoreProperties(ignoreUnknown = true) +@AllArgsConstructor +@NoArgsConstructor +public class SearchResponse extends CommonResponse { + + @JsonProperty("models") + private List models; + + @JsonProperty("pagination") + private PaginationMetadata pagination; + + /** + * String representation of the search response. + */ + @Override + public String toString() { + var joiner = new StringJoiner("\n"); + joiner.add("Models").add("#######"); + for (SearchModel model : models) { + joiner.add("* :Name: " + model.getName()); + joiner.add(" :ID: " + model.getId()); + joiner.add(" :Model Type: " + model.getModelType()); + } + joiner.add("Pagination").add("##########"); + joiner.add(pagination.toString()); + return joiner.toString(); + } +} diff --git a/src/test/java/com/mindee/v2/MindeeClientIT.java b/src/test/java/com/mindee/v2/MindeeClientIT.java index d255602f2..dfc243d89 100644 --- a/src/test/java/com/mindee/v2/MindeeClientIT.java +++ b/src/test/java/com/mindee/v2/MindeeClientIT.java @@ -8,6 +8,7 @@ import com.mindee.input.URLInputSource; import com.mindee.v2.clientoptions.PollingOptions; import com.mindee.v2.http.MindeeHttpExceptionV2; +import com.mindee.v2.parsing.search.SearchResponse; import com.mindee.v2.product.extraction.ExtractionInference; import com.mindee.v2.product.extraction.ExtractionResponse; import com.mindee.v2.product.extraction.params.ExtractionParameters; @@ -224,4 +225,12 @@ void urlInputSource_mustNotRaiseErrors() throws IOException, InterruptedExceptio assertNotNull(response); assertNotNull(response.getInference()); } + + @Test + @DisplayName("Search for models by name") + void searchModelsByName_mustSucceed() { + SearchResponse response = mindeeClient.searchModels("crop"); + assertNotNull(response); + assertFalse(response.getModels().isEmpty()); + } } diff --git a/src/test/java/com/mindee/v2/MindeeClientTest.java b/src/test/java/com/mindee/v2/MindeeClientTest.java index e7b46ac94..5e4738568 100644 --- a/src/test/java/com/mindee/v2/MindeeClientTest.java +++ b/src/test/java/com/mindee/v2/MindeeClientTest.java @@ -12,6 +12,7 @@ import com.mindee.v2.http.MindeeApiV2; import com.mindee.v2.parsing.CommonResponse; import com.mindee.v2.parsing.JobResponse; +import com.mindee.v2.parsing.search.SearchResponse; import com.mindee.v2.product.extraction.ExtractionResponse; import com.mindee.v2.product.extraction.params.ExtractionParameters; import java.io.IOException; @@ -47,6 +48,11 @@ public JobResponse reqGetJob(String jobId) { return jobResponse; } + @Override + public SearchResponse reqGetSearchModels(String modelName, String modelType) { + return new SearchResponse(); + } + @Override public TResponse reqGetResult( Class tResponseClass, diff --git a/src/test/java/com/mindee/v2/parsing/JobTest.java b/src/test/java/com/mindee/v2/parsing/JobTest.java index 77e97ffd1..30996ee1a 100644 --- a/src/test/java/com/mindee/v2/parsing/JobTest.java +++ b/src/test/java/com/mindee/v2/parsing/JobTest.java @@ -5,6 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; +import com.mindee.v2.parsing.error.ErrorResponse; import java.io.IOException; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/com/mindee/v2/parsing/search/SearchModelsTest.java b/src/test/java/com/mindee/v2/parsing/search/SearchModelsTest.java new file mode 100644 index 000000000..13e6ce3f4 --- /dev/null +++ b/src/test/java/com/mindee/v2/parsing/search/SearchModelsTest.java @@ -0,0 +1,28 @@ +package com.mindee.v2.parsing.search; + +import static com.mindee.TestingUtilities.getV2ResourcePath; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.mindee.v2.parsing.LocalResponse; +import java.io.IOException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("MindeeV2 - Search Models Tests") +public class SearchModelsTest { + @Test + void propertiesMustBePresent() throws IOException { + var localResponse = new LocalResponse(getV2ResourcePath("search/models.json")); + var searchResponse = localResponse.deserializeResponse(SearchResponse.class); + + assertEquals(5, searchResponse.getModels().size()); + + var model0 = searchResponse.getModels().get(0); + assertEquals("Extraction With Webhooks", model0.getName()); + assertEquals(2, model0.getWebhooks().size()); + + var model0Webook0 = model0.getWebhooks().get(0); + assertEquals("FAILURE", model0Webook0.getName()); + assertEquals("https://failure.mindee.com", model0Webook0.getUrl()); + } +} diff --git a/src/test/resources b/src/test/resources index 315efcc30..13093f3a4 160000 --- a/src/test/resources +++ b/src/test/resources @@ -1 +1 @@ -Subproject commit 315efcc302efacfb75a6b101788058658e8c37e4 +Subproject commit 13093f3a48de212ef26889df71199c1a2a9d1478