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 b64925d9fcc..5f7e6c9c139 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/AlgoliaCTSGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/cts/AlgoliaCTSGenerator.java @@ -100,6 +100,7 @@ protected Builder addMustacheLambdas() { lambdas.put("escapeDollar", new EscapeDollarLambda()); lambdas.put("escapeQuotes", new EscapeQuotesLambda()); lambdas.put("escapeSlash", new EscapeSlashLambda()); + lambdas.put("escapeJSON", new EscapeJSONLambda()); lambdas.put("replaceBacktick", new ReplaceBacktickLambda()); return lambdas; diff --git a/generators/src/main/java/com/algolia/codegen/cts/lambda/EscapeJSONLambda.java b/generators/src/main/java/com/algolia/codegen/cts/lambda/EscapeJSONLambda.java new file mode 100644 index 00000000000..8e2c5a4325c --- /dev/null +++ b/generators/src/main/java/com/algolia/codegen/cts/lambda/EscapeJSONLambda.java @@ -0,0 +1,15 @@ +package com.algolia.codegen.cts.lambda; + +import com.samskivert.mustache.Mustache; +import com.samskivert.mustache.Template; +import java.io.IOException; +import java.io.Writer; + +public class EscapeJSONLambda implements Mustache.Lambda { + + @Override + public void execute(Template.Fragment fragment, Writer writer) throws IOException { + String text = fragment.execute(); + writer.write(text.replace("\\", "\\\\").replace("\"", "\\\"")); + } +} diff --git a/generators/src/main/java/com/algolia/codegen/cts/lambda/EscapeQuotesLambda.java b/generators/src/main/java/com/algolia/codegen/cts/lambda/EscapeQuotesLambda.java index 439a3b46a86..57537f1ce6e 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/lambda/EscapeQuotesLambda.java +++ b/generators/src/main/java/com/algolia/codegen/cts/lambda/EscapeQuotesLambda.java @@ -10,6 +10,7 @@ public class EscapeQuotesLambda implements Mustache.Lambda { @Override public void execute(Template.Fragment fragment, Writer writer) throws IOException { String text = fragment.execute(); - writer.write(text.replace("\"", "\\\"")); + // replaces all occurrences of " that are not preceded by a backslash with \" + writer.write(text.replaceAll("(? traverseParams( } testOutput.put("key", paramName); - testOutput.put("useAnonymousKey", !paramName.matches("(.*)_[0-9]$") && depth != 0); + testOutput.put("useAnonymousKey", !paramName.matches("(.*)_[0-9]+$") && depth != 0); testOutput.put("parent", parent); testOutput.put("isRoot", "".equals(parent)); testOutput.put("objectName", getObjectNameForLanguage(baseType)); @@ -191,7 +191,7 @@ private Map traverseParams( private Map traverseParamsWithoutSpec(String paramName, Object param, String parent, int depth) throws CTSException { Map testOutput = createDefaultOutput(); testOutput.put("key", paramName); - testOutput.put("useAnonymousKey", !paramName.matches("(.*)_[0-9]$") && depth != 0); + testOutput.put("useAnonymousKey", !paramName.matches("(.*)_[0-9]+$") && depth != 0); testOutput.put("parent", parent); testOutput.put("isRoot", "".equals(parent)); // try to infer the type diff --git a/templates/csharp/tests/generateInnerParams.mustache b/templates/csharp/tests/generateInnerParams.mustache index f5ee0ae3080..3cd63690f96 100644 --- a/templates/csharp/tests/generateInnerParams.mustache +++ b/templates/csharp/tests/generateInnerParams.mustache @@ -5,7 +5,7 @@ {{{value}}} {{/isVerbatim}} {{#isString}} - "{{#lambda.escapeQuotes}}{{#lambda.escapeSlash}}{{{value}}}{{/lambda.escapeSlash}}{{/lambda.escapeQuotes}}" + "{{#lambda.escapeJSON}}{{{value}}}{{/lambda.escapeJSON}}" {{/isString}} {{#isInteger}} {{{value}}} diff --git a/templates/csharp/tests/requests/requests.mustache b/templates/csharp/tests/requests/requests.mustache index 835ca835c68..aaaa4e72c9c 100644 --- a/templates/csharp/tests/requests/requests.mustache +++ b/templates/csharp/tests/requests/requests.mustache @@ -46,7 +46,7 @@ private readonly {{client}} client; Assert.Equal("{{{path}}}",req.Path); Assert.Equal("{{{method}}}",req.Method.ToString()); {{#body}} - JsonAssert.EqualOverrideDefault("{{#lambda.escapeQuotes}}{{{body}}}{{/lambda.escapeQuotes}}", req.Body, new JsonDiffConfig(false)); + JsonAssert.EqualOverrideDefault("{{#lambda.escapeJSON}}{{{body}}}{{/lambda.escapeJSON}}", req.Body, new JsonDiffConfig(false)); {{/body}} {{^body}} {{#assertNullBody}} diff --git a/templates/dart/tests/param_value.mustache b/templates/dart/tests/param_value.mustache index edaefdca86e..9fadc305476 100644 --- a/templates/dart/tests/param_value.mustache +++ b/templates/dart/tests/param_value.mustache @@ -1,6 +1,6 @@ {{#isNull}}empty(){{/isNull}} {{#isVerbatim}}{{{value}}}{{/isVerbatim}} -{{#isString}}"{{#lambda.escapeDollar}}{{{value}}}{{/lambda.escapeDollar}}"{{/isString}} +{{#isString}}"{{#lambda.escapeQuotes}}{{#lambda.escapeDollar}}{{{value}}}{{/lambda.escapeDollar}}{{/lambda.escapeQuotes}}"{{/isString}} {{#isNumber}}{{{value}}}{{/isNumber}} {{#isBoolean}}{{{value}}}{{/isBoolean}} {{#isEnum}}{{{objectName}}}.fromJson("{{value}}"){{/isEnum}} diff --git a/templates/dart/tests/requests/requests.mustache b/templates/dart/tests/requests/requests.mustache index 6d795d6c022..36abb6e3fca 100644 --- a/templates/dart/tests/requests/requests.mustache +++ b/templates/dart/tests/requests/requests.mustache @@ -53,7 +53,7 @@ void main() { expectParams(request.queryParameters, """{{{.}}}"""); {{/queryParameters}} {{#body}} - expectBody(request.body, """{{{.}}}"""); + expectBody(request.body, """{{#lambda.escapeSlash}}{{{.}}}{{/lambda.escapeSlash}}"""); {{/body}} {{^body}} {{#assertNullBody}} diff --git a/templates/go/tests/generateInnerParams.mustache b/templates/go/tests/generateInnerParams.mustache index 5a2879d967f..7a4ff09f866 100644 --- a/templates/go/tests/generateInnerParams.mustache +++ b/templates/go/tests/generateInnerParams.mustache @@ -1,3 +1,3 @@ -{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isHelper}}{{#goFunctionalParam}}{{clientPrefix}}.With{{#lambda.pascalcase}}{{key}}{{/lambda.pascalcase}}({{/goFunctionalParam}}{{/isHelper}}{{#isNull}}{{#inClientTest}}tests.ZeroValue[{{#isNullObject}}*{{clientPrefix}}.{{/isNullObject}}{{objectName}}](){{/inClientTest}}{{^inClientTest}}nil{{/inClientTest}}{{/isNull}}{{#isString}}"{{{value}}}"{{/isString}}{{#isInteger}}{{{value}}}{{/isInteger}}{{#isLong}}{{{value}}}{{/isLong}}{{#isDouble}}{{{value}}}{{/isDouble}}{{#isBoolean}}{{{value}}}{{/isBoolean}}{{#isEnum}}{{clientPrefix}}.{{objectName}}("{{{value}}}"){{/isEnum}}{{#isArray}} +{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isHelper}}{{#goFunctionalParam}}{{clientPrefix}}.With{{#lambda.pascalcase}}{{key}}{{/lambda.pascalcase}}({{/goFunctionalParam}}{{/isHelper}}{{#isNull}}{{#inClientTest}}tests.ZeroValue[{{#isNullObject}}*{{clientPrefix}}.{{/isNullObject}}{{objectName}}](){{/inClientTest}}{{^inClientTest}}nil{{/inClientTest}}{{/isNull}}{{#isString}}"{{#lambda.escapeQuotes}}{{{value}}}{{/lambda.escapeQuotes}}"{{/isString}}{{#isInteger}}{{{value}}}{{/isInteger}}{{#isLong}}{{{value}}}{{/isLong}}{{#isDouble}}{{{value}}}{{/isDouble}}{{#isBoolean}}{{{value}}}{{/isBoolean}}{{#isEnum}}{{clientPrefix}}.{{objectName}}("{{{value}}}"){{/isEnum}}{{#isArray}} {{> tests/arrayType}}{{^value.isEmpty}}{ {{#value}}{{#isObject}}*{{/isObject}}{{#oneOfModel}}{{^isObject}}*{{/isObject}}{{/oneOfModel}}{{> tests/generateParams}},{{/value}} }{{/value.isEmpty}}{{/isArray}}{{#isObject}} {{clientPrefix}}.NewEmpty{{objectName}}(){{#value}}{{#isAdditionalProperty}}.SetAdditionalProperty("{{{key}}}", {{> tests/generateParams}}){{/isAdditionalProperty}}{{^isAdditionalProperty}}.Set{{#lambda.pascalcase}}{{{key}}}{{/lambda.pascalcase}}({{> tests/generateParams}}){{/isAdditionalProperty}}{{/value}}{{/isObject}}{{#isFreeFormObject}}{{#isAnyType}}map[string]any{ {{#value}}{{#entrySet}}"{{{key}}}": "{{{value}}}",{{/entrySet}}{{/value}} }{{/isAnyType}}{{^isAnyType}}{{> tests/mapType}}{ {{#value}}"{{{key}}}": {{#oneOfModel}}{{^isObject}}*{{/isObject}}{{/oneOfModel}}{{#isObject}}*{{/isObject}}{{> tests/generateParams}},{{/value}} }{{/isAnyType}}{{/isFreeFormObject}}{{#isHelper}}{{#goFunctionalParam}}){{/goFunctionalParam}}{{/isHelper}} \ No newline at end of file diff --git a/templates/java/tests/generateInnerParams.mustache b/templates/java/tests/generateInnerParams.mustache index a6f9604b419..81796c232b2 100644 --- a/templates/java/tests/generateInnerParams.mustache +++ b/templates/java/tests/generateInnerParams.mustache @@ -5,7 +5,7 @@ {{{value}}} {{/isVerbatim}} {{#isString}} - "{{#lambda.escapeQuotes}}{{#lambda.escapeSlash}}{{{value}}}{{/lambda.escapeSlash}}{{/lambda.escapeQuotes}}" + "{{#lambda.escapeJSON}}{{{value}}}{{/lambda.escapeJSON}}" {{/isString}} {{#isInteger}} {{{value}}} diff --git a/templates/java/tests/requests/requests.mustache b/templates/java/tests/requests/requests.mustache index 90e6d265ad2..f04b4de1bee 100644 --- a/templates/java/tests/requests/requests.mustache +++ b/templates/java/tests/requests/requests.mustache @@ -55,7 +55,7 @@ class {{client}}RequestsTests { assertEquals("{{{path}}}", req.path); assertEquals("{{{method}}}", req.method); {{#body}} - assertDoesNotThrow(() -> JSONAssert.assertEquals("{{#lambda.escapeQuotes}}{{{body}}}{{/lambda.escapeQuotes}}", req.body, JSONCompareMode.STRICT)); + assertDoesNotThrow(() -> JSONAssert.assertEquals("{{#lambda.escapeJSON}}{{{body}}}{{/lambda.escapeJSON}}", req.body, JSONCompareMode.STRICT)); {{/body}} {{^body}} {{#assertNullBody}} diff --git a/templates/kotlin/tests/param_value.mustache b/templates/kotlin/tests/param_value.mustache index 59eff2c2108..a8c0b12c5e5 100644 --- a/templates/kotlin/tests/param_value.mustache +++ b/templates/kotlin/tests/param_value.mustache @@ -1 +1 @@ -{{#isNull}}empty(){{/isNull}}{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isString}}{{#oneOfModel}}{{{parentClassName}}}.of("{{{value}}}"){{/oneOfModel}}{{^oneOfModel}}"{{#lambda.escapeQuotes}}{{#lambda.escapeSlash}}{{{value}}}{{/lambda.escapeSlash}}{{/lambda.escapeQuotes}}"{{/oneOfModel}}{{/isString}}{{#isInteger}}{{#oneOfModel}}{{{parentClassName}}}.of({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isInteger}}{{#isLong}}{{#oneOfModel}}{{{parentClassName}}}.of({{{value}}}L){{/oneOfModel}}{{^oneOfModel}}{{{value}}}L{{/oneOfModel}}{{/isLong}}{{#isDouble}}{{#oneOfModel}}{{{parentClassName}}}.of({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isDouble}}{{#isBoolean}}{{#oneOfModel}}{{{parentClassName}}}.of({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isBoolean}}{{#isEnum}}{{{objectName}}}.entries.first { it.value == "{{{value}}}" }{{/isEnum}}{{#isArray}}{{> tests/param_list}}{{/isArray}}{{#isObject}}{{> tests/param_object}}{{/isObject}}{{#isFreeFormObject}}{{#isSimpleObject}}{{> tests/param_json_object}}{{/isSimpleObject}}{{^isSimpleObject}}{{#isAnyType}}{{> tests/param_json_any}}{{/isAnyType}}{{^isAnyType}}{{> tests/param_map}}{{/isAnyType}}{{/isSimpleObject}}{{/isFreeFormObject}} \ No newline at end of file +{{#isNull}}empty(){{/isNull}}{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isString}}{{#oneOfModel}}{{{parentClassName}}}.of("{{{value}}}"){{/oneOfModel}}{{^oneOfModel}}"{{#lambda.escapeJSON}}{{{value}}}{{/lambda.escapeJSON}}"{{/oneOfModel}}{{/isString}}{{#isInteger}}{{#oneOfModel}}{{{parentClassName}}}.of({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isInteger}}{{#isLong}}{{#oneOfModel}}{{{parentClassName}}}.of({{{value}}}L){{/oneOfModel}}{{^oneOfModel}}{{{value}}}L{{/oneOfModel}}{{/isLong}}{{#isDouble}}{{#oneOfModel}}{{{parentClassName}}}.of({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isDouble}}{{#isBoolean}}{{#oneOfModel}}{{{parentClassName}}}.of({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isBoolean}}{{#isEnum}}{{{objectName}}}.entries.first { it.value == "{{{value}}}" }{{/isEnum}}{{#isArray}}{{> tests/param_list}}{{/isArray}}{{#isObject}}{{> tests/param_object}}{{/isObject}}{{#isFreeFormObject}}{{#isSimpleObject}}{{> tests/param_json_object}}{{/isSimpleObject}}{{^isSimpleObject}}{{#isAnyType}}{{> tests/param_json_any}}{{/isAnyType}}{{^isAnyType}}{{> tests/param_map}}{{/isAnyType}}{{/isSimpleObject}}{{/isFreeFormObject}} \ No newline at end of file diff --git a/templates/php/tests/generateParams.mustache b/templates/php/tests/generateParams.mustache index eae982d3916..392c15af04e 100644 --- a/templates/php/tests/generateParams.mustache +++ b/templates/php/tests/generateParams.mustache @@ -6,7 +6,7 @@ {{{value}}} {{/isVerbatim}} {{#isString}} - "{{#lambda.escapeSlash}}{{{value}}}{{/lambda.escapeSlash}}", + "{{#lambda.escapeJSON}}{{{value}}}{{/lambda.escapeJSON}}", {{/isString}} {{#isEnum}} "{{{value}}}", diff --git a/templates/python/tests/client/tests.mustache b/templates/python/tests/client/tests.mustache index 9424b53b2c0..61d8bf2cad3 100644 --- a/templates/python/tests/client/tests.mustache +++ b/templates/python/tests/client/tests.mustache @@ -19,7 +19,7 @@ {{#times}}for _ in range(0, {{.}}): {{/times}}{{#dynamicTemplate}}{{/dynamicTemplate}} {{#testUserAgent}} - regex_user_agent = compile("{{#lambda.escapeSlash}}{{{match.value}}}{{/lambda.escapeSlash}}") + regex_user_agent = compile("{{#lambda.escapeJSON}}{{{match.value}}}{{/lambda.escapeJSON}}") assert regex_user_agent.match(_req.headers.get("user-agent")) is not None {{/testUserAgent}} {{#testTimeouts}} diff --git a/templates/python/tests/generateInnerParams.mustache b/templates/python/tests/generateInnerParams.mustache index d474216df2f..c435f617575 100644 --- a/templates/python/tests/generateInnerParams.mustache +++ b/templates/python/tests/generateInnerParams.mustache @@ -1 +1 @@ -{{#isNull}} None {{/isNull}}{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isString}} "{{#lambda.escapeSlash}}{{{value}}}{{/lambda.escapeSlash}}" {{/isString}} {{#isInteger}} {{{value}}} {{/isInteger}} {{#isLong}} {{{value}}} {{/isLong}} {{#isDouble}} {{{value}}} {{/isDouble}} {{#isBoolean}} {{#lambda.titlecase}}{{{value}}}{{/lambda.titlecase}} {{/isBoolean}} {{#isEnum}} "{{{value}}}" {{/isEnum}} {{#isArray}} [ {{#value}}{{> tests/generateParams}}{{/value}} ] {{/isArray}} {{#isObject}} { {{#value}}{{> tests/generateParams}}{{/value}} } {{/isObject}} {{#isFreeFormObject}} {{#isAnyType}} { {{#value}}{{#entrySet}}"{{{key}}}":"{{{value}}}"{{^-last}},{{/-last}}{{/entrySet}}{{/value}} } {{/isAnyType}} {{^isAnyType}} { {{#value}}{{> tests/generateParams}}{{/value}} } {{/isAnyType}} {{/isFreeFormObject}} \ No newline at end of file +{{#isNull}} None {{/isNull}}{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isString}} "{{#lambda.escapeJSON}}{{{value}}}{{/lambda.escapeJSON}}" {{/isString}} {{#isInteger}} {{{value}}} {{/isInteger}} {{#isLong}} {{{value}}} {{/isLong}} {{#isDouble}} {{{value}}} {{/isDouble}} {{#isBoolean}} {{#lambda.titlecase}}{{{value}}}{{/lambda.titlecase}} {{/isBoolean}} {{#isEnum}} "{{{value}}}" {{/isEnum}} {{#isArray}} [ {{#value}}{{> tests/generateParams}}{{/value}} ] {{/isArray}} {{#isObject}} { {{#value}}{{> tests/generateParams}}{{/value}} } {{/isObject}} {{#isFreeFormObject}} {{#isAnyType}} { {{#value}}{{#entrySet}}"{{{key}}}":"{{{value}}}"{{^-last}},{{/-last}}{{/entrySet}}{{/value}} } {{/isAnyType}} {{^isAnyType}} { {{#value}}{{> tests/generateParams}}{{/value}} } {{/isAnyType}} {{/isFreeFormObject}} \ No newline at end of file diff --git a/templates/python/tests/requests/requests.mustache b/templates/python/tests/requests/requests.mustache index bbc00eba9ab..6136783dd95 100644 --- a/templates/python/tests/requests/requests.mustache +++ b/templates/python/tests/requests/requests.mustache @@ -30,7 +30,7 @@ class Test{{#lambda.pascalcase}}{{{client}}}{{/lambda.pascalcase}}{{#isSyncClien assert _req.query_parameters.items() == {{#queryParameters}}{{{.}}}{{/queryParameters}}{{^queryParameters}}{}{{/queryParameters}}.items() assert _req.headers.items() >= {{#headers}}{{{.}}}{{/headers}}{{^headers}}{}{{/headers}}.items() {{#body}} - assert loads(_req.data) == loads("""{{{.}}}""") + assert loads(_req.data) == loads("""{{#lambda.escapeSlash}}{{{.}}}{{/lambda.escapeSlash}}""") {{/body}} {{^body}} {{#assertNullBody}} diff --git a/templates/ruby/tests/generateInnerParams.mustache b/templates/ruby/tests/generateInnerParams.mustache index baa4d75522c..4616d52da67 100644 --- a/templates/ruby/tests/generateInnerParams.mustache +++ b/templates/ruby/tests/generateInnerParams.mustache @@ -1 +1 @@ -{{#isNull}}nil {{/isNull}}{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isString}}"{{{value}}}" {{/isString}}{{#isInteger}}{{{value}}} {{/isInteger}}{{#isLong}}{{{value}}} {{/isLong}}{{#isDouble}}{{{value}}} {{/isDouble}}{{#isBoolean}}{{{value}}} {{/isBoolean}} {{#isEnum}}'{{{value}}}' {{/isEnum}}{{#isArray}} [ {{#value}}{{> tests/generateParams}}{{/value}} ] {{/isArray}}{{#isObject}} Algolia::{{{modelModule}}}::{{{objectName}}}.new({{#value}}{{> tests/generateParams}}{{/value}}) {{/isObject}}{{#isFreeFormObject}} {{#isAnyType}} { {{#value}}{{#entrySet}}'{{{key}}}':"{{{value}}}"{{^-last}},{{/-last}}{{/entrySet}}{{/value}} } {{/isAnyType}} {{^isAnyType}} { {{#value}}{{> tests/generateParams}}{{/value}} } {{/isAnyType}} {{/isFreeFormObject}} \ No newline at end of file +{{#isNull}}nil {{/isNull}}{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isString}}"{{#lambda.escapeQuotes}}{{{value}}}{{/lambda.escapeQuotes}}" {{/isString}}{{#isInteger}}{{{value}}} {{/isInteger}}{{#isLong}}{{{value}}} {{/isLong}}{{#isDouble}}{{{value}}} {{/isDouble}}{{#isBoolean}}{{{value}}} {{/isBoolean}} {{#isEnum}}'{{{value}}}' {{/isEnum}}{{#isArray}} [ {{#value}}{{> tests/generateParams}}{{/value}} ] {{/isArray}}{{#isObject}} Algolia::{{{modelModule}}}::{{{objectName}}}.new({{#value}}{{> tests/generateParams}}{{/value}}) {{/isObject}}{{#isFreeFormObject}} {{#isAnyType}} { {{#value}}{{#entrySet}}'{{{key}}}':"{{{value}}}"{{^-last}},{{/-last}}{{/entrySet}}{{/value}} } {{/isAnyType}} {{^isAnyType}} { {{#value}}{{> tests/generateParams}}{{/value}} } {{/isAnyType}} {{/isFreeFormObject}} \ No newline at end of file diff --git a/templates/scala/tests/param_value.mustache b/templates/scala/tests/param_value.mustache index 3aa0254b077..bf8532d6ace 100644 --- a/templates/scala/tests/param_value.mustache +++ b/templates/scala/tests/param_value.mustache @@ -1 +1 @@ -{{#isNull}}null{{/isNull}}{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isString}}{{#oneOfModel}}{{{parentClassName}}}("{{{value}}}"){{/oneOfModel}}{{^oneOfModel}}"{{{value}}}"{{/oneOfModel}}{{/isString}}{{#isInteger}}{{#oneOfModel}}{{{parentClassName}}}({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isInteger}}{{#isLong}}{{#oneOfModel}}{{{parentClassName}}}({{{value}}}L){{/oneOfModel}}{{^oneOfModel}}{{{value}}}L{{/oneOfModel}}{{/isLong}}{{#isDouble}}{{#oneOfModel}}{{{parentClassName}}}({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isDouble}}{{#isBoolean}}{{#oneOfModel}}{{{parentClassName}}}({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isBoolean}}{{#isEnum}}{{{objectName}}}.withName("{{{value}}}"){{/isEnum}}{{#isArray}}{{> tests/param_list}}{{/isArray}}{{#isObject}}{{> tests/param_object}}{{/isObject}}{{#isFreeFormObject}}{{#isSimpleObject}}{{> tests/param_json_object}}{{/isSimpleObject}}{{^isSimpleObject}}{{#isAnyType}}{{> tests/param_json_any}}{{/isAnyType}}{{^isAnyType}}{{> tests/param_map}}{{/isAnyType}}{{/isSimpleObject}}{{/isFreeFormObject}} \ No newline at end of file +{{#isNull}}null{{/isNull}}{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isString}}{{#oneOfModel}}{{{parentClassName}}}("{{#lambda.escapeQuotes}}{{{value}}}{{/lambda.escapeQuotes}}"){{/oneOfModel}}{{^oneOfModel}}"{{#lambda.escapeQuotes}}{{{value}}}{{/lambda.escapeQuotes}}"{{/oneOfModel}}{{/isString}}{{#isInteger}}{{#oneOfModel}}{{{parentClassName}}}({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isInteger}}{{#isLong}}{{#oneOfModel}}{{{parentClassName}}}({{{value}}}L){{/oneOfModel}}{{^oneOfModel}}{{{value}}}L{{/oneOfModel}}{{/isLong}}{{#isDouble}}{{#oneOfModel}}{{{parentClassName}}}({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isDouble}}{{#isBoolean}}{{#oneOfModel}}{{{parentClassName}}}({{{value}}}){{/oneOfModel}}{{^oneOfModel}}{{{value}}}{{/oneOfModel}}{{/isBoolean}}{{#isEnum}}{{{objectName}}}.withName("{{{value}}}"){{/isEnum}}{{#isArray}}{{> tests/param_list}}{{/isArray}}{{#isObject}}{{> tests/param_object}}{{/isObject}}{{#isFreeFormObject}}{{#isSimpleObject}}{{> tests/param_json_object}}{{/isSimpleObject}}{{^isSimpleObject}}{{#isAnyType}}{{> tests/param_json_any}}{{/isAnyType}}{{^isAnyType}}{{> tests/param_map}}{{/isAnyType}}{{/isSimpleObject}}{{/isFreeFormObject}} \ No newline at end of file diff --git a/templates/scala/tests/requests/requestOptionsParams.mustache b/templates/scala/tests/requests/requestOptionsParams.mustache index c5f5f7643c1..91702623d85 100644 --- a/templates/scala/tests/requests/requestOptionsParams.mustache +++ b/templates/scala/tests/requests/requestOptionsParams.mustache @@ -2,7 +2,7 @@ null {{/isNull}} {{#isString}} - "{{{value}}}" + "{{#lambda.escapeQuotes}}{{{value}}}{{/lambda.escapeQuotes}}" {{/isString}} {{#isInteger}} {{{value}}} diff --git a/templates/swift/tests/client/tests.mustache b/templates/swift/tests/client/tests.mustache index 21ada3789dd..d9072620a09 100644 --- a/templates/swift/tests/client/tests.mustache +++ b/templates/swift/tests/client/tests.mustache @@ -29,7 +29,7 @@ {{/shouldScope}} {{#dynamicTemplate}}{{/dynamicTemplate}} {{#testUserAgent}} - let pattern = "{{#lambda.escapeSlash}}{{{match.value}}}{{/lambda.escapeSlash}}" + let pattern = "{{#lambda.escapeJSON}}{{{match.value}}}{{/lambda.escapeJSON}}" XCTAssertNoThrow(try regexMatch(echoResponse.algoliaAgent, against: pattern), "Expected " + echoResponse.algoliaAgent + " to match the following regex: " + pattern); {{/testUserAgent}} {{#testTimeouts}} diff --git a/templates/swift/tests/e2e/e2e.mustache b/templates/swift/tests/e2e/e2e.mustache index ad9ef581661..a40ec002903 100644 --- a/templates/swift/tests/e2e/e2e.mustache +++ b/templates/swift/tests/e2e/e2e.mustache @@ -66,7 +66,7 @@ final class {{client}}RequestsTestsE2E: XCTestCase { let responseBody = try XCTUnwrap(response.body) let responseBodyData = try CodableHelper.jsonEncoder.encode(responseBody) - let expectedBodyData = try XCTUnwrap("{{#lambda.escapeQuotes}}{{{body}}}{{/lambda.escapeQuotes}}".data(using: .utf8)) + let expectedBodyData = try XCTUnwrap("{{#lambda.escapeJSON}}{{{body}}}{{/lambda.escapeJSON}}".data(using: .utf8)) XCTLenientAssertEqual(received: responseBodyData, expected: expectedBodyData) {{/body}} diff --git a/templates/swift/tests/paramValue.mustache b/templates/swift/tests/paramValue.mustache index cf53215d082..90462b8d176 100644 --- a/templates/swift/tests/paramValue.mustache +++ b/templates/swift/tests/paramValue.mustache @@ -1 +1 @@ -{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isObject}}{{objectName}}({{^hasAdditionalProperties}}{{#value}}{{> tests/generateParams}}{{^-last}}, {{/-last}}{{/value}}{{/hasAdditionalProperties}}{{#hasAdditionalProperties}}from: [{{#value}}"{{key}}": AnyCodable({{> tests/paramValue }}){{^-last}}, {{/-last}}{{/value}}]{{/hasAdditionalProperties}}){{/isObject}}{{#isString}}{{#isAnyType}}AnyCodable({{/isAnyType}}"{{{value}}}"{{#isAnyType}}){{/isAnyType}}{{/isString}}{{#isNumber}}{{#isLong}}Int64({{/isLong}}{{{value}}}{{#isLong}}){{/isLong}}{{/isNumber}}{{#isBoolean}}{{{value}}}{{/isBoolean}}{{#isEnum}}{{objectName}}.{{#lambda.identifier}}{{#lambda.camelcase}}{{value}}{{/lambda.camelcase}}{{/lambda.identifier}}{{/isEnum}}{{#isArray}}[{{#value}}{{> tests/generateParams}}{{^-last}}, {{/-last}}{{/value}}]{{/isArray}}{{#isMap}}Map[{{{.}}}]{{/isMap}}{{#isFreeFormObject}}{{#isAnyType}}[{{#value}}{{#entrySet}}"{{key}}": "{{{value}}}"{{/entrySet}}{{/value}}]{{/isAnyType}}{{^isAnyType}}{{^value}}[String: AnyCodable](){{/value}}{{#value}}{{#-first}}[{{/-first}}{{> tests/generateParams}}{{^-last}}, {{/-last}}{{#-last}}]{{/-last}}{{/value}}{{/isAnyType}}{{/isFreeFormObject}}{{#isNull}}{{#inClientTest}}TestNull{{{objectName}}}(){{/inClientTest}}{{/isNull}} \ No newline at end of file +{{#isVerbatim}}{{{value}}}{{/isVerbatim}}{{#isObject}}{{objectName}}({{^hasAdditionalProperties}}{{#value}}{{> tests/generateParams}}{{^-last}}, {{/-last}}{{/value}}{{/hasAdditionalProperties}}{{#hasAdditionalProperties}}from: [{{#value}}"{{key}}": AnyCodable({{> tests/paramValue }}){{^-last}}, {{/-last}}{{/value}}]{{/hasAdditionalProperties}}){{/isObject}}{{#isString}}{{#isAnyType}}AnyCodable({{/isAnyType}}"{{#lambda.escapeQuotes}}{{{value}}}{{/lambda.escapeQuotes}}"{{#isAnyType}}){{/isAnyType}}{{/isString}}{{#isNumber}}{{#isLong}}Int64({{/isLong}}{{{value}}}{{#isLong}}){{/isLong}}{{/isNumber}}{{#isBoolean}}{{{value}}}{{/isBoolean}}{{#isEnum}}{{objectName}}.{{#lambda.identifier}}{{#lambda.camelcase}}{{value}}{{/lambda.camelcase}}{{/lambda.identifier}}{{/isEnum}}{{#isArray}}[{{#value}}{{> tests/generateParams}}{{^-last}}, {{/-last}}{{/value}}]{{/isArray}}{{#isMap}}Map[{{{.}}}]{{/isMap}}{{#isFreeFormObject}}{{#isAnyType}}[{{#value}}{{#entrySet}}"{{key}}": "{{{value}}}"{{/entrySet}}{{/value}}]{{/isAnyType}}{{^isAnyType}}{{^value}}[String: AnyCodable](){{/value}}{{#value}}{{#-first}}[{{/-first}}{{> tests/generateParams}}{{^-last}}, {{/-last}}{{#-last}}]{{/-last}}{{/value}}{{/isAnyType}}{{/isFreeFormObject}}{{#isNull}}{{#inClientTest}}TestNull{{{objectName}}}(){{/inClientTest}}{{/isNull}} \ No newline at end of file diff --git a/templates/swift/tests/requests/requests.mustache b/templates/swift/tests/requests/requests.mustache index 862a447a646..17b0d2ba77f 100644 --- a/templates/swift/tests/requests/requests.mustache +++ b/templates/swift/tests/requests/requests.mustache @@ -30,7 +30,7 @@ final class {{client}}RequestsTests: XCTestCase { let echoResponseBodyData = try XCTUnwrap(echoResponse.originalBodyData) let echoResponseBodyJSON = try XCTUnwrap(echoResponseBodyData.jsonString) - let expectedBodyData = "{{#lambda.escapeQuotes}}{{{body}}}{{/lambda.escapeQuotes}}".data(using: .utf8) + let expectedBodyData = "{{#lambda.escapeJSON}}{{{body}}}{{/lambda.escapeJSON}}".data(using: .utf8) let expectedBodyJSON = try XCTUnwrap(expectedBodyData?.jsonString) XCTAssertEqual(echoResponseBodyJSON, expectedBodyJSON) diff --git a/tests/CTS/requests/search/assignUserId.json b/tests/CTS/requests/search/assignUserId.json index a2a99688e29..6eab923bb82 100644 --- a/tests/CTS/requests/search/assignUserId.json +++ b/tests/CTS/requests/search/assignUserId.json @@ -1,19 +1,20 @@ [ { + "testName": "simple", "parameters": { - "xAlgoliaUserID": "userID", + "xAlgoliaUserID": "user42", "assignUserIdParams": { - "cluster": "theCluster" + "cluster": "d4242-eu" } }, "request": { "path": "/1/clusters/mapping", "method": "POST", "body": { - "cluster": "theCluster" + "cluster": "d4242-eu" }, "headers": { - "x-algolia-user-id": "userID" + "x-algolia-user-id": "user42" } } }, diff --git a/tests/CTS/requests/search/searchSingleIndex.json b/tests/CTS/requests/search/searchSingleIndex.json index 34fae33da6a..25efe5ea591 100644 --- a/tests/CTS/requests/search/searchSingleIndex.json +++ b/tests/CTS/requests/search/searchSingleIndex.json @@ -126,5 +126,657 @@ ] } } + }, + { + "testName": "query", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "query": "phone" + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "query": "phone" + } + } + }, + { + "testName": "filters", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "filters": "country:US AND price.gross < 2.0" + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "filters": "country:US AND price.gross < 2.0" + } + } + }, + { + "testName": "distinct", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "distinct": true + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "distinct": true + } + } + }, + { + "testName": "filtersNumeric", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "filters": "price < 10" + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "filters": "price < 10" + } + } + }, + { + "testName": "filtersTimestamp", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "filters": "NOT date_timestamp:1514764800 TO 1546300799" + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "filters": "NOT date_timestamp:1514764800 TO 1546300799" + } + } + }, + { + "testName": "filtersSumOrFiltersScoresFalse", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "filters": "(company:Google OR company:Amazon OR company:Facebook)", + "sumOrFiltersScores": false + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "filters": "(company:Google OR company:Amazon OR company:Facebook)", + "sumOrFiltersScores": false + } + } + }, + { + "testName": "filtersSumOrFiltersScoresTrue", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "filters": "(company:Google OR company:Amazon OR company:Facebook)", + "sumOrFiltersScores": true + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "filters": "(company:Google OR company:Amazon OR company:Facebook)", + "sumOrFiltersScores": true + } + } + }, + { + "testName": "filtersStephenKing", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "filters": "author:\"Stephen King\"" + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "filters": "author:\"Stephen King\"" + } + } + }, + { + "testName": "filtersNotTags", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "filters": "NOT _tags:non-fiction" + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "filters": "NOT _tags:non-fiction" + } + } + }, + { + "testName": "facetFiltersList", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "facetFilters": [ + "publisher:Penguin", + [ + "author:Stephen King", + "genre:Horror" + ] + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "facetFilters": [ + "publisher:Penguin", + [ + "author:Stephen King", + "genre:Horror" + ] + ] + } + } + }, + { + "testName": "facetFiltersNeg", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "facetFilters": "category:-Ebook" + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "facetFilters": "category:-Ebook" + } + } + }, + { + "testName": "filtersAndFacetFilters", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "filters": "(author:\"Stephen King\" OR genre:\"Horror\")", + "facetFilters": [ + "publisher:Penguin" + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "filters": "(author:\"Stephen King\" OR genre:\"Horror\")", + "facetFilters": [ + "publisher:Penguin" + ] + } + } + }, + { + "testName": "aroundLatLng", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "aroundLatLng": "40.71, -74.01" + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "aroundLatLng": "40.71, -74.01" + } + } + }, + { + "testName": "aroundLatLngViaIP", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "aroundLatLngViaIP": true + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "aroundLatLngViaIP": true + } + } + }, + { + "testName": "aroundRadius", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "aroundLatLng": "40.71, -74.01", + "aroundRadius": 1000000 + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "aroundLatLng": "40.71, -74.01", + "aroundRadius": 1000000 + } + } + }, + { + "testName": "insideBoundingBox", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "insideBoundingBox": [ + [ + 49.067996905313834, + 65.73828125, + 25.905859247243498, + 128.8046875 + ] + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "insideBoundingBox": [ + [ + 49.067996905313834, + 65.73828125, + 25.905859247243498, + 128.8046875 + ] + ] + } + } + }, + { + "testName": "insidePolygon", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "insidePolygon": [ + [ + 42.01, + -124.31, + 48.835509470063045, + -124.40453125000005, + 45.01082951668149, + -65.95726562500005, + 31.247243545293433, + -81.06578125000004, + 25.924152577235226, + -97.68234374999997, + 32.300311895879545, + -117.54828125 + ] + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "insidePolygon": [ + [ + 42.01, + -124.31, + 48.835509470063045, + -124.40453125000005, + 45.01082951668149, + -65.95726562500005, + 31.247243545293433, + -81.06578125000004, + 25.924152577235226, + -97.68234374999997, + 32.300311895879545, + -117.54828125 + ] + ] + } + } + }, + { + "testName": "insidePolygon", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "insidePolygon": [ + [ + 42.01, + -124.31, + 48.835509470063045, + -124.40453125000005, + 45.01082951668149, + -65.95726562500005, + 31.247243545293433, + -81.06578125000004, + 25.924152577235226, + -97.68234374999997, + 32.300311895879545, + -117.54828125 + ] + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "insidePolygon": [ + [ + 42.01, + -124.31, + 48.835509470063045, + -124.40453125000005, + 45.01082951668149, + -65.95726562500005, + 31.247243545293433, + -81.06578125000004, + 25.924152577235226, + -97.68234374999997, + 32.300311895879545, + -117.54828125 + ] + ] + } + } + }, + { + "testName": "optionalFilters", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "optionalFilters": [ + "can_deliver_quickly:true" + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "optionalFilters": [ + "can_deliver_quickly:true" + ] + } + } + }, + { + "testName": "optionalFiltersMany", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "optionalFilters": [ + "brand:Apple", + "brand:Samsung", + "brand:-Huawei" + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "optionalFilters": [ + "brand:Apple", + "brand:Samsung", + "brand:-Huawei" + ] + } + } + }, + { + "testName": "optionalFiltersSimple", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "optionalFilters": [ + "brand:Apple", + "type:tablet" + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "optionalFilters": [ + "brand:Apple", + "type:tablet" + ] + } + } + }, + { + "testName": "restrictSearchableAttributes", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "restrictSearchableAttributes": [ + "title_fr" + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "restrictSearchableAttributes": [ + "title_fr" + ] + } + } + }, + { + "testName": "getRankingInfo", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "getRankingInfo": true + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "getRankingInfo": true + } + } + }, + { + "testName": "clickAnalytics", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "clickAnalytics": true + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "clickAnalytics": true + } + } + }, + { + "testName": "clickAnalyticsUserToken", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "clickAnalytics": true, + "userToken": "user-1" + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "clickAnalytics": true, + "userToken": "user-1" + } + } + }, + { + "testName": "enablePersonalization", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "enablePersonalization": true, + "userToken": "user-1" + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "enablePersonalization": true, + "userToken": "user-1" + } + } + }, + { + "testName": "userToken", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "userToken": "user-1" + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "userToken": "user-1" + } + } + }, + { + "testName": "analyticsTag", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "analyticsTags": [ + "YOUR_ANALYTICS_TAG" + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "analyticsTags": [ + "YOUR_ANALYTICS_TAG" + ] + } + } + }, + { + "testName": "facetFiltersUsers", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "facetFilters": [ + "user:user42", + "user:public" + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "facetFilters": [ + "user:user42", + "user:public" + ] + } + } + }, + { + "testName": "buildTheQuery", + "isSnippet": true, + "parameters": { + "indexName": "indexName", + "searchParams": { + "filters": "categoryPageId: Men's Clothing", + "hitsPerPage": 50, + "analyticsTags": [ + "mens-clothing" + ] + } + }, + "request": { + "path": "/1/indexes/indexName/query", + "method": "POST", + "body": { + "filters": "categoryPageId: Men's Clothing", + "hitsPerPage": 50, + "analyticsTags": [ + "mens-clothing" + ] + } + } } ]