From e07f2188185d639de5916f3447433b32f1c29973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Vannicatte?= Date: Mon, 16 May 2022 18:26:34 +0200 Subject: [PATCH 1/4] feat(cts): add `requestOptions` tests --- .../src/transporter/createTransporter.ts | 4 +- .../client-common/src/transporter/helpers.ts | 2 +- .../codegen/cts/AlgoliaCtsGenerator.java | 1 + .../com/algolia/codegen/cts/CTSException.java | 4 + .../codegen/cts/ParametersWithDataType.java | 63 +++++- .../java/com/algolia/codegen/cts/Request.java | 18 ++ playground/javascript/node/search.ts | 20 +- tests/CTS/methods/requests/common/post.json | 199 ++++++++++++++++++ .../java/requestOptionsParams.mustache | 15 ++ .../requests/templates/java/requests.mustache | 20 +- .../templates/javascript/requests.mustache | 5 +- .../php/requestOptionsParams.mustache | 15 ++ .../requests/templates/php/requests.mustache | 17 ++ 13 files changed, 372 insertions(+), 11 deletions(-) create mode 100644 tests/CTS/methods/requests/templates/java/requestOptionsParams.mustache create mode 100644 tests/CTS/methods/requests/templates/php/requestOptionsParams.mustache diff --git a/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/createTransporter.ts b/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/createTransporter.ts index 89be537101..230c4c4ca0 100644 --- a/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/createTransporter.ts +++ b/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/createTransporter.ts @@ -257,13 +257,13 @@ export function createTransporter({ cacheable: baseRequestOptions?.cacheable, timeout: baseRequestOptions?.timeout, queryParameters: { - ...baseRequestOptions?.queryParameters, ...methodOptions.queryParameters, + ...baseRequestOptions?.queryParameters, }, headers: { Accept: 'application/json', - ...baseRequestOptions?.headers, ...methodOptions.headers, + ...baseRequestOptions?.headers, }, }; diff --git a/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/helpers.ts b/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/helpers.ts index f8f6b6079f..079e0dbb66 100644 --- a/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/helpers.ts +++ b/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/helpers.ts @@ -1,9 +1,9 @@ import type { Headers, Host, + QueryParameters, Request, RequestOptions, - QueryParameters, Response, StackFrame, } from '../types'; diff --git a/generators/src/main/java/com/algolia/codegen/cts/AlgoliaCtsGenerator.java b/generators/src/main/java/com/algolia/codegen/cts/AlgoliaCtsGenerator.java index a4039848c9..7d86eede2f 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/AlgoliaCtsGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/cts/AlgoliaCtsGenerator.java @@ -194,6 +194,7 @@ public Map postProcessSupportingFileData( if (e.isSkipable()) { System.exit(0); } + e.printStackTrace(); System.exit(1); } catch (Exception e) { e.printStackTrace(); diff --git a/generators/src/main/java/com/algolia/codegen/cts/CTSException.java b/generators/src/main/java/com/algolia/codegen/cts/CTSException.java index 57b6b4f422..ee4135f431 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/CTSException.java +++ b/generators/src/main/java/com/algolia/codegen/cts/CTSException.java @@ -8,6 +8,10 @@ public CTSException(String message) { super(message); } + public CTSException(String message, Throwable cause) { + super(message, cause); + } + public CTSException(String message, boolean skipable) { this(message); this.skipable = skipable; diff --git a/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java b/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java index 22eddabf33..51cbb8da4e 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java +++ b/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java @@ -39,9 +39,55 @@ public Map buildJSONForRequest( test.put("testName", req.testName == null ? operationId : req.testName); test.put("testIndex", testIndex); test.put("request", req.request); - test.put("hasParameters", req.parameters.size() != 0); + if (req.requestOptions != null) { + test.put("hasRequestOptions", true); + test.put( + "requestOptions", + Json.mapper().writeValueAsString(req.requestOptions) + ); + Map requestOptions = new HashMap<>(); + + if (req.requestOptions.queryParameters != null) { + CodegenParameter objSpec = new CodegenParameter(); + objSpec.dataType = + inferDataType(req.requestOptions.queryParameters, objSpec, null); + + if (objSpec.dataType == null) { + System.out.println(objSpec.dataType); + } + + requestOptions.put( + "queryParameters", + traverseParams( + "queryParameters", + req.requestOptions.queryParameters, + objSpec, + "", + 0 + ) + ); + } + + if (req.requestOptions.headers != null) { + List> headers = new ArrayList>(); + + for (Entry entry : req.requestOptions.headers.entrySet()) { + Map parameter = new HashMap<>(); + + parameter.put("key", entry.getKey()); + parameter.put("value", entry.getValue()); + + headers.add(parameter); + } + + requestOptions.put("headers", headers); + } + + test.put("requestOptionsWithDataType", requestOptions); + } + if (req.parameters.size() == 0) { return test; } @@ -479,6 +525,21 @@ private String inferDataType( if (spec != null) spec.setIsBoolean(true); if (output != null) output.put("isBoolean", true); return "Boolean"; + case "ArrayList": + if (spec != null) { + spec.setIsArray(true); + // This is just to find the correct path in `handlePrimitive`, + // but it's not always the real type + CodegenProperty baseItems = new CodegenProperty(); + baseItems.dataType = "String"; + spec.setItems(baseItems); + } + if (output != null) output.put("isArray", true); + return "ArrayList"; + case "LinkedHashMap": + if (spec != null) spec.baseType = "Object"; + if (output != null) output.put("isFreeFormObject", true); + return "Object"; default: throw new CTSException( "Unknown type: " + param.getClass().getSimpleName() diff --git a/generators/src/main/java/com/algolia/codegen/cts/Request.java b/generators/src/main/java/com/algolia/codegen/cts/Request.java index 23d51b947f..76a5f7e9b3 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/Request.java +++ b/generators/src/main/java/com/algolia/codegen/cts/Request.java @@ -14,6 +14,7 @@ public class Request { public String testName; public Map parameters; + public RequestOptions requestOptions; public RequestProp request; @Override @@ -22,12 +23,29 @@ public String toString() { sb.append("class Request {\n"); sb.append(" testName: ").append(testName).append("\n"); sb.append(" parameters: ").append(parameters).append("\n"); + sb.append(" requestOptions: ").append(requestOptions).append("\n"); sb.append(" request: ").append(request).append("\n"); sb.append("}"); return sb.toString(); } } +class RequestOptions { + + public Map queryParameters; + public Map headers; + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class RequestOptions {\n"); + sb.append(" queryParameters: ").append(queryParameters).append("\n"); + sb.append(" headers: ").append(headers).append("\n"); + sb.append("}"); + return sb.toString(); + } +} + class RequestProp { public String path; diff --git a/playground/javascript/node/search.ts b/playground/javascript/node/search.ts index 54799bf46c..ed84b3ba1e 100644 --- a/playground/javascript/node/search.ts +++ b/playground/javascript/node/search.ts @@ -1,6 +1,7 @@ import { searchClient } from '@experimental-api-clients-automation/client-search'; import { ApiError } from '@experimental-api-clients-automation/client-common'; import dotenv from 'dotenv'; +import { echoRequester } from '@experimental-api-clients-automation/requester-node-http'; dotenv.config({ path: '../../.env' }); @@ -11,16 +12,25 @@ const searchIndex = process.env.SEARCH_INDEX || 'test_index'; const searchQuery = process.env.SEARCH_QUERY || 'test_query'; // Init client with appId and apiKey -const client = searchClient(appId, apiKey); +const client = searchClient(appId, apiKey, { + requester: echoRequester(), +}); client.addUserAgent('Node playground', '0.0.1'); async function testSearch() { try { - const res = await client.search({ - indexName: searchIndex, - searchParams: { query: searchQuery }, - }); + const res = await client.search( + { + indexName: searchIndex, + searchParams: { query: searchQuery }, + }, + { + queryParameters: { + requestOptions: ['c', 'd'], + }, + } + ); console.log(`[OK]`, res); } catch (e) { diff --git a/tests/CTS/methods/requests/common/post.json b/tests/CTS/methods/requests/common/post.json index 7aa7fb7614..7d83f3e6bd 100644 --- a/tests/CTS/methods/requests/common/post.json +++ b/tests/CTS/methods/requests/common/post.json @@ -30,5 +30,204 @@ "query": "parameters" } } + }, + { + "testName": "requestOptions can override default query parameters", + "parameters": { + "path": "/test/requestOptions", + "parameters": { + "query": "parameters" + }, + "body": { + "facet": "filters" + } + }, + "requestOptions": { + "queryParameters": { + "query": "myQueryParameter" + } + }, + "request": { + "path": "/1/test/requestOptions", + "method": "POST", + "body": { + "facet": "filters" + }, + "queryParameters": { + "query": "myQueryParameter" + } + } + }, + { + "testName": "requestOptions merges query parameters with default ones", + "parameters": { + "path": "/test/requestOptions", + "parameters": { + "query": "parameters" + }, + "body": { + "facet": "filters" + } + }, + "requestOptions": { + "queryParameters": { + "query2": "myQueryParameter" + } + }, + "request": { + "path": "/1/test/requestOptions", + "method": "POST", + "body": { + "facet": "filters" + }, + "queryParameters": { + "query": "parameters", + "query2": "myQueryParameter" + } + } + }, + { + "testName": "requestOptions can override default headers", + "parameters": { + "path": "/test/requestOptions", + "parameters": { + "query": "parameters" + }, + "body": { + "facet": "filters" + } + }, + "requestOptions": { + "headers": { + "x-algolia-api-key": "myApiKey" + } + }, + "request": { + "path": "/1/test/requestOptions", + "method": "POST", + "body": { + "facet": "filters" + }, + "queryParameters": { + "query": "parameters" + }, + "headers": { + "x-algolia-api-key": "myApiKey" + } + } + }, + { + "testName": "requestOptions merges headers with default ones", + "parameters": { + "path": "/test/requestOptions", + "parameters": { + "query": "parameters" + }, + "body": { + "facet": "filters" + } + }, + "requestOptions": { + "headers": { + "x-algolia-api-key": "myApiKey" + } + }, + "request": { + "path": "/1/test/requestOptions", + "method": "POST", + "body": { + "facet": "filters" + }, + "queryParameters": { + "query": "parameters" + }, + "headers": { + "x-algolia-api-key": "myApiKey" + } + } + }, + { + "testName": "requestOptions queryParameters accepts integers", + "parameters": { + "path": "/test/requestOptions", + "parameters": { + "query": "parameters" + }, + "body": { + "facet": "filters" + } + }, + "requestOptions": { + "queryParameters": { + "myParam": 2 + } + }, + "request": { + "path": "/1/test/requestOptions", + "method": "POST", + "body": { + "facet": "filters" + }, + "queryParameters": { + "query": "parameters", + "myParam": "2" + } + } + }, + { + "testName": "requestOptions queryParameters accepts list of string", + "parameters": { + "path": "/test/requestOptions", + "parameters": { + "query": "parameters" + }, + "body": { + "facet": "filters" + } + }, + "requestOptions": { + "queryParameters": { + "myParam": ["c", "d"] + } + }, + "request": { + "path": "/1/test/requestOptions", + "method": "POST", + "body": { + "facet": "filters" + }, + "queryParameters": { + "query": "parameters", + "myParam": "c,d" + } + } + }, + { + "testName": "requestOptions queryParameters accepts list of integers", + "parameters": { + "path": "/test/requestOptions", + "parameters": { + "query": "parameters" + }, + "body": { + "facet": "filters" + } + }, + "requestOptions": { + "queryParameters": { + "myParam": [1, 2] + } + }, + "request": { + "path": "/1/test/requestOptions", + "method": "POST", + "body": { + "facet": "filters" + }, + "queryParameters": { + "query": "parameters", + "myParam": "1,2" + } + } } ] diff --git a/tests/CTS/methods/requests/templates/java/requestOptionsParams.mustache b/tests/CTS/methods/requests/templates/java/requestOptionsParams.mustache new file mode 100644 index 0000000000..1302f7001e --- /dev/null +++ b/tests/CTS/methods/requests/templates/java/requestOptionsParams.mustache @@ -0,0 +1,15 @@ +{{#isString}} + "{{{value}}}" +{{/isString}} +{{#isInteger}} + {{{value}}} +{{/isInteger}} +{{#isLong}} + {{{value}}}L +{{/isLong}} +{{#isDouble}} + {{{value}}} +{{/isDouble}} +{{#isBoolean}} + {{{value}}} +{{/isBoolean}} diff --git a/tests/CTS/methods/requests/templates/java/requests.mustache b/tests/CTS/methods/requests/templates/java/requests.mustache index 91f7cfa0b7..b8d96ef0af 100644 --- a/tests/CTS/methods/requests/templates/java/requests.mustache +++ b/tests/CTS/methods/requests/templates/java/requests.mustache @@ -13,6 +13,7 @@ import org.junit.jupiter.api.BeforeAll; import com.google.gson.reflect.TypeToken; import com.algolia.utils.JSON; +import com.algolia.utils.RequestOptions; import com.algolia.model.{{import}}.*; import com.algolia.api.{{client}}; import org.skyscreamer.jsonassert.JSONAssert; @@ -39,8 +40,25 @@ class {{client}}Tests { void {{method}}Test{{testIndex}}() { {{#parametersWithDataType}}{{> generateParams}}{{/parametersWithDataType}} + {{#hasRequestOptions}} + RequestOptions requestOptions = new RequestOptions(); + {{#requestOptionsWithDataType.queryParameters.value.0}} + {{#isArray}} + List requestOptionsQueryParameters = new ArrayList<>(); + {{#value}}requestOptionsQueryParameters.add({{> requestOptionsParams}});{{/value}} + requestOptions.addExtraQueryParameters("{{{key}}}", requestOptionsQueryParameters); + {{/isArray}} + {{^isArray}} + requestOptions.addExtraQueryParameters("{{{key}}}", {{{#value}}}{{> requestOptionsParams}}{{{/value}}}); + {{/isArray}} + {{/requestOptionsWithDataType.queryParameters.value.0}} + {{#requestOptionsWithDataType.headers}} + requestOptions.addExtraHeader("{{{key}}}", "{{{value}}}"); + {{/requestOptionsWithDataType.headers}} + {{/hasRequestOptions}} + assertDoesNotThrow(() -> { - client.{{method}}({{#parametersWithDataType}}{{> maybeConvertOneOf}}{{^-last}},{{/-last}}{{/parametersWithDataType}}); + client.{{method}}({{#parametersWithDataType}}{{> maybeConvertOneOf}}{{^-last}},{{/-last}}{{/parametersWithDataType}}{{#hasRequestOptions}}, requestOptions{{/hasRequestOptions}}); }); EchoResponse req = requester.getLastEchoResponse(); diff --git a/tests/CTS/methods/requests/templates/javascript/requests.mustache b/tests/CTS/methods/requests/templates/javascript/requests.mustache index cf8e549cdd..c3e6c97111 100644 --- a/tests/CTS/methods/requests/templates/javascript/requests.mustache +++ b/tests/CTS/methods/requests/templates/javascript/requests.mustache @@ -1,6 +1,7 @@ import { {{client}} } from '{{{import}}}'; import { echoRequester } from '@experimental-api-clients-automation/requester-node-http'; import type { EchoResponse } from '@experimental-api-clients-automation/client-common'; +import type { RequestOptions } from '@experimental-api-clients-automation/client-common'; const appId = process.env.ALGOLIA_APPLICATION_ID || 'test_app_id'; const apiKey = process.env.ALGOLIA_SEARCH_KEY || 'test_api_key'; @@ -11,7 +12,9 @@ const client = {{client}}(appId, apiKey, {{#hasRegionalHost}}'{{{defaultRegion}} describe('{{operationId}}', () => { {{#tests}} test('{{testName}}', async () => { - const req = (await client.{{method}}({{#hasParameters}}{{{parameters}}}{{/hasParameters}})) as unknown as EchoResponse; + {{#hasRequestOptions}}const requestOptions: RequestOptions = {{{requestOptions}}}{{/hasRequestOptions}} + + const req = (await client.{{method}}({{#hasParameters}}{{{parameters}}}{{/hasParameters}}{{#hasRequestOptions}}, requestOptions{{/hasRequestOptions}})) as unknown as EchoResponse; expect(req.path).toEqual('{{{request.path}}}'); expect(req.method).toEqual('{{{request.method}}}'); diff --git a/tests/CTS/methods/requests/templates/php/requestOptionsParams.mustache b/tests/CTS/methods/requests/templates/php/requestOptionsParams.mustache new file mode 100644 index 0000000000..cb8c469199 --- /dev/null +++ b/tests/CTS/methods/requests/templates/php/requestOptionsParams.mustache @@ -0,0 +1,15 @@ +{{#isString}} + "{{{value}}}" +{{/isString}} +{{#isInteger}} + {{{value}}} +{{/isInteger}} +{{#isDouble}} + {{{value}}} +{{/isDouble}} +{{#isLong}} + {{{value}}} +{{/isLong}} +{{#isBoolean}} + {{{value}}} +{{/isBoolean}} diff --git a/tests/CTS/methods/requests/templates/php/requests.mustache b/tests/CTS/methods/requests/templates/php/requests.mustache index 6c34de8ca0..70e8d61c40 100644 --- a/tests/CTS/methods/requests/templates/php/requests.mustache +++ b/tests/CTS/methods/requests/templates/php/requests.mustache @@ -91,8 +91,25 @@ class {{clientPrefix}}Test extends TestCase implements HttpClientInterface public function test{{#lambda.titlecase}}{{method}}{{/lambda.titlecase}}{{testIndex}}() { $client = $this->getClient(); + {{#hasRequestOptions}} + $requestOptions = [ + 'queryParameters' => [ + {{#requestOptionsWithDataType.queryParameters.value.0}} + '{{{key}}}' => + {{#isArray}}[{{#value}}{{> requestOptionsParams}}{{^-last}},{{/-last}}{{/value}}]{{/isArray}} + {{^isArray}}{{{#value}}}{{> requestOptionsParams}}{{{/value}}}{{/isArray}}, + {{/requestOptionsWithDataType.queryParameters.value.0}} + ], + 'headers' => [ + {{#requestOptionsWithDataType.headers}} + '{{{key}}}' => '{{{value}}}', + {{/requestOptionsWithDataType.headers}} + ] + ]; + {{/hasRequestOptions}} $client->{{^hasParameters}}{{{method}}}();{{/hasParameters}}{{#hasParameters}}{{{method}}}( {{#parametersWithDataType}}{{> generateParams}}{{/parametersWithDataType}} + {{#hasRequestOptions}}$requestOptions{{/hasRequestOptions}} );{{/hasParameters}} $this->assertRequests([ From e49a8a263fe272662c12215b8d0f061edad406c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Vannicatte?= Date: Mon, 16 May 2022 18:45:54 +0200 Subject: [PATCH 2/4] format json --- tests/CTS/methods/requests/common/post.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/CTS/methods/requests/common/post.json b/tests/CTS/methods/requests/common/post.json index 7d83f3e6bd..da6345c1ad 100644 --- a/tests/CTS/methods/requests/common/post.json +++ b/tests/CTS/methods/requests/common/post.json @@ -187,7 +187,10 @@ }, "requestOptions": { "queryParameters": { - "myParam": ["c", "d"] + "myParam": [ + "c", + "d" + ] } }, "request": { @@ -215,7 +218,10 @@ }, "requestOptions": { "queryParameters": { - "myParam": [1, 2] + "myParam": [ + 1, + 2 + ] } }, "request": { From 81c74e99b56c86cc76e1a5f53444ada81c9a1793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Vannicatte?= Date: Tue, 17 May 2022 13:34:36 +0200 Subject: [PATCH 3/4] add boolean tests, handle them in PHP --- .../lib/ObjectSerializer.php | 19 +++--- .../RequestOptions/RequestOptionsFactory.php | 32 ++-------- .../lib/Support/Helpers.php | 13 +++- .../codegen/cts/ParametersWithDataType.java | 7 +-- tests/CTS/methods/requests/common/post.json | 60 +++++++++++++++++++ 5 files changed, 88 insertions(+), 43 deletions(-) diff --git a/clients/algoliasearch-client-php/lib/ObjectSerializer.php b/clients/algoliasearch-client-php/lib/ObjectSerializer.php index 87ad5039e7..a6ffa0d247 100644 --- a/clients/algoliasearch-client-php/lib/ObjectSerializer.php +++ b/clients/algoliasearch-client-php/lib/ObjectSerializer.php @@ -402,12 +402,12 @@ public static function deserialize($data, $class, $httpHeaders = null) // If a discriminator is defined and points to a valid subclass, use it. $discriminator = $class::DISCRIMINATOR; if ( - !empty($discriminator) && - isset($data->{$discriminator}) && - is_string($data->{$discriminator}) - ) { + !empty($discriminator) && + isset($data->{$discriminator}) && + is_string($data->{$discriminator}) + ) { $subclass = - '\Algolia\AlgoliaSearch\Model\\' . $data->{$discriminator}; + '\Algolia\AlgoliaSearch\Model\\' . $data->{$discriminator}; if (is_subclass_of($subclass, $class)) { $class = $subclass; } @@ -419,15 +419,14 @@ public static function deserialize($data, $class, $httpHeaders = null) $propertySetter = $instance::setters()[$property]; if ( - !isset($propertySetter) || - !isset($data->{$instance::attributeMap()[$property]}) - ) { + !isset($propertySetter) || + !isset($data->{$instance::attributeMap()[$property]}) + ) { continue; } if (isset($data->{$instance::attributeMap()[$property]})) { - $propertyValue = - $data->{$instance::attributeMap()[$property]}; + $propertyValue = $data->{$instance::attributeMap()[$property]}; $instance->$propertySetter( self::deserialize($propertyValue, $type, null) ); diff --git a/clients/algoliasearch-client-php/lib/RequestOptions/RequestOptionsFactory.php b/clients/algoliasearch-client-php/lib/RequestOptions/RequestOptionsFactory.php index 1fb0b34d7d..9f32631693 100644 --- a/clients/algoliasearch-client-php/lib/RequestOptions/RequestOptionsFactory.php +++ b/clients/algoliasearch-client-php/lib/RequestOptions/RequestOptionsFactory.php @@ -63,23 +63,14 @@ private function normalize($options) ]; foreach ($options as $optionName => $value) { - if (is_array($value)) { - if ($optionName === 'headers') { - $headersToLowerCase = []; + if (is_array($value) && $optionName === 'headers') { + $headersToLowerCase = []; - foreach ($value as $key => $v) { - $headersToLowerCase[mb_strtolower($key)] = $v; - } - - $normalized[$optionName] = $this->format( - $headersToLowerCase - ); - } else { - $normalized[$optionName] = $this->format( - $value, - $optionName === 'queryParameters' - ); + foreach ($value as $key => $v) { + $headersToLowerCase[mb_strtolower($key)] = $v; } + + $normalized[$optionName] = $headersToLowerCase; } else { $normalized[$optionName] = $value; } @@ -87,15 +78,4 @@ private function normalize($options) return $normalized; } - - private function format($options, $isQueryParameters = false) - { - foreach ($options as $name => $value) { - if (is_array($value) && $isQueryParameters) { - $options[$name] = implode(',', $value); - } - } - - return $options; - } } diff --git a/clients/algoliasearch-client-php/lib/Support/Helpers.php b/clients/algoliasearch-client-php/lib/Support/Helpers.php index 41ef66b58e..76132be20e 100644 --- a/clients/algoliasearch-client-php/lib/Support/Helpers.php +++ b/clients/algoliasearch-client-php/lib/Support/Helpers.php @@ -22,7 +22,18 @@ public static function buildQuery(array $args) $args = array_map(function ($value) { if (is_array($value)) { - return json_encode($value); + // PHP converts `true,false` in arrays to `1,`, so we create strings instead + // to avoid sending wrong values + $values = array_map(function ($v) { + if (is_bool($v)) { + return $v ? 'true' : 'false'; + } + + return $v; + }, $value); + + // We then return the array as a string comma separated + return implode(',', $values); } elseif (is_bool($value)) { return $value ? 'true' : 'false'; } diff --git a/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java b/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java index 51cbb8da4e..960faf3d6b 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java +++ b/generators/src/main/java/com/algolia/codegen/cts/ParametersWithDataType.java @@ -53,11 +53,6 @@ public Map buildJSONForRequest( CodegenParameter objSpec = new CodegenParameter(); objSpec.dataType = inferDataType(req.requestOptions.queryParameters, objSpec, null); - - if (objSpec.dataType == null) { - System.out.println(objSpec.dataType); - } - requestOptions.put( "queryParameters", traverseParams( @@ -535,7 +530,7 @@ private String inferDataType( spec.setItems(baseItems); } if (output != null) output.put("isArray", true); - return "ArrayList"; + return "List"; case "LinkedHashMap": if (spec != null) spec.baseType = "Object"; if (output != null) output.put("isFreeFormObject", true); diff --git a/tests/CTS/methods/requests/common/post.json b/tests/CTS/methods/requests/common/post.json index da6345c1ad..328ac7bc7e 100644 --- a/tests/CTS/methods/requests/common/post.json +++ b/tests/CTS/methods/requests/common/post.json @@ -146,6 +146,34 @@ } } }, + { + "testName": "requestOptions queryParameters accepts booleans", + "parameters": { + "path": "/test/requestOptions", + "parameters": { + "query": "parameters" + }, + "body": { + "facet": "filters" + } + }, + "requestOptions": { + "queryParameters": { + "isItWorking": true + } + }, + "request": { + "path": "/1/test/requestOptions", + "method": "POST", + "body": { + "facet": "filters" + }, + "queryParameters": { + "query": "parameters", + "isItWorking": "true" + } + } + }, { "testName": "requestOptions queryParameters accepts integers", "parameters": { @@ -205,6 +233,38 @@ } } }, + { + "testName": "requestOptions queryParameters accepts list of booleans", + "parameters": { + "path": "/test/requestOptions", + "parameters": { + "query": "parameters" + }, + "body": { + "facet": "filters" + } + }, + "requestOptions": { + "queryParameters": { + "myParam": [ + true, + true, + false + ] + } + }, + "request": { + "path": "/1/test/requestOptions", + "method": "POST", + "body": { + "facet": "filters" + }, + "queryParameters": { + "query": "parameters", + "myParam": "true,true,false" + } + } + }, { "testName": "requestOptions queryParameters accepts list of integers", "parameters": { From 76c778a47adc15e5975881715c6f1258e3355566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Vannicatte?= Date: Tue, 17 May 2022 13:39:47 +0200 Subject: [PATCH 4/4] restore playground --- playground/javascript/node/search.ts | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/playground/javascript/node/search.ts b/playground/javascript/node/search.ts index ed84b3ba1e..54799bf46c 100644 --- a/playground/javascript/node/search.ts +++ b/playground/javascript/node/search.ts @@ -1,7 +1,6 @@ import { searchClient } from '@experimental-api-clients-automation/client-search'; import { ApiError } from '@experimental-api-clients-automation/client-common'; import dotenv from 'dotenv'; -import { echoRequester } from '@experimental-api-clients-automation/requester-node-http'; dotenv.config({ path: '../../.env' }); @@ -12,25 +11,16 @@ const searchIndex = process.env.SEARCH_INDEX || 'test_index'; const searchQuery = process.env.SEARCH_QUERY || 'test_query'; // Init client with appId and apiKey -const client = searchClient(appId, apiKey, { - requester: echoRequester(), -}); +const client = searchClient(appId, apiKey); client.addUserAgent('Node playground', '0.0.1'); async function testSearch() { try { - const res = await client.search( - { - indexName: searchIndex, - searchParams: { query: searchQuery }, - }, - { - queryParameters: { - requestOptions: ['c', 'd'], - }, - } - ); + const res = await client.search({ + indexName: searchIndex, + searchParams: { query: searchQuery }, + }); console.log(`[OK]`, res); } catch (e) {