diff --git a/docker-compose.yml b/docker-compose.yml index 403fc57a383..b82d4f42a4f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,8 @@ services: - PHP_VERSION=${PHP_VERSION} - PYTHON_VERSION=${PYTHON_VERSION} command: tail -f /dev/null - volumes: [./:/app] + volumes: [ ./:/app ] + ruby: container_name: apic_ruby build: @@ -24,7 +25,8 @@ services: - NODE_VERSION=${NODE_VERSION} - RUBY_VERSION=${RUBY_VERSION} command: tail -f /dev/null - volumes: [./:/app] + volumes: [ ./:/app ] + swift: container_name: apic_swift build: @@ -35,4 +37,4 @@ services: - NODE_VERSION=${NODE_VERSION} - SWIFT_VERSION=${SWIFT_VERSION} command: tail -f /dev/null - volumes: [./:/app] + volumes: [ ./:/app ] diff --git a/generators/src/main/java/com/algolia/codegen/cts/tests/TestsGenerator.java b/generators/src/main/java/com/algolia/codegen/cts/tests/TestsGenerator.java index e98cbf19d99..b312a4defe8 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/tests/TestsGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/cts/tests/TestsGenerator.java @@ -95,20 +95,11 @@ protected Map loadFullCTS(Class jsonType) throws Exception private String injectVariables(String json) { long threeDays = 3 * 24 * 60 * 60 * 1000; - json = json + return json .replace("${{language}}", language) .replace("${{languageCased}}", ctsManager.getLanguageCased()) .replace("${{languageVersion}}", ctsManager.getVersion()) .replace("${{clientPascalCase}}", Helpers.capitalize(Helpers.camelize(client))) .replace("\"${{nowRounded}}\"", String.valueOf(Math.round(System.currentTimeMillis() / threeDays) * threeDays)); - - if (!language.equals("javascript") && !"true".equals(System.getenv("CI"))) { - // hack for docker on mac, the `network=host` does not work so we need to use - // another local IP - json = json.replace("${{localhost}}", "host.docker.internal"); - } else { - json = json.replace("${{localhost}}", "localhost"); - } - return json; } } diff --git a/scripts/cts/testServer/timeout.ts b/scripts/cts/testServer/timeout.ts index cc114904d22..61c710a55ab 100644 --- a/scripts/cts/testServer/timeout.ts +++ b/scripts/cts/testServer/timeout.ts @@ -42,7 +42,7 @@ export function assertValidTimeouts(expectedCount: number): void { break; default: // the delay should be the same, because the `retryCount` is per host instead of global - expect(state.duration[3 * i]).to.be.closeTo(state.duration[3 * i + 1], 100); + expect(state.duration[3 * i]).to.be.closeTo(state.duration[3 * i + 1], 150); break; } } diff --git a/templates/csharp/tests/client/createClient.mustache b/templates/csharp/tests/client/createClient.mustache index bf9459c1b42..41e5c9a449d 100644 --- a/templates/csharp/tests/client/createClient.mustache +++ b/templates/csharp/tests/client/createClient.mustache @@ -4,7 +4,7 @@ { {{#customHosts}}new () { Scheme = HttpScheme.Http, - Url = "{{host}}", + Url = Environment.GetEnvironmentVariable("CI") == "true" ? "localhost" : "host.docker.internal", Port = {{port}}, Up = true, LastUse = DateTime.UtcNow, diff --git a/templates/csharp/tests/e2e/e2e.mustache b/templates/csharp/tests/e2e/e2e.mustache index 61fcb2a2b94..037b35631e1 100644 --- a/templates/csharp/tests/e2e/e2e.mustache +++ b/templates/csharp/tests/e2e/e2e.mustache @@ -19,7 +19,7 @@ namespace Algolia.Search.e2e; public class {{client}}RequestTestsE2E { -private readonly {{client}} client; + private readonly {{client}} client; public {{client}}RequestTestsE2E() { diff --git a/templates/dart/tests/client/client.mustache b/templates/dart/tests/client/client.mustache index 41a52cad1c9..d7fe1bd07f5 100644 --- a/templates/dart/tests/client/client.mustache +++ b/templates/dart/tests/client/client.mustache @@ -3,6 +3,7 @@ import '{{{import}}}'; import 'package:algolia_test/algolia_test.dart'; import 'package:test/test.dart'; import 'package:test_api/hooks.dart'; +import 'dart:io' show Platform; void main() { {{#blocksClient}} diff --git a/templates/dart/tests/client/createClient.mustache b/templates/dart/tests/client/createClient.mustache index dc483870c70..92e3b068b25 100644 --- a/templates/dart/tests/client/createClient.mustache +++ b/templates/dart/tests/client/createClient.mustache @@ -1 +1 @@ -{{^autoCreateClient}}final client = {{/autoCreateClient}}{{client}}(appId : "{{parametersWithDataTypeMap.appId.value}}", apiKey : "{{parametersWithDataTypeMap.apiKey.value}}",{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}}region: '{{parametersWithDataTypeMap.region.value}}',{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}options: ClientOptions({{#useEchoRequester}}requester: requester{{/useEchoRequester}}{{#hasCustomHosts}}hosts:[{{#customHosts}}Host.create(url: '{{host}}:{{port}}', scheme: 'http'),{{/customHosts}}]{{/hasCustomHosts}})); \ No newline at end of file +{{^autoCreateClient}}final client = {{/autoCreateClient}}{{client}}(appId : "{{parametersWithDataTypeMap.appId.value}}", apiKey : "{{parametersWithDataTypeMap.apiKey.value}}",{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}}region: '{{parametersWithDataTypeMap.region.value}}',{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}options: ClientOptions({{#useEchoRequester}}requester: requester{{/useEchoRequester}}{{#hasCustomHosts}}hosts:[{{#customHosts}}Host.create(url: (Platform.environment['CI'] == 'true' ? 'localhost' : 'host.docker.internal') + ':{{port}}', scheme: 'http'),{{/customHosts}}]{{/hasCustomHosts}})); \ No newline at end of file diff --git a/templates/go/tests/client/createClient.mustache b/templates/go/tests/client/createClient.mustache index 9239cc13d1e..5541e8e520f 100644 --- a/templates/go/tests/client/createClient.mustache +++ b/templates/go/tests/client/createClient.mustache @@ -6,7 +6,7 @@ cfg = {{clientPrefix}}.{{clientName}}Configuration{ Requester: echo, {{/useEchoRequester}} {{#hasCustomHosts}} - Hosts: []transport.StatefulHost{ {{#customHosts}}transport.NewStatefulHost("http", "{{host}}:{{port}}", call.IsReadWrite),{{/customHosts}} }, + Hosts: []transport.StatefulHost{ {{#customHosts}}transport.NewStatefulHost("http", tests.GetLocalhost() + ":{{port}}", call.IsReadWrite),{{/customHosts}} }, {{/hasCustomHosts}} {{#gzipEncoding}} Compression: compression.GZIP, diff --git a/templates/java/tests/client/createClient.mustache b/templates/java/tests/client/createClient.mustache index 70a8820674b..cf21b372f11 100644 --- a/templates/java/tests/client/createClient.mustache +++ b/templates/java/tests/client/createClient.mustache @@ -1 +1 @@ -{{^autoCreateClient}}{{client}} client = {{/autoCreateClient}}new {{client}}("{{parametersWithDataTypeMap.appId.value}}","{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}},"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#useEchoRequester}},withEchoRequester(){{/useEchoRequester}}{{#hasCustomHosts}},withCustomHosts(Arrays.asList({{#customHosts}}new Host("{{host}}", EnumSet.of(CallType.READ, CallType.WRITE), "http", {{port}}){{^-last}},{{/-last}}{{/customHosts}}), {{gzipEncoding}}){{/hasCustomHosts}}); \ No newline at end of file +{{^autoCreateClient}}{{client}} client = {{/autoCreateClient}}new {{client}}("{{parametersWithDataTypeMap.appId.value}}","{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}},"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#useEchoRequester}},withEchoRequester(){{/useEchoRequester}}{{#hasCustomHosts}},withCustomHosts(Arrays.asList({{#customHosts}}new Host("true".equals(System.getenv("CI")) ? "localhost" : "host.docker.internal", EnumSet.of(CallType.READ, CallType.WRITE), "http", {{port}}){{^-last}},{{/-last}}{{/customHosts}}), {{gzipEncoding}}){{/hasCustomHosts}}); \ No newline at end of file diff --git a/templates/javascript/tests/client/createClient.mustache b/templates/javascript/tests/client/createClient.mustache index 936b2c2356f..9dce93298c9 100644 --- a/templates/javascript/tests/client/createClient.mustache +++ b/templates/javascript/tests/client/createClient.mustache @@ -1 +1 @@ -{{^autoCreateClient}}const client = {{/autoCreateClient}}{{client}}('{{parametersWithDataTypeMap.appId.value}}','{{parametersWithDataTypeMap.apiKey.value}}',{{#hasRegionalHost}}'{{parametersWithDataTypeMap.region.value}}',{{/hasRegionalHost}}{ {{#useEchoRequester}}requester: nodeEchoRequester(),{{/useEchoRequester}}{{#hasCustomHosts}}hosts:[{{#customHosts}}{ url: '{{host}}', port: {{port}}, accept: 'readWrite', protocol: 'http' },{{/customHosts}}]{{/hasCustomHosts}} }); \ No newline at end of file +{{^autoCreateClient}}const client = {{/autoCreateClient}}{{client}}('{{parametersWithDataTypeMap.appId.value}}','{{parametersWithDataTypeMap.apiKey.value}}',{{#hasRegionalHost}}'{{parametersWithDataTypeMap.region.value}}',{{/hasRegionalHost}}{ {{#useEchoRequester}}requester: nodeEchoRequester(),{{/useEchoRequester}}{{#hasCustomHosts}}hosts:[{{#customHosts}}{ url: 'localhost', port: {{port}}, accept: 'readWrite', protocol: 'http' },{{/customHosts}}]{{/hasCustomHosts}} }); \ No newline at end of file diff --git a/templates/kotlin/tests/client/createClient.mustache b/templates/kotlin/tests/client/createClient.mustache index b5ff09fd0a4..54eb24ca605 100644 --- a/templates/kotlin/tests/client/createClient.mustache +++ b/templates/kotlin/tests/client/createClient.mustache @@ -1 +1 @@ -{{^autoCreateClient}}val client = {{/autoCreateClient}}{{client}}(appId = "{{parametersWithDataTypeMap.appId.value}}", apiKey = "{{parametersWithDataTypeMap.apiKey.value}}",{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}}"{{parametersWithDataTypeMap.region.value}}",{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#hasCustomHosts}}options = ClientOptions(hosts = listOf({{#customHosts}}Host(url = "{{host}}", protocol = "http", port = {{port}}){{^-last}},{{/-last}}{{/customHosts}}){{#gzipEncoding}}, compressionType = CompressionType.GZIP{{/gzipEncoding}}){{/hasCustomHosts}}) \ No newline at end of file +{{^autoCreateClient}}val client = {{/autoCreateClient}}{{client}}(appId = "{{parametersWithDataTypeMap.appId.value}}", apiKey = "{{parametersWithDataTypeMap.apiKey.value}}",{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}}"{{parametersWithDataTypeMap.region.value}}",{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#hasCustomHosts}}options = ClientOptions(hosts = listOf({{#customHosts}}Host(url = if (System.getenv("CI") == "true") "localhost" else "host.docker.internal", protocol = "http", port = {{port}}){{^-last}},{{/-last}}{{/customHosts}}){{#gzipEncoding}}, compressionType = CompressionType.GZIP{{/gzipEncoding}}){{/hasCustomHosts}}) \ No newline at end of file diff --git a/templates/kotlin/tests/client/tests.mustache b/templates/kotlin/tests/client/tests.mustache index 5be4b6e026e..f808270fc6b 100644 --- a/templates/kotlin/tests/client/tests.mustache +++ b/templates/kotlin/tests/client/tests.mustache @@ -11,7 +11,7 @@ fun `{{#lambda.replaceBacktick}}{{{testName}}}{{/lambda.replaceBacktick}}`() = r {{#isError}} assertFails { {{#dynamicTemplate}}{{/dynamicTemplate}} - }.let { error -> assertError(error, "{{{expectedError}}}") } + }.let { error -> assertError(error, "{{{expectedError}}}".replace("%localhost%", if (System.getenv("CI") == "true") "localhost" else "host.docker.internal")) } {{/isError}} {{^isError}} {{#isCreateClient}} diff --git a/templates/php/tests/client/createClient.mustache b/templates/php/tests/client/createClient.mustache index 7f604abf39e..d5dd9af08aa 100644 --- a/templates/php/tests/client/createClient.mustache +++ b/templates/php/tests/client/createClient.mustache @@ -5,5 +5,5 @@ $client = $this->createClient( {{#parametersWithDataTypeMap.region}}"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{^parametersWithDataTypeMap.region}}null{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}} ); {{^isError}}$this->assertIsObject($client);{{/isError}}{{/useEchoRequester}}{{#hasCustomHosts}} -$client = {{client}}::createWithConfig({{clientPrefix}}Config::create("{{parametersWithDataTypeMap.appId.value}}","{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}},"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}})->setFullHosts([{{#customHosts}}"http://{{host}}:{{port}}"{{^-last}},{{/-last}}{{/customHosts}}])); +$client = {{client}}::createWithConfig({{clientPrefix}}Config::create("{{parametersWithDataTypeMap.appId.value}}","{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}},"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}})->setFullHosts([{{#customHosts}}"http://" . (getenv("CI") == "true" ? "localhost" : "host.docker.internal") . ":{{port}}"{{^-last}},{{/-last}}{{/customHosts}}])); {{/hasCustomHosts}} \ No newline at end of file diff --git a/templates/python/tests/client/createClient.mustache b/templates/python/tests/client/createClient.mustache index e384fd73799..870bf423ecd 100644 --- a/templates/python/tests/client/createClient.mustache +++ b/templates/python/tests/client/createClient.mustache @@ -1,5 +1,5 @@ _config = {{#lambda.pascalcase}}{{clientPrefix}}Config{{/lambda.pascalcase}}("{{parametersWithDataTypeMap.appId.value}}", "{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}},"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}) {{#hasCustomHosts}} - {{#isError}} {{/isError}}_config.hosts = HostsCollection([{{#customHosts}}Host(url='{{host}}', scheme='http', port={{port}}){{^-last}},{{/-last}}{{/customHosts}}]) + {{#isError}} {{/isError}}_config.hosts = HostsCollection([{{#customHosts}}Host(url='localhost' if environ.get('CI') == 'true' else 'host.docker.internal', scheme='http', port={{port}}){{^-last}},{{/-last}}{{/customHosts}}]) {{/hasCustomHosts}} {{#isError}} {{/isError}}_client = {{#lambda.pascalcase}}{{{client}}}{{/lambda.pascalcase}}{{#isSyncClient}}Sync{{/isSyncClient}}.create_with_config(config=_config{{#useEchoRequester}}, transporter=EchoTransporter{{#isSyncClient}}Sync{{/isSyncClient}}(_config){{/useEchoRequester}}) \ No newline at end of file diff --git a/templates/ruby/tests/client/createClient.mustache b/templates/ruby/tests/client/createClient.mustache index 069874342ea..2fa4ab9a21a 100644 --- a/templates/ruby/tests/client/createClient.mustache +++ b/templates/ruby/tests/client/createClient.mustache @@ -2,7 +2,7 @@ client = Algolia::{{#lambda.pascalcase}}{{{client}}}{{/lambda.pascalcase}}.create_with_config(Algolia::Configuration.new( '{{parametersWithDataTypeMap.appId.value}}', '{{parametersWithDataTypeMap.apiKey.value}}', - [{{#customHosts}}Algolia::Transport::StatefulHost.new('{{host}}', protocol: 'http://', port: {{port}}, accept: CallType::READ | CallType::WRITE),{{/customHosts}}], + [{{#customHosts}}Algolia::Transport::StatefulHost.new(ENV.fetch('CI', nil) == 'true' ? 'localhost' : 'host.docker.internal', protocol: 'http://', port: {{port}}, accept: CallType::READ | CallType::WRITE),{{/customHosts}}], '{{client}}'{{#gzipEncoding}}, compression_type: 'gzip'{{/gzipEncoding}} )){{/hasCustomHosts}}{{^hasCustomHosts}} diff --git a/templates/ruby/tests/client/tests.mustache b/templates/ruby/tests/client/tests.mustache index 3b93e38fb07..d3250475db0 100644 --- a/templates/ruby/tests/client/tests.mustache +++ b/templates/ruby/tests/client/tests.mustache @@ -18,7 +18,7 @@ {{#dynamicTemplate}}{{/dynamicTemplate}} assert(false, 'An error should have been raised') rescue => e - assert_equal({{#lambda.codeSnakeCase}}'{{{expectedError}}}'{{/lambda.codeSnakeCase}}, e.message) + assert_equal({{#lambda.codeSnakeCase}}'{{{expectedError}}}'{{/lambda.codeSnakeCase}}.sub('%localhost%', ENV.fetch('CI', nil) == 'true' ? 'localhost' : 'host.docker.internal'), e.message) end {{/isError}} {{^isError}} diff --git a/templates/scala/tests/client/createClient.mustache b/templates/scala/tests/client/createClient.mustache index 4ce8353df12..c2667107ae5 100644 --- a/templates/scala/tests/client/createClient.mustache +++ b/templates/scala/tests/client/createClient.mustache @@ -6,7 +6,7 @@ val client = {{client}}( {{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}} region = {{#fallbackToAliasHost}}Option({{/fallbackToAliasHost}}"{{value}}"{{#fallbackToAliasHost}}){{/fallbackToAliasHost}},{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}} clientOptions = ClientOptions .builder() - .withHosts(List({{#customHosts}}Host("{{host}}", Set(CallType.Read, CallType.Write), "http", Option({{port}})){{^-last}},{{/-last}}{{/customHosts}})) + .withHosts(List({{#customHosts}}Host(if (System.getenv("CI") == "true") "localhost" else "host.docker.internal", Set(CallType.Read, CallType.Write), "http", Option({{port}})){{^-last}},{{/-last}}{{/customHosts}})) {{#gzipEncoding}}.withCompressionType(CompressionType.Gzip){{/gzipEncoding}} .build() ) diff --git a/templates/swift/tests/client/createClient.mustache b/templates/swift/tests/client/createClient.mustache index 88c53eef9b2..8092d301eed 100644 --- a/templates/swift/tests/client/createClient.mustache +++ b/templates/swift/tests/client/createClient.mustache @@ -1,3 +1,3 @@ -let configuration = try {{client}}Configuration(appID: "{{parametersWithDataTypeMap.appId.value}}", apiKey: "{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}, region: {{#parametersWithDataTypeMap.region}}Region(rawValue: "{{parametersWithDataTypeMap.region.value}}"){{/parametersWithDataTypeMap.region}}{{^parametersWithDataTypeMap.region}}nil{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#hasCustomHosts}}, hosts: [{{#customHosts}}RetryableHost(url: URL(string: "http://{{host}}:{{port}}")!){{^-last}}, {{/-last}}{{/customHosts}}]{{/hasCustomHosts}}{{#gzipEncoding}}, compression: .gzip{{/gzipEncoding}}) +let configuration = try {{client}}Configuration(appID: "{{parametersWithDataTypeMap.appId.value}}", apiKey: "{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}, region: {{#parametersWithDataTypeMap.region}}Region(rawValue: "{{parametersWithDataTypeMap.region.value}}"){{/parametersWithDataTypeMap.region}}{{^parametersWithDataTypeMap.region}}nil{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#hasCustomHosts}}, hosts: [{{#customHosts}}RetryableHost(url: URL(string: "http://" + (ProcessInfo.processInfo.environment["CI"] == "true" ? "localhost" : "host.docker.internal") + ":{{port}}")!){{^-last}}, {{/-last}}{{/customHosts}}]{{/hasCustomHosts}}{{#gzipEncoding}}, compression: .gzip{{/gzipEncoding}}) let transporter: Transporter = Transporter(configuration: configuration{{#useEchoRequester}}, requestBuilder: EchoRequestBuilder(){{/useEchoRequester}}) {{^autoCreateClient}}let client = {{/autoCreateClient}}{{client}}(configuration: configuration, transporter: transporter) \ No newline at end of file diff --git a/tests/CTS/benchmark/search/benchmark.json b/tests/CTS/benchmark/search/benchmark.json index ec377060591..7ffe423d006 100644 --- a/tests/CTS/benchmark/search/benchmark.json +++ b/tests/CTS/benchmark/search/benchmark.json @@ -10,7 +10,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6682 } ] diff --git a/tests/CTS/client/common/setClientApiKey.json b/tests/CTS/client/common/setClientApiKey.json index 42c390b8c2f..2ede7b6edca 100644 --- a/tests/CTS/client/common/setClientApiKey.json +++ b/tests/CTS/client/common/setClientApiKey.json @@ -11,7 +11,6 @@ "region": "us", "customHosts": [ { - "host": "${{localhost}}", "port": 6683 } ] diff --git a/tests/CTS/client/search/api.json b/tests/CTS/client/search/api.json index b90d7d13aec..af612321674 100644 --- a/tests/CTS/client/search/api.json +++ b/tests/CTS/client/search/api.json @@ -82,15 +82,12 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6676 }, { - "host": "${{localhost}}", "port": 6677 }, { - "host": "${{localhost}}", "port": 6678 } ] @@ -122,7 +119,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6676 } ] @@ -144,7 +140,7 @@ "kotlin": "Error(s) while processing the retry strategy", "php": "Impossible to connect, please check your Algolia Application Id.", "python": "Unreachable hosts", - "ruby": "Unreachable hosts. Last error for ${{localhost}}: Net::ReadTimeout with #", + "ruby": "Unreachable hosts. Last error for %localhost%: Net::ReadTimeout with #", "scala": "Error(s) while processing the retry strategy", "swift": "All hosts are unreachable. You can use 'exposeIntermediateErrors: true' in the config to investigate." } @@ -163,7 +159,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6678 } ], diff --git a/tests/CTS/client/search/deleteObjects.json b/tests/CTS/client/search/deleteObjects.json index 5a807fcdc69..969346e7de2 100644 --- a/tests/CTS/client/search/deleteObjects.json +++ b/tests/CTS/client/search/deleteObjects.json @@ -10,7 +10,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6680 } ] diff --git a/tests/CTS/client/search/indexExists.json b/tests/CTS/client/search/indexExists.json index f42c7f89633..ab609f9d6f9 100644 --- a/tests/CTS/client/search/indexExists.json +++ b/tests/CTS/client/search/indexExists.json @@ -10,7 +10,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6681 } ] @@ -40,7 +39,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6681 } ] @@ -70,7 +68,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6681 } ] @@ -88,7 +85,7 @@ "go": "API error [403] {\\\"message\\\":\\\"Invalid API key\\\"}", "java": "Status Code: 403 - {\\\"message\\\":\\\"Invalid API key\\\"}", "javascript": "Invalid API key", - "kotlin": "Client request(GET http://${{localhost}}:6681/1/indexes/indexExistsERROR/settings) invalid: 403 Forbidden. Text: \\\"{\\\"message\\\":\\\"Invalid API key\\\"}\\\"", + "kotlin": "Client request(GET http://%localhost%:6681/1/indexes/indexExistsERROR/settings) invalid: 403 Forbidden. Text: \\\"{\\\"message\\\":\\\"Invalid API key\\\"}\\\"", "php": "Invalid API key", "python": "Invalid API key", "ruby": "Invalid API key", diff --git a/tests/CTS/client/search/partialUpdateObjects.json b/tests/CTS/client/search/partialUpdateObjects.json index 56f9a5d9887..768c610444e 100644 --- a/tests/CTS/client/search/partialUpdateObjects.json +++ b/tests/CTS/client/search/partialUpdateObjects.json @@ -10,7 +10,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6680 } ] @@ -59,7 +58,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6680 } ] diff --git a/tests/CTS/client/search/replaceAllObjects.json b/tests/CTS/client/search/replaceAllObjects.json index e2dff2b0979..372d75953ff 100644 --- a/tests/CTS/client/search/replaceAllObjects.json +++ b/tests/CTS/client/search/replaceAllObjects.json @@ -10,7 +10,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6679 } ] diff --git a/tests/CTS/client/search/saveObjects.json b/tests/CTS/client/search/saveObjects.json index 6c44b57aa4c..b461f75cd50 100644 --- a/tests/CTS/client/search/saveObjects.json +++ b/tests/CTS/client/search/saveObjects.json @@ -10,7 +10,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6680 } ] @@ -58,7 +57,6 @@ "apiKey": "wrong-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6680 } ] @@ -86,7 +84,7 @@ "go": "API error [403] {\\\"message\\\":\\\"Invalid Application-ID or API key\\\",\\\"status\\\":403}", "java": "Status Code: 403 - {\\\"message\\\":\\\"Invalid Application-ID or API key\\\",\\\"status\\\":403}", "javascript": "Invalid Application-ID or API key", - "kotlin": "Client request(POST http://${{localhost}}:6680/1/indexes/cts_e2e_saveObjects_kotlin/batch) invalid: 403 Forbidden. Text: \\\"{\\\"message\\\":\\\"Invalid Application-ID or API key\\\",\\\"status\\\":403}\\\"", + "kotlin": "Client request(POST http://%localhost%:6680/1/indexes/cts_e2e_saveObjects_kotlin/batch) invalid: 403 Forbidden. Text: \\\"{\\\"message\\\":\\\"Invalid Application-ID or API key\\\",\\\"status\\\":403}\\\"", "php": "Invalid Application-ID or API key", "python": "Invalid Application-ID or API key", "ruby": "Invalid Application-ID or API key", diff --git a/tests/CTS/client/search/waitForApiKey.json b/tests/CTS/client/search/waitForApiKey.json index 9d3339cdf90..42170b31b97 100644 --- a/tests/CTS/client/search/waitForApiKey.json +++ b/tests/CTS/client/search/waitForApiKey.json @@ -10,7 +10,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6681 } ] @@ -52,7 +51,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6681 } ] @@ -122,7 +120,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6681 } ] diff --git a/tests/CTS/client/search/waitForAppTask.json b/tests/CTS/client/search/waitForAppTask.json index c9bba741170..b3e737f5271 100644 --- a/tests/CTS/client/search/waitForAppTask.json +++ b/tests/CTS/client/search/waitForAppTask.json @@ -10,7 +10,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6681 } ] diff --git a/tests/CTS/client/search/waitForTask.json b/tests/CTS/client/search/waitForTask.json index 08af95e1058..ad17698eb56 100644 --- a/tests/CTS/client/search/waitForTask.json +++ b/tests/CTS/client/search/waitForTask.json @@ -10,7 +10,6 @@ "apiKey": "test-api-key", "customHosts": [ { - "host": "${{localhost}}", "port": 6681 } ] diff --git a/tests/output/csharp/src/ClientExtensionsTests.cs b/tests/output/csharp/src/ClientExtensionsTests.cs index 9bc90732a8f..b399fbb096c 100644 --- a/tests/output/csharp/src/ClientExtensionsTests.cs +++ b/tests/output/csharp/src/ClientExtensionsTests.cs @@ -44,7 +44,7 @@ public async Task ShouldWaitForTask() Encoding.UTF8.GetBytes( serializer.Serialize(new GetTaskResponse { Status = TaskStatus.NotPublished }) ) - ) + ), } ) ) @@ -58,7 +58,7 @@ public async Task ShouldWaitForTask() Encoding.UTF8.GetBytes( serializer.Serialize(new GetTaskResponse { Status = TaskStatus.Published }) ) - ) + ), } ) ); @@ -113,11 +113,11 @@ public async Task ShouldBrowseObjects() Page = 0, ProcessingTimeMS = 1, Query = "", - Params = "" + Params = "", } ) ) - ) + ), } ) ) @@ -140,11 +140,11 @@ public async Task ShouldBrowseObjects() Page = 0, ProcessingTimeMS = 1, Query = "", - Params = "" + Params = "", } ) ) - ) + ), } ) ) @@ -167,11 +167,11 @@ public async Task ShouldBrowseObjects() Page = 0, ProcessingTimeMS = 1, Query = "", - Params = "" + Params = "", } ) ) - ) + ), } ) ); @@ -227,13 +227,13 @@ public async Task ShouldBrowseSynonyms() Hits = new List() { new() { ObjectID = "XXX", Type = SynonymType.Altcorrection1 }, - new() { ObjectID = "XXX", Type = SynonymType.Altcorrection1 } + new() { ObjectID = "XXX", Type = SynonymType.Altcorrection1 }, }, // Not 1000 but it doesn't matter NbHits = 1000, } ) ) - ) + ), } ) ) @@ -251,13 +251,13 @@ public async Task ShouldBrowseSynonyms() Hits = new List() { new() { ObjectID = "XXX", Type = SynonymType.Altcorrection1 }, - new() { ObjectID = "XXX", Type = SynonymType.Altcorrection1 } + new() { ObjectID = "XXX", Type = SynonymType.Altcorrection1 }, }, // Not 1000 but it doesn't matter NbHits = 1000, } ) ) - ) + ), } ) ) @@ -275,13 +275,13 @@ public async Task ShouldBrowseSynonyms() Hits = new List { new() { ObjectID = "XXX", Type = SynonymType.Altcorrection1 }, - new() { ObjectID = "XXX", Type = SynonymType.Altcorrection1 } + new() { ObjectID = "XXX", Type = SynonymType.Altcorrection1 }, }, // Not 1000 but it doesn't matter NbHits = 999, } ) ) - ) + ), } ) ); @@ -339,13 +339,13 @@ public async Task ShouldBrowseRules() Hits = new List { new() { ObjectID = "XXX" }, - new() { ObjectID = "XXX" } + new() { ObjectID = "XXX" }, }, // Not 1000 but it doesn't matter NbHits = 1000, } ) ) - ) + ), } ) ) @@ -365,13 +365,13 @@ public async Task ShouldBrowseRules() Hits = new List { new() { ObjectID = "XXX" }, - new() { ObjectID = "XXX" } + new() { ObjectID = "XXX" }, }, // Not 1000 but it doesn't matter NbHits = 1000, } ) ) - ) + ), } ) ) @@ -391,13 +391,13 @@ public async Task ShouldBrowseRules() Hits = new List { new() { ObjectID = "XXX" }, - new() { ObjectID = "XXX" } + new() { ObjectID = "XXX" }, }, // Not 1000 but it doesn't matter NbHits = 999, } ) ) - ) + ), } ) ); @@ -447,12 +447,12 @@ public async Task ShouldSearchForHits() [ new(new SearchForFacetValuesResponse() { FacetHits = new List() }), new(new SearchResponse { Hits = [new { ObjectID = "12345" }] }), - new(new SearchResponse { Hits = [new { ObjectID = "678910" }] }) + new(new SearchResponse { Hits = [new { ObjectID = "678910" }] }), ] ) ) ) - ) + ), } ) ); @@ -462,7 +462,7 @@ public async Task ShouldSearchForHits() var hits = await client.SearchForHitsAsync( new List { - new() { IndexName = "my-test-index", Query = " " } + new() { IndexName = "my-test-index", Query = " " }, }, SearchStrategy.None ); @@ -495,12 +495,12 @@ public async Task ShouldSearchForFacets() [ new(new SearchForFacetValuesResponse { FacetHits = [] }), new(new SearchResponse { Hits = [new { ObjectID = "12345" }] }), - new(new SearchResponse { Hits = [new { ObjectID = "678910" }] }) + new(new SearchResponse { Hits = [new { ObjectID = "678910" }] }), ] ) ) ) - ) + ), } ) ); @@ -510,7 +510,7 @@ public async Task ShouldSearchForFacets() var hits = await client.SearchForFacetsAsync( new List { - new() { IndexName = "my-test-index", Query = " " } + new() { IndexName = "my-test-index", Query = " " }, }, SearchStrategy.None ); diff --git a/tests/output/csharp/src/CompressionTests.cs b/tests/output/csharp/src/CompressionTests.cs index 28113ca4323..e880e717889 100644 --- a/tests/output/csharp/src/CompressionTests.cs +++ b/tests/output/csharp/src/CompressionTests.cs @@ -56,7 +56,7 @@ public async Task CanCompressRequestInGZip() { var searchConfig = new SearchConfig("test-app-id", "test-api-key") { - Compression = CompressionType.Gzip + Compression = CompressionType.Gzip, }; var client = new SearchClient(searchConfig, _echo); diff --git a/tests/output/csharp/src/RetryStrategyTests.cs b/tests/output/csharp/src/RetryStrategyTests.cs index 305636c907e..361355ffa74 100644 --- a/tests/output/csharp/src/RetryStrategyTests.cs +++ b/tests/output/csharp/src/RetryStrategyTests.cs @@ -66,9 +66,9 @@ public async Task CanOverrideHost() { Url = "myhost.com", Accept = CallType.Read, - Up = true - } - } + Up = true, + }, + }, }; var client = new SearchClient(searchConfig, httpMock.Object); @@ -101,12 +101,12 @@ public async Task CanOverrideHost() ProcessingTimeMS = 1, Hits = new List(), Query = "", - Params = "" + Params = "", }, JsonConfig.Options ) ) - ) + ), } ) ); diff --git a/tests/output/csharp/src/SecuredApiKeysTests.cs b/tests/output/csharp/src/SecuredApiKeysTests.cs index eede01dd4c8..b272aefbed9 100644 --- a/tests/output/csharp/src/SecuredApiKeysTests.cs +++ b/tests/output/csharp/src/SecuredApiKeysTests.cs @@ -18,7 +18,7 @@ public void ShouldDetectExpiredKey() var restriction = new SecuredApiKeyRestrictions { ValidUntil = new DateTimeOffset(DateTime.UtcNow.AddMinutes(-10)).ToUnixTimeSeconds(), - RestrictIndices = ["indexName"] + RestrictIndices = ["indexName"], }; var client = new SearchClient( @@ -39,7 +39,7 @@ public void ShouldDetectValidKey() var restriction = new SecuredApiKeyRestrictions { ValidUntil = new DateTimeOffset(DateTime.UtcNow.AddMinutes(10)).ToUnixTimeSeconds(), - RestrictIndices = ["indexName"] + RestrictIndices = ["indexName"], }; var client = new SearchClient( diff --git a/tests/output/csharp/src/Utils/EchoHttpRequester.cs b/tests/output/csharp/src/Utils/EchoHttpRequester.cs index 0c35691b32f..e07569ef993 100644 --- a/tests/output/csharp/src/Utils/EchoHttpRequester.cs +++ b/tests/output/csharp/src/Utils/EchoHttpRequester.cs @@ -69,7 +69,7 @@ public Task SendRequestAsync( QueryParameters = SplitQuery(request.Uri.Query), Headers = new Dictionary(request.Headers), ConnectTimeout = connectTimeout, - ResponseTimeout = requestTimeout + ResponseTimeout = requestTimeout, }; LastResponse = echo; diff --git a/tests/output/go/tests/echo.go b/tests/output/go/tests/echo.go index d1f2039eca7..4f1cde69eb0 100644 --- a/tests/output/go/tests/echo.go +++ b/tests/output/go/tests/echo.go @@ -5,6 +5,7 @@ import ( "io" "net/http" "net/url" + "os" "strings" "testing" "time" @@ -83,3 +84,11 @@ func Union(t *testing.T, expected any, received any) any { return received } } + +func GetLocalhost() string { + if os.Getenv("CI") != "true" { + return "host.docker.internal" + } + + return "localhost" +} diff --git a/tests/output/javascript/yarn.lock b/tests/output/javascript/yarn.lock index 4471ed20045..ab0fc334836 100644 --- a/tests/output/javascript/yarn.lock +++ b/tests/output/javascript/yarn.lock @@ -71,35 +71,6 @@ __metadata: languageName: node linkType: soft -"@babel/code-frame@npm:^7.12.13": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" - dependencies: - "@babel/highlight": "npm:^7.24.7" - picocolors: "npm:^1.0.0" - checksum: 10/4812e94885ba7e3213d49583a155fdffb05292330f0a9b2c41b49288da70cf3c746a3fda0bf1074041a6d741c33f8d7be24be5e96f41ef77395eeddc5c9ff624 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 10/86875063f57361471b531dbc2ea10bbf5406e12b06d249b03827d361db4cad2388c6f00936bcd9dc86479f7e2c69ea21412c2228d4b3672588b754b70a449d4b - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10/69b73f38cdd4f881b09b939a711e76646da34f4834f4ce141d7a49a6bb1926eab1c594148970a8aa9360398dff800f63aade4e81fafdd7c8d8a8489ea93bfec1 - languageName: node - linkType: hard - "@esbuild/aix-ppc64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/aix-ppc64@npm:0.21.5" @@ -275,38 +246,6 @@ __metadata: languageName: node linkType: hard -"@jest/expect-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect-utils@npm:29.7.0" - dependencies: - jest-get-type: "npm:^29.6.3" - checksum: 10/ef8d379778ef574a17bde2801a6f4469f8022a46a5f9e385191dc73bb1fc318996beaed4513fbd7055c2847227a1bed2469977821866534593a6e52a281499ee - languageName: node - linkType: hard - -"@jest/schemas@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/schemas@npm:29.6.3" - dependencies: - "@sinclair/typebox": "npm:^0.27.8" - checksum: 10/910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 - languageName: node - linkType: hard - -"@jest/types@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/types@npm:29.6.3" - dependencies: - "@jest/schemas": "npm:^29.6.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - "@types/istanbul-reports": "npm:^3.0.0" - "@types/node": "npm:*" - "@types/yargs": "npm:^17.0.8" - chalk: "npm:^4.0.0" - checksum: 10/f74bf512fd09bbe2433a2ad460b04668b7075235eea9a0c77d6a42222c10a79b9747dc2b2a623f140ed40d6865a2ed8f538f3cbb75169120ea863f29a7ed76cd - languageName: node - linkType: hard - "@jridgewell/sourcemap-codec@npm:^1.5.0": version: 1.5.0 resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" @@ -455,13 +394,6 @@ __metadata: languageName: node linkType: hard -"@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 10/297f95ff77c82c54de8c9907f186076e715ff2621c5222ba50b8d40a170661c0c5242c763cba2a4791f0f91cb1d8ffa53ea1d7294570cf8cd4694c0e383e484d - languageName: node - linkType: hard - "@types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" @@ -469,50 +401,6 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": - version: 2.0.6 - resolution: "@types/istanbul-lib-coverage@npm:2.0.6" - checksum: 10/3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 - languageName: node - linkType: hard - -"@types/istanbul-lib-report@npm:*": - version: 3.0.3 - resolution: "@types/istanbul-lib-report@npm:3.0.3" - dependencies: - "@types/istanbul-lib-coverage": "npm:*" - checksum: 10/b91e9b60f865ff08cb35667a427b70f6c2c63e88105eadd29a112582942af47ed99c60610180aa8dcc22382fa405033f141c119c69b95db78c4c709fbadfeeb4 - languageName: node - linkType: hard - -"@types/istanbul-reports@npm:^3.0.0": - version: 3.0.4 - resolution: "@types/istanbul-reports@npm:3.0.4" - dependencies: - "@types/istanbul-lib-report": "npm:*" - checksum: 10/93eb18835770b3431f68ae9ac1ca91741ab85f7606f310a34b3586b5a34450ec038c3eed7ab19266635499594de52ff73723a54a72a75b9f7d6a956f01edee95 - languageName: node - linkType: hard - -"@types/jest@npm:29.5.13": - version: 29.5.13 - resolution: "@types/jest@npm:29.5.13" - dependencies: - expect: "npm:^29.0.0" - pretty-format: "npm:^29.0.0" - checksum: 10/7d6e3e4ef4b1cab0f61270d55764709512fdfbcb1bd47c0ef44117d48490529c1f264dacf3440b9188363e99e290b80b79c529eadc3af2184116a90f6856b192 - languageName: node - linkType: hard - -"@types/node@npm:*": - version: 22.5.0 - resolution: "@types/node@npm:22.5.0" - dependencies: - undici-types: "npm:~6.19.2" - checksum: 10/89af3bd217b1559b645a9ed16d4ae3add75749814cbd8eefddd1b96003d1973afb1c8a2b23d69f3a8cc6c532e3aa185eaf5cc29a6e7c42c311a2aad4c99430ae - languageName: node - linkType: hard - "@types/node@npm:22.5.5": version: 22.5.5 resolution: "@types/node@npm:22.5.5" @@ -522,29 +410,6 @@ __metadata: languageName: node linkType: hard -"@types/stack-utils@npm:^2.0.0": - version: 2.0.3 - resolution: "@types/stack-utils@npm:2.0.3" - checksum: 10/72576cc1522090fe497337c2b99d9838e320659ac57fa5560fcbdcbafcf5d0216c6b3a0a8a4ee4fdb3b1f5e3420aa4f6223ab57b82fef3578bec3206425c6cf5 - languageName: node - linkType: hard - -"@types/yargs-parser@npm:*": - version: 21.0.3 - resolution: "@types/yargs-parser@npm:21.0.3" - checksum: 10/a794eb750e8ebc6273a51b12a0002de41343ffe46befef460bdbb57262d187fdf608bc6615b7b11c462c63c3ceb70abe2564c8dd8ee0f7628f38a314f74a9b9b - languageName: node - linkType: hard - -"@types/yargs@npm:^17.0.8": - version: 17.0.33 - resolution: "@types/yargs@npm:17.0.33" - dependencies: - "@types/yargs-parser": "npm:*" - checksum: 10/16f6681bf4d99fb671bf56029141ed01db2862e3db9df7fc92d8bea494359ac96a1b4b1c35a836d1e95e665fb18ad753ab2015fc0db663454e8fd4e5d5e2ef91 - languageName: node - linkType: hard - "@vitest/expect@npm:2.1.1": version: 2.1.1 resolution: "@vitest/expect@npm:2.1.1" @@ -673,16 +538,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10/d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": +"ansi-styles@npm:^4.0.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: @@ -691,13 +547,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^5.0.0": - version: 5.2.0 - resolution: "ansi-styles@npm:5.2.0" - checksum: 10/d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 - languageName: node - linkType: hard - "ansi-styles@npm:^6.1.0": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" @@ -728,15 +577,6 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.3": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: "npm:^7.1.1" - checksum: 10/fad11a0d4697a27162840b02b1fad249c1683cbc510cd5bf1a471f2f8085c046d41094308c577a50a03a579dd99d5a6b3724c4b5e8b14df2c4443844cfcda2c6 - languageName: node - linkType: hard - "cac@npm:^6.7.14": version: 6.7.14 resolution: "cac@npm:6.7.14" @@ -777,27 +617,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10/3d1d103433166f6bfe82ac75724951b33769675252d8417317363ef9d54699b7c3b2d46671b772b893a8e50c3ece70c4b933c73c01e81bc60ea4df9b55afa303 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10/cb3f3e594913d63b1814d7ca7c9bafbf895f75fbf93b92991980610dfd7b48500af4e3a5d4e3a8f337990a96b168d7eb84ee55efdce965e2ee8efc20f8c8f139 - languageName: node - linkType: hard - "check-error@npm:^2.1.1": version: 2.1.1 resolution: "check-error@npm:2.1.1" @@ -812,13 +631,6 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^3.2.0": - version: 3.9.0 - resolution: "ci-info@npm:3.9.0" - checksum: 10/75bc67902b4d1c7b435497adeb91598f6d52a3389398e44294f6601b20cfef32cf2176f7be0eb961d9e085bb333a8a5cae121cb22f81cf238ae7f58eb80e9397 - languageName: node - linkType: hard - "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -826,15 +638,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10/ffa319025045f2973919d155f25e7c00d08836b6b33ea2d205418c59bd63a665d713c52d9737a9e0fe467fb194b40fbef1d849bae80d674568ee220a31ef3d10 - languageName: node - linkType: hard - "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -844,13 +647,6 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10/09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -888,13 +684,6 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^29.6.3": - version: 29.6.3 - resolution: "diff-sequences@npm:29.6.3" - checksum: 10/179daf9d2f9af5c57ad66d97cb902a538bcf8ed64963fa7aa0c329b3de3665ce2eb6ffdc2f69f29d445fa4af2517e5e55e5b6e00c00a9ae4f43645f97f7078cb - languageName: node - linkType: hard - "dotenv@npm:16.4.5": version: 16.4.5 resolution: "dotenv@npm:16.4.5" @@ -1026,20 +815,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10/6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^2.0.0": - version: 2.0.0 - resolution: "escape-string-regexp@npm:2.0.0" - checksum: 10/9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 - languageName: node - linkType: hard - "estree-walker@npm:^3.0.3": version: 3.0.3 resolution: "estree-walker@npm:3.0.3" @@ -1049,19 +824,6 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0": - version: 29.7.0 - resolution: "expect@npm:29.7.0" - dependencies: - "@jest/expect-utils": "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - checksum: 10/63f97bc51f56a491950fb525f9ad94f1916e8a014947f8d8445d3847a665b5471b768522d659f5e865db20b6c2033d2ac10f35fcbd881a4d26407a4f6f18451a - languageName: node - linkType: hard - "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -1069,15 +831,6 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" - dependencies: - to-regex-range: "npm:^5.0.1" - checksum: 10/a7095cb39e5bc32fada2aa7c7249d3f6b01bd1ce461a61b0adabacccabd9198500c6fb1f68a7c851a657e273fce2233ba869638897f3d7ed2e87a2d89b4436ea - languageName: node - linkType: hard - "foreground-child@npm:^3.1.0": version: 3.3.0 resolution: "foreground-child@npm:3.3.0" @@ -1148,27 +901,13 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10/4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10/261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -1243,13 +982,6 @@ __metadata: languageName: node linkType: hard -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 10/6a6c3383f68afa1e05b286af866017c78f1226d43ac8cb064e115ff9ed85eb33f5c4f7216c96a71e4dfea289ef52c5da3aef5bbfade8ffe47a0465d70c0c8e86 - languageName: node - linkType: hard - "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -1292,7 +1024,6 @@ __metadata: "@algolia/monitoring": "link:../../../clients/algoliasearch-client-javascript/packages/monitoring" "@algolia/recommend": "link:../../../clients/algoliasearch-client-javascript/packages/recommend" "@algolia/requester-testing": "link:../../../clients/algoliasearch-client-javascript/packages/requester-testing" - "@types/jest": "npm:29.5.13" "@types/node": "npm:22.5.5" algoliasearch: "link:../../../clients/algoliasearch-client-javascript/packages/algoliasearch" dotenv: "npm:16.4.5" @@ -1301,75 +1032,6 @@ __metadata: languageName: unknown linkType: soft -"jest-diff@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-diff@npm:29.7.0" - dependencies: - chalk: "npm:^4.0.0" - diff-sequences: "npm:^29.6.3" - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10/6f3a7eb9cd9de5ea9e5aa94aed535631fa6f80221832952839b3cb59dd419b91c20b73887deb0b62230d06d02d6b6cf34ebb810b88d904bb4fe1e2e4f0905c98 - languageName: node - linkType: hard - -"jest-get-type@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-get-type@npm:29.6.3" - checksum: 10/88ac9102d4679d768accae29f1e75f592b760b44277df288ad76ce5bf038c3f5ce3719dea8aa0f035dac30e9eb034b848ce716b9183ad7cc222d029f03e92205 - languageName: node - linkType: hard - -"jest-matcher-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-matcher-utils@npm:29.7.0" - dependencies: - chalk: "npm:^4.0.0" - jest-diff: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10/981904a494299cf1e3baed352f8a3bd8b50a8c13a662c509b6a53c31461f94ea3bfeffa9d5efcfeb248e384e318c87de7e3baa6af0f79674e987482aa189af40 - languageName: node - linkType: hard - -"jest-message-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-message-util@npm:29.7.0" - dependencies: - "@babel/code-frame": "npm:^7.12.13" - "@jest/types": "npm:^29.6.3" - "@types/stack-utils": "npm:^2.0.0" - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - micromatch: "npm:^4.0.4" - pretty-format: "npm:^29.7.0" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.3" - checksum: 10/31d53c6ed22095d86bab9d14c0fa70c4a92c749ea6ceece82cf30c22c9c0e26407acdfbdb0231435dc85a98d6d65ca0d9cbcd25cd1abb377fe945e843fb770b9 - languageName: node - linkType: hard - -"jest-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-util@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - graceful-fs: "npm:^4.2.9" - picomatch: "npm:^2.2.3" - checksum: 10/30d58af6967e7d42bd903ccc098f3b4d3859ed46238fbc88d4add6a3f10bea00c226b93660285f058bc7a65f6f9529cf4eb80f8d4707f79f9e3a23686b4ab8f3 - languageName: node - linkType: hard - -"js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10/af37d0d913fb56aec6dc0074c163cc71cd23c0b8aad5c2350747b6721d37ba118af35abdd8b33c47ec2800de07dedb16a527ca9c530ee004093e04958bd0cbf2 - languageName: node - linkType: hard - "jsbn@npm:1.1.0": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -1422,16 +1084,6 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4": - version: 4.0.8 - resolution: "micromatch@npm:4.0.8" - dependencies: - braces: "npm:^3.0.3" - picomatch: "npm:^2.3.1" - checksum: 10/6bf2a01672e7965eb9941d1f02044fad2bd12486b5553dc1116ff24c09a8723157601dc992e74c911d896175918448762df3b3fd0a6b61037dd1a9766ddfbf58 - languageName: node - linkType: hard - "minimatch@npm:^9.0.4": version: 9.0.5 resolution: "minimatch@npm:9.0.5" @@ -1635,13 +1287,6 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.1 - resolution: "picocolors@npm:1.0.1" - checksum: 10/fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 - languageName: node - linkType: hard - "picocolors@npm:^1.1.0": version: 1.1.0 resolution: "picocolors@npm:1.1.0" @@ -1649,13 +1294,6 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 10/60c2595003b05e4535394d1da94850f5372c9427ca4413b71210f437f7b2ca091dbd611c45e8b37d10036fa8eade25c1b8951654f9d3973bfa66a2ff4d3b08bc - languageName: node - linkType: hard - "postcss@npm:^8.4.43": version: 8.4.47 resolution: "postcss@npm:8.4.47" @@ -1667,17 +1305,6 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": - version: 29.7.0 - resolution: "pretty-format@npm:29.7.0" - dependencies: - "@jest/schemas": "npm:^29.6.3" - ansi-styles: "npm:^5.0.0" - react-is: "npm:^18.0.0" - checksum: 10/dea96bc83c83cd91b2bfc55757b6b2747edcaac45b568e46de29deee80742f17bc76fe8898135a70d904f4928eafd8bb693cd1da4896e8bdd3c5e82cadf1d2bb - languageName: node - linkType: hard - "proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": version: 4.2.0 resolution: "proc-log@npm:4.2.0" @@ -1695,13 +1322,6 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0": - version: 18.3.1 - resolution: "react-is@npm:18.3.1" - checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 - languageName: node - linkType: hard - "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -1818,13 +1438,6 @@ __metadata: languageName: node linkType: hard -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 10/94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c - languageName: node - linkType: hard - "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -1876,15 +1489,6 @@ __metadata: languageName: node linkType: hard -"stack-utils@npm:^2.0.3": - version: 2.0.6 - resolution: "stack-utils@npm:2.0.6" - dependencies: - escape-string-regexp: "npm:^2.0.0" - checksum: 10/cdc988acbc99075b4b036ac6014e5f1e9afa7e564482b687da6384eee6a1909d7eaffde85b0a17ffbe186c5247faf6c2b7544e802109f63b72c7be69b13151bb - languageName: node - linkType: hard - "stackback@npm:0.0.2": version: 0.0.2 resolution: "stackback@npm:0.0.2" @@ -1939,24 +1543,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10/5f505c6fa3c6e05873b43af096ddeb22159831597649881aeb8572d6fe3b81e798cc10840d0c9735e0026b250368851b7f77b65e84f4e4daa820a4f69947f55b - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10/c8bb7afd564e3b26b50ca6ee47572c217526a1389fe018d00345856d4a9b08ffbd61fadaf283a87368d94c3dcdb8f5ffe2650a5a65863e21ad2730ca0f05210a - languageName: node - linkType: hard - "tar@npm:^6.1.11, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -2006,15 +1592,6 @@ __metadata: languageName: node linkType: hard -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: "npm:^7.0.0" - checksum: 10/10dda13571e1f5ad37546827e9b6d4252d2e0bc176c24a101252153ef435d83696e2557fe128c4678e4e78f5f01e83711c703eef9814eb12dab028580d45980a - languageName: node - linkType: hard - "typescript@npm:5.6.2": version: 5.6.2 resolution: "typescript@npm:5.6.2" diff --git a/tests/output/python/requirements.txt b/tests/output/python/requirements.txt index e69de29bb2d..fca7b723773 100644 --- a/tests/output/python/requirements.txt +++ b/tests/output/python/requirements.txt @@ -0,0 +1,6 @@ +argcomplete==3.5.0 +click==8.1.7 +packaging==24.1 +pipx==1.7.1 +platformdirs==4.3.6 +userpath==1.9.2 diff --git a/tests/output/swift/Tests/manual/SearchTests.swift b/tests/output/swift/Tests/manual/SearchTests.swift index 6482f3f97a1..278c949480f 100644 --- a/tests/output/swift/Tests/manual/SearchTests.swift +++ b/tests/output/swift/Tests/manual/SearchTests.swift @@ -13,535 +13,611 @@ import Utils @testable import Search final class SearchClientManualTests: XCTestCase { - func testBuildFilters() throws { - let refinements: [String: [String]] = [ - "size": ["m", "s"], - "color": ["blue", "green", "red"], - "brand": ["apple", "samsung", "sony"] - ] - - let disjunctiveFacets: Set = [ - "color" - ] - - let helper = DisjunctiveFacetingHelper(query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), - refinements: refinements, - disjunctiveFacets: disjunctiveFacets) - - XCTAssertEqual(helper.buildFilters(excluding: .none), """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" AND "size":"s") - """) - XCTAssertEqual(helper.buildFilters(excluding: "popularity"), """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" AND "size":"s") - """) - XCTAssertEqual(helper.buildFilters(excluding: "brand"), """ - ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" AND "size":"s") - """) - XCTAssertEqual(helper.buildFilters(excluding: "color"), """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" AND "size":"s") - """) - XCTAssertEqual(helper.buildFilters(excluding: "size"), """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") - """) - } - - func testAppliedDisjunctiveFacetValues() { - let refinements: [String: [String]] = [ - "size": ["m", "s"], - "color": ["blue", "green", "red"], - "brand": ["apple", "samsung", "sony"] - ] - - let disjunctiveFacets: Set = [ - "color", - "brand" - ] - - let helper = DisjunctiveFacetingHelper(query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), - refinements: refinements, - disjunctiveFacets: disjunctiveFacets) - - XCTAssertTrue(helper.appliedDisjunctiveFacetValues(for: "popularity").isEmpty) - XCTAssertTrue(helper.appliedDisjunctiveFacetValues(for: "size").isEmpty) - XCTAssertEqual(helper.appliedDisjunctiveFacetValues(for: "color"), ["red", "green", "blue"]) - XCTAssertEqual(helper.appliedDisjunctiveFacetValues(for: "brand"), ["samsung", "sony", "apple"]) - } - - func testMakeQueriesNoDisjunctive() { - let refinements: [String: [String]] = [ - "size": ["m", "s"], - "color": ["blue", "green", "red"], - "brand": ["apple", "samsung", "sony"] - ] - - let helper = DisjunctiveFacetingHelper(query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), - refinements: refinements, - disjunctiveFacets: []) - let queries = helper.makeQueries() - XCTAssertEqual(queries.count, 1) - - if case let .searchForHits(searchForHits) = queries.first { - XCTAssertEqual(searchForHits.filters, """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" AND "color":"green" AND "color":"red") AND ("size":"m" AND "size":"s") - """) - } else { - XCTFail("Query should have been a SearchForHits type") + func testBuildFilters() throws { + let refinements: [String: [String]] = [ + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"], + ] + + let disjunctiveFacets: Set = [ + "color", + ] + + let helper = DisjunctiveFacetingHelper( + query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), + refinements: refinements, + disjunctiveFacets: disjunctiveFacets + ) + + XCTAssertEqual(helper.buildFilters(excluding: .none), """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" AND "size":"s") + """) + XCTAssertEqual(helper.buildFilters(excluding: "popularity"), """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" AND "size":"s") + """) + XCTAssertEqual(helper.buildFilters(excluding: "brand"), """ + ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" AND "size":"s") + """) + XCTAssertEqual(helper.buildFilters(excluding: "color"), """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" AND "size":"s") + """) + XCTAssertEqual(helper.buildFilters(excluding: "size"), """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") + """) } - } - - func testMakeQueriesDisjunctiveSingle() { - let refinements: [String: [String]] = [ - "size": ["m", "s"], - "color": ["blue", "green", "red"], - "brand": ["apple", "samsung", "sony"] - ] - - let helper = DisjunctiveFacetingHelper(query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), - refinements: refinements, - disjunctiveFacets: ["color"]) - let queries = helper.makeQueries() - XCTAssertEqual(queries.count, 2) - if case let .searchForHits(searchForHits) = queries.first { - XCTAssertEqual(searchForHits.filters, """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" AND "size":"s") - """) - } else { - XCTFail("Query should have been a SearchForHits type") + + func testAppliedDisjunctiveFacetValues() { + let refinements: [String: [String]] = [ + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"], + ] + + let disjunctiveFacets: Set = [ + "color", + "brand", + ] + + let helper = DisjunctiveFacetingHelper( + query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), + refinements: refinements, + disjunctiveFacets: disjunctiveFacets + ) + + XCTAssertTrue(helper.appliedDisjunctiveFacetValues(for: "popularity").isEmpty) + XCTAssertTrue(helper.appliedDisjunctiveFacetValues(for: "size").isEmpty) + XCTAssertEqual(helper.appliedDisjunctiveFacetValues(for: "color"), ["red", "green", "blue"]) + XCTAssertEqual(helper.appliedDisjunctiveFacetValues(for: "brand"), ["samsung", "sony", "apple"]) } - if case let .searchForHits(searchForHits) = queries.last { - XCTAssertEqual(searchForHits.facets, ["color"]) - XCTAssertEqual(searchForHits.filters, """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" AND "size":"s") - """) - } else { - XCTFail("Query should have been a SearchForHits type") + + func testMakeQueriesNoDisjunctive() { + let refinements: [String: [String]] = [ + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"], + ] + + let helper = DisjunctiveFacetingHelper( + query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), + refinements: refinements, + disjunctiveFacets: [] + ) + let queries = helper.makeQueries() + XCTAssertEqual(queries.count, 1) + + if case let .searchForHits(searchForHits) = queries.first { + XCTAssertEqual(searchForHits.filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" AND "color":"green" AND "color":"red") AND ("size":"m" AND "size":"s") + """) + } else { + XCTFail("Query should have been a SearchForHits type") + } } - } - - func testMakeQueriesDisjunctiveDouble() { - let refinements: [String: [String]] = [ - "size": ["m", "s"], - "color": ["blue", "green", "red"], - "brand": ["apple", "samsung", "sony"] - ] - let disjunctiveFacets: Set = [ - "color", - "size" - ] - let helper = DisjunctiveFacetingHelper(query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), - refinements: refinements, - disjunctiveFacets: disjunctiveFacets) - let queries = helper.makeQueries() - XCTAssertEqual(queries.count, 3) - if case let .searchForHits(searchForHits) = queries.first { - XCTAssertEqual(searchForHits.filters, """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" OR "size":"s") - """) - } else { - XCTFail("Query should have been a SearchForHits type") + + func testMakeQueriesDisjunctiveSingle() { + let refinements: [String: [String]] = [ + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"], + ] + + let helper = DisjunctiveFacetingHelper( + query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), + refinements: refinements, + disjunctiveFacets: ["color"] + ) + let queries = helper.makeQueries() + XCTAssertEqual(queries.count, 2) + if case let .searchForHits(searchForHits) = queries.first { + XCTAssertEqual(searchForHits.filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" AND "size":"s") + """) + } else { + XCTFail("Query should have been a SearchForHits type") + } + if case let .searchForHits(searchForHits) = queries.last { + XCTAssertEqual(searchForHits.facets, ["color"]) + XCTAssertEqual(searchForHits.filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" AND "size":"s") + """) + } else { + XCTFail("Query should have been a SearchForHits type") + } } - if case let .searchForHits(searchForHits) = queries[1] { - XCTAssertEqual(searchForHits.facets, ["color"]) - XCTAssertEqual(searchForHits.filters, """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" OR "size":"s") - """) - } else { - XCTFail("Query should have been a SearchForHits type") + + func testMakeQueriesDisjunctiveDouble() { + let refinements: [String: [String]] = [ + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"], + ] + let disjunctiveFacets: Set = [ + "color", + "size", + ] + let helper = DisjunctiveFacetingHelper( + query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), + refinements: refinements, + disjunctiveFacets: disjunctiveFacets + ) + let queries = helper.makeQueries() + XCTAssertEqual(queries.count, 3) + if case let .searchForHits(searchForHits) = queries.first { + XCTAssertEqual(searchForHits.filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" OR "size":"s") + """) + } else { + XCTFail("Query should have been a SearchForHits type") + } + if case let .searchForHits(searchForHits) = queries[1] { + XCTAssertEqual(searchForHits.facets, ["color"]) + XCTAssertEqual(searchForHits.filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" OR "size":"s") + """) + } else { + XCTFail("Query should have been a SearchForHits type") + } + if case let .searchForHits(searchForHits) = queries[2] { + XCTAssertEqual(searchForHits.facets, ["size"]) + XCTAssertEqual(searchForHits.filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") + """) + } else { + XCTFail("Query should have been a SearchForHits type") + } } - if case let .searchForHits(searchForHits) = queries[2] { - XCTAssertEqual(searchForHits.facets, ["size"]) - XCTAssertEqual(searchForHits.filters, """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") - """) - } else { - XCTFail("Query should have been a SearchForHits type") + + func testMergeEmptyResponses() { + let refinements: [String: [String]] = [ + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"], + ] + let disjunctiveFacets: Set = [ + "color", + "size", + ] + let helper = DisjunctiveFacetingHelper( + query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), + refinements: refinements, + disjunctiveFacets: disjunctiveFacets + ) + + do { + let _: SearchDisjunctiveFacetingResponse = try helper.mergeResponses([]) + XCTFail("This should have failed") + } catch let error as DisjunctiveFacetingError { + XCTAssertEqual( + error.localizedDescription, + "Unexpected empty search responses list. At least one search responses might be present." + ) + } catch { + XCTFail("Wrong error caught: \(error)") + } } - } - - func testMergeEmptyResponses() { - let refinements: [String: [String]] = [ - "size": ["m", "s"], - "color": ["blue", "green", "red"], - "brand": ["apple", "samsung", "sony"] - ] - let disjunctiveFacets: Set = [ - "color", - "size" - ] - let helper = DisjunctiveFacetingHelper(query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), - refinements: refinements, - disjunctiveFacets: disjunctiveFacets) - - do { - let _: SearchDisjunctiveFacetingResponse = try helper.mergeResponses([]) - XCTFail("This should have failed") - } catch let error as DisjunctiveFacetingError { - XCTAssertEqual(error.localizedDescription, "Unexpected empty search responses list. At least one search responses might be present.") - } catch { - XCTFail("Wrong error caught: \(error)") + + func testMergeDisjunctiveSingle() throws { + let refinements: [String: [String]] = [ + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"], + ] + let disjunctiveFacets: Set = [ + "color", + ] + let helper = DisjunctiveFacetingHelper( + query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), + refinements: refinements, + disjunctiveFacets: disjunctiveFacets + ) + var mainResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") + mainResponse.facets = [ + "size": [ + "s": 5, + "m": 7, + ], + "color": [ + "red": 1, + "green": 2, + "blue": 3, + ], + "brand": [ + "samsung": 5, + "sony": 10, + "apple": 15, + ], + ] + var disjunctiveResponse: SearchResponse = SearchResponse( + processingTimeMS: 100, + hits: [], + query: "", + params: "" + ) + disjunctiveResponse.facets = [ + "color": [ + "red": 10, + "green": 20, + "blue": 30, + ], + ] + let result: SearchDisjunctiveFacetingResponse = try helper.mergeResponses([ + mainResponse, + disjunctiveResponse, + ]) + XCTAssertEqual(result.response.facets, [ + "size": [ + "s": 5, + "m": 7, + ], + "color": [ + "red": 1, + "green": 2, + "blue": 3, + ], + "brand": [ + "samsung": 5, + "sony": 10, + "apple": 15, + ], + ]) + XCTAssertEqual(result.disjunctiveFacets, ["color": [ + "red": 10, + "green": 20, + "blue": 30, + ]]) } - } - - func testMergeDisjunctiveSingle() throws { - let refinements: [String: [String]] = [ - "size": ["m", "s"], - "color": ["blue", "green", "red"], - "brand": ["apple", "samsung", "sony"] - ] - let disjunctiveFacets: Set = [ - "color" - ] - let helper = DisjunctiveFacetingHelper( - query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), - refinements: refinements, - disjunctiveFacets: disjunctiveFacets - ) - var mainResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") - mainResponse.facets = [ - "size": [ - "s": 5, - "m": 7 - ], - "color": [ - "red": 1, - "green": 2, - "blue": 3 - ], - "brand": [ - "samsung": 5, - "sony": 10, - "apple": 15 - ], - ] - var disjunctiveResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") - disjunctiveResponse.facets = [ - "color": [ - "red": 10, - "green": 20, - "blue": 30, - ] - ] - let result: SearchDisjunctiveFacetingResponse = try helper.mergeResponses([ - mainResponse, - disjunctiveResponse, - ]) - XCTAssertEqual(result.response.facets, [ - "size": [ - "s": 5, - "m": 7, - ], - "color": [ - "red": 1, - "green": 2, - "blue": 3, - ], - "brand": [ - "samsung": 5, - "sony": 10, - "apple": 15, - ], - ]) - XCTAssertEqual(result.disjunctiveFacets, ["color": [ - "red": 10, - "green": 20, - "blue": 30, - ]]) - } - - func testMergeDisjunctiveDouble() throws { - let refinements: [String: [String]] = [ - "size": ["m", "s"], - "color": ["blue", "green", "red"], - "brand": ["apple", "samsung", "sony"] - ] - let disjunctiveFacets: Set = [ - "color", - "size" - ] - let helper = DisjunctiveFacetingHelper(query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), - refinements: refinements, - disjunctiveFacets: disjunctiveFacets) - var mainResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") - mainResponse.facets = [ - "size": [ - "s": 5, - "m": 7, - ], - "color": [ - "red": 1, - "green": 2, - "blue": 3, - ], - "brand": [ - "samsung": 5, - "sony": 10, - "apple": 15, - ], - ] - var firstDisjunctiveResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") - firstDisjunctiveResponse.facets = [ - "color": [ - "red": 10, - "green": 20, - "blue": 30, - ] - ] - var secondDisjunctiveResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") - secondDisjunctiveResponse.facets = [ - "size": [ - "s": 3, - "m": 4, - ] - ] - let result: SearchDisjunctiveFacetingResponse = try helper.mergeResponses([ - mainResponse, - firstDisjunctiveResponse, - secondDisjunctiveResponse, - ]) - XCTAssertEqual(result.response.facets, [ - "size": [ - "s": 5, - "m": 7, - ], - "color": [ - "red": 1, - "green": 2, - "blue": 3, - ], - "brand": [ - "samsung": 5, - "sony": 10, - "apple": 15, - ], - ]) - XCTAssertEqual(result.disjunctiveFacets, [ - "color": [ - "red": 10, - "green": 20, - "blue": 30, - ], - "size": [ - "s": 3, - "m": 4, - ], - ]) - } - - func testMergeFacetStats() throws { - let helper = DisjunctiveFacetingHelper(query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), - refinements: [:], - disjunctiveFacets: []) - - - var mainResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") - mainResponse.facetsStats = [ - "price": SearchFacetStats(min: 5, max: 100, avg: 52.5, sum: 2400), - "target": SearchFacetStats(min: 1, max: 10, avg: 5.5, sum: 43) - ] - var firstDisjunctiveResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") - firstDisjunctiveResponse.facetsStats = [ - "price": SearchFacetStats(min: 7, max: 103, avg: 55, sum: 3000), - "note": SearchFacetStats(min: 1, max: 5, avg: 3, sum: 37) - ] - var secondDisjunctiveResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") - secondDisjunctiveResponse.facetsStats = [ - "size": SearchFacetStats(min: 20, max: 56, avg: 38, sum: 242) - ] - let result: SearchDisjunctiveFacetingResponse = try helper.mergeResponses([ - mainResponse, - firstDisjunctiveResponse, - secondDisjunctiveResponse, - ]) - - - XCTAssertEqual(result.response.facetsStats?.count, 4) - assertEqual(result.response.facetsStats?["price"], SearchFacetStats(min: 7, max: 103, avg: 55, sum: 3000), - file: #filePath, - line: #line) - assertEqual(result.response.facetsStats?["target"], SearchFacetStats(min: 1, max: 10, avg: 5.5, sum: 43), - file: #filePath, - line: #line) - assertEqual(result.response.facetsStats?["size"], SearchFacetStats(min: 20, max: 56, avg: 38, sum: 242), - file: #filePath, - line: #line) - assertEqual(result.response.facetsStats?["note"], SearchFacetStats(min: 1, max: 5, avg: 3, sum: 37), - file: #filePath, - line: #line) - } - - func assertEqual(_ lhs: SearchFacetStats?, _ rhs: SearchFacetStats?, file: StaticString = #filePath, line: UInt = #line) { - guard let lhs = lhs else { - XCTAssertNil(rhs, file: file, line: line) - return + + func testMergeDisjunctiveDouble() throws { + let refinements: [String: [String]] = [ + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"], + ] + let disjunctiveFacets: Set = [ + "color", + "size", + ] + let helper = DisjunctiveFacetingHelper( + query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), + refinements: refinements, + disjunctiveFacets: disjunctiveFacets + ) + var mainResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") + mainResponse.facets = [ + "size": [ + "s": 5, + "m": 7, + ], + "color": [ + "red": 1, + "green": 2, + "blue": 3, + ], + "brand": [ + "samsung": 5, + "sony": 10, + "apple": 15, + ], + ] + var firstDisjunctiveResponse: SearchResponse = SearchResponse( + processingTimeMS: 100, + hits: [], + query: "", + params: "" + ) + firstDisjunctiveResponse.facets = [ + "color": [ + "red": 10, + "green": 20, + "blue": 30, + ], + ] + var secondDisjunctiveResponse: SearchResponse = SearchResponse( + processingTimeMS: 100, + hits: [], + query: "", + params: "" + ) + secondDisjunctiveResponse.facets = [ + "size": [ + "s": 3, + "m": 4, + ], + ] + let result: SearchDisjunctiveFacetingResponse = try helper.mergeResponses([ + mainResponse, + firstDisjunctiveResponse, + secondDisjunctiveResponse, + ]) + XCTAssertEqual(result.response.facets, [ + "size": [ + "s": 5, + "m": 7, + ], + "color": [ + "red": 1, + "green": 2, + "blue": 3, + ], + "brand": [ + "samsung": 5, + "sony": 10, + "apple": 15, + ], + ]) + XCTAssertEqual(result.disjunctiveFacets, [ + "color": [ + "red": 10, + "green": 20, + "blue": 30, + ], + "size": [ + "s": 3, + "m": 4, + ], + ]) } - guard let rhs = rhs else { - XCTAssertNil(lhs, file: file, line: line) - return + + func testMergeFacetStats() throws { + let helper = DisjunctiveFacetingHelper( + query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), + refinements: [:], + disjunctiveFacets: [] + ) + + var mainResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") + mainResponse.facetsStats = [ + "price": SearchFacetStats(min: 5, max: 100, avg: 52.5, sum: 2400), + "target": SearchFacetStats(min: 1, max: 10, avg: 5.5, sum: 43), + ] + var firstDisjunctiveResponse: SearchResponse = SearchResponse( + processingTimeMS: 100, + hits: [], + query: "", + params: "" + ) + firstDisjunctiveResponse.facetsStats = [ + "price": SearchFacetStats(min: 7, max: 103, avg: 55, sum: 3000), + "note": SearchFacetStats(min: 1, max: 5, avg: 3, sum: 37), + ] + var secondDisjunctiveResponse: SearchResponse = SearchResponse( + processingTimeMS: 100, + hits: [], + query: "", + params: "" + ) + secondDisjunctiveResponse.facetsStats = [ + "size": SearchFacetStats(min: 20, max: 56, avg: 38, sum: 242), + ] + let result: SearchDisjunctiveFacetingResponse = try helper.mergeResponses([ + mainResponse, + firstDisjunctiveResponse, + secondDisjunctiveResponse, + ]) + + XCTAssertEqual(result.response.facetsStats?.count, 4) + self.assertEqual( + result.response.facetsStats?["price"], + SearchFacetStats(min: 7, max: 103, avg: 55, sum: 3000), + file: #filePath, + line: #line + ) + self.assertEqual( + result.response.facetsStats?["target"], + SearchFacetStats(min: 1, max: 10, avg: 5.5, sum: 43), + file: #filePath, + line: #line + ) + self.assertEqual( + result.response.facetsStats?["size"], + SearchFacetStats(min: 20, max: 56, avg: 38, sum: 242), + file: #filePath, + line: #line + ) + self.assertEqual( + result.response.facetsStats?["note"], + SearchFacetStats(min: 1, max: 5, avg: 3, sum: 37), + file: #filePath, + line: #line + ) } - XCTAssertEqual(lhs.min!, rhs.min!, accuracy: 0.01, file: file, line: line) - XCTAssertEqual(lhs.max!, rhs.max!, accuracy: 0.01, file: file, line: line) - if let lAvg = lhs.avg, let rAvg = rhs.avg { - XCTAssertEqual(lAvg, rAvg, accuracy: 0.01, file: file, line: line) - } else { - XCTAssertEqual(lhs.avg, rhs.avg, file: file, line: line) + + func assertEqual( + _ lhs: SearchFacetStats?, + _ rhs: SearchFacetStats?, + file: StaticString = #filePath, + line: UInt = #line + ) { + guard let lhs else { + XCTAssertNil(rhs, file: file, line: line) + return + } + guard let rhs else { + XCTAssertNil(lhs, file: file, line: line) + return + } + XCTAssertEqual(lhs.min!, rhs.min!, accuracy: 0.01, file: file, line: line) + XCTAssertEqual(lhs.max!, rhs.max!, accuracy: 0.01, file: file, line: line) + if let lAvg = lhs.avg, let rAvg = rhs.avg { + XCTAssertEqual(lAvg, rAvg, accuracy: 0.01, file: file, line: line) + } else { + XCTAssertEqual(lhs.avg, rhs.avg, file: file, line: line) + } + if let lSum = lhs.sum, let rSum = rhs.sum { + XCTAssertEqual(lSum, rSum, accuracy: 0.01, file: file, line: line) + } else { + XCTAssertEqual(lhs.sum, rhs.sum, file: file, line: line) + } } - if let lSum = lhs.sum, let rSum = rhs.sum { - XCTAssertEqual(lSum, rSum, accuracy: 0.01, file: file, line: line) - } else { - XCTAssertEqual(lhs.sum, rhs.sum, file: file, line: line) + + func testMergeExhaustiveFacetsCount() throws { + let helper = DisjunctiveFacetingHelper( + query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), + refinements: [:], + disjunctiveFacets: [] + ) + + var mainResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") + mainResponse.exhaustive = SearchExhaustive(facetsCount: true) + var firstDisjunctiveResponse: SearchResponse = SearchResponse( + processingTimeMS: 100, + hits: [], + query: "", + params: "" + ) + firstDisjunctiveResponse.exhaustive = SearchExhaustive(facetsCount: true) + var secondDisjunctiveResponse: SearchResponse = SearchResponse( + processingTimeMS: 100, + hits: [], + query: "", + params: "" + ) + secondDisjunctiveResponse.exhaustive = SearchExhaustive(facetsCount: false) + var result: SearchDisjunctiveFacetingResponse = try helper.mergeResponses([ + mainResponse, + firstDisjunctiveResponse, + secondDisjunctiveResponse, + ]) + XCTAssertNotNil(result.response.exhaustive?.facetsCount) + XCTAssertFalse(result.response.exhaustive!.facetsCount!) + secondDisjunctiveResponse.exhaustive?.facetsCount = true + result = try helper.mergeResponses([ + mainResponse, + firstDisjunctiveResponse, + secondDisjunctiveResponse, + ]) + XCTAssertNotNil(result.response.exhaustive?.facetsCount) + XCTAssertTrue(result.response.exhaustive!.facetsCount!) } - } - - func testMergeExhaustiveFacetsCount() throws { - let helper = DisjunctiveFacetingHelper(query: SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name"), - refinements: [:], - disjunctiveFacets: []) - - - var mainResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") - mainResponse.exhaustive = SearchExhaustive(facetsCount: true) - var firstDisjunctiveResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") - firstDisjunctiveResponse.exhaustive = SearchExhaustive(facetsCount: true) - var secondDisjunctiveResponse: SearchResponse = SearchResponse(processingTimeMS: 100, hits: [], query: "", params: "") - secondDisjunctiveResponse.exhaustive = SearchExhaustive(facetsCount: false) - var result: SearchDisjunctiveFacetingResponse = try helper.mergeResponses([ - mainResponse, - firstDisjunctiveResponse, - secondDisjunctiveResponse, - ]) - XCTAssertNotNil(result.response.exhaustive?.facetsCount) - XCTAssertFalse(result.response.exhaustive!.facetsCount!) - secondDisjunctiveResponse.exhaustive?.facetsCount = true - result = try helper.mergeResponses([ - mainResponse, - firstDisjunctiveResponse, - secondDisjunctiveResponse, - ]) - XCTAssertNotNil(result.response.exhaustive?.facetsCount) - XCTAssertTrue(result.response.exhaustive!.facetsCount!) - } - + func testKeepExistingFilters() throws { var query = SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name") query.filters = "NOT color:blue" - + let refinements: [String: [String]] = [ - "size": ["m", "s"], - "color": ["blue", "green", "red"], - "brand": ["apple", "samsung", "sony"] + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"], ] let disjunctiveFacets: Set = [ - "color", - "size" + "color", + "size", ] - let helper = DisjunctiveFacetingHelper(query: query, - refinements: refinements, - disjunctiveFacets: disjunctiveFacets) + let helper = DisjunctiveFacetingHelper( + query: query, + refinements: refinements, + disjunctiveFacets: disjunctiveFacets + ) let queries = helper.makeQueries() XCTAssertEqual(queries.count, 3) if case let .searchForHits(searchForHits) = queries.first { - XCTAssertEqual(searchForHits.filters, """ - NOT color:blue AND ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" OR "size":"s") - """) + XCTAssertEqual(searchForHits.filters, """ + NOT color:blue AND ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" OR "size":"s") + """) } else { - XCTFail("Query should have been a SearchForHits type") + XCTFail("Query should have been a SearchForHits type") } if case let .searchForHits(searchForHits) = queries[1] { - XCTAssertEqual(searchForHits.facets, ["color"]) - XCTAssertEqual(searchForHits.filters, """ - NOT color:blue AND ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" OR "size":"s") - """) + XCTAssertEqual(searchForHits.facets, ["color"]) + XCTAssertEqual(searchForHits.filters, """ + NOT color:blue AND ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" OR "size":"s") + """) } else { - XCTFail("Query should have been a SearchForHits type") + XCTFail("Query should have been a SearchForHits type") } if case let .searchForHits(searchForHits) = queries[2] { - XCTAssertEqual(searchForHits.facets, ["size"]) - XCTAssertEqual(searchForHits.filters, """ - NOT color:blue AND ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") - """) + XCTAssertEqual(searchForHits.facets, ["size"]) + XCTAssertEqual(searchForHits.filters, """ + NOT color:blue AND ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") + """) } else { - XCTFail("Query should have been a SearchForHits type") + XCTFail("Query should have been a SearchForHits type") } } - + func testKeepExistingFiltersEmpty() throws { var query = SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name") query.filters = "" - + let refinements: [String: [String]] = [ - "size": ["m", "s"], - "color": ["blue", "green", "red"], - "brand": ["apple", "samsung", "sony"] + "size": ["m", "s"], + "color": ["blue", "green", "red"], + "brand": ["apple", "samsung", "sony"], ] let disjunctiveFacets: Set = [ - "color", - "size" + "color", + "size", ] - let helper = DisjunctiveFacetingHelper(query: query, - refinements: refinements, - disjunctiveFacets: disjunctiveFacets) + let helper = DisjunctiveFacetingHelper( + query: query, + refinements: refinements, + disjunctiveFacets: disjunctiveFacets + ) let queries = helper.makeQueries() XCTAssertEqual(queries.count, 3) if case let .searchForHits(searchForHits) = queries.first { - XCTAssertEqual(searchForHits.filters, """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" OR "size":"s") - """) + XCTAssertEqual(searchForHits.filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") AND ("size":"m" OR "size":"s") + """) } else { - XCTFail("Query should have been a SearchForHits type") + XCTFail("Query should have been a SearchForHits type") } if case let .searchForHits(searchForHits) = queries[1] { - XCTAssertEqual(searchForHits.facets, ["color"]) - XCTAssertEqual(searchForHits.filters, """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" OR "size":"s") - """) + XCTAssertEqual(searchForHits.facets, ["color"]) + XCTAssertEqual(searchForHits.filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("size":"m" OR "size":"s") + """) } else { - XCTFail("Query should have been a SearchForHits type") + XCTFail("Query should have been a SearchForHits type") } if case let .searchForHits(searchForHits) = queries[2] { - XCTAssertEqual(searchForHits.facets, ["size"]) - XCTAssertEqual(searchForHits.filters, """ - ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") - """) + XCTAssertEqual(searchForHits.facets, ["size"]) + XCTAssertEqual(searchForHits.filters, """ + ("brand":"apple" AND "brand":"samsung" AND "brand":"sony") AND ("color":"blue" OR "color":"green" OR "color":"red") + """) } else { - XCTFail("Query should have been a SearchForHits type") + XCTFail("Query should have been a SearchForHits type") } } - + func testKeepExistingFiltersNoRefinement() throws { var query = SearchForHits(from: SearchSearchParamsObject(), indexName: "index_name") query.filters = "NOT color:blue" let disjunctiveFacets: Set = [ - "color", - "size" + "color", + "size", ] - let helper = DisjunctiveFacetingHelper(query: query, - refinements: [:], - disjunctiveFacets: disjunctiveFacets) + let helper = DisjunctiveFacetingHelper( + query: query, + refinements: [:], + disjunctiveFacets: disjunctiveFacets + ) let queries = helper.makeQueries() XCTAssertEqual(queries.count, 3) if case let .searchForHits(searchForHits) = queries.first { - XCTAssertEqual(searchForHits.filters, """ - NOT color:blue - """) + XCTAssertEqual(searchForHits.filters, """ + NOT color:blue + """) } else { - XCTFail("Query should have been a SearchForHits type") + XCTFail("Query should have been a SearchForHits type") } if case let .searchForHits(searchForHits) = queries[1] { - XCTAssertEqual(searchForHits.facets, ["color"]) - XCTAssertEqual(searchForHits.filters, """ - NOT color:blue - """) + XCTAssertEqual(searchForHits.facets, ["color"]) + XCTAssertEqual(searchForHits.filters, """ + NOT color:blue + """) } else { - XCTFail("Query should have been a SearchForHits type") + XCTFail("Query should have been a SearchForHits type") } if case let .searchForHits(searchForHits) = queries[2] { - XCTAssertEqual(searchForHits.facets, ["size"]) - XCTAssertEqual(searchForHits.filters, """ - NOT color:blue - """) + XCTAssertEqual(searchForHits.facets, ["size"]) + XCTAssertEqual(searchForHits.filters, """ + NOT color:blue + """) } else { - XCTFail("Query should have been a SearchForHits type") + XCTFail("Query should have been a SearchForHits type") } } }