diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index b69330272bc..c5aef41250b 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -378,7 +378,7 @@ jobs: run: yarn cli cts generate ${{ matrix.client.language }} --language-version ${{ matrix.client.version }} - name: Run unit CTS - run: yarn cli cts run ${{ matrix.client.language }} --no-e2e + run: yarn cli cts run ${{ matrix.client.language }} --no-e2e -v - name: Run e2e CTS id: cts-e2e diff --git a/clients/algoliasearch-client-go/go.mod b/clients/algoliasearch-client-go/go.mod index 4de4ab17e2f..c50b5f7ab4c 100644 --- a/clients/algoliasearch-client-go/go.mod +++ b/clients/algoliasearch-client-go/go.mod @@ -1,16 +1,3 @@ module github.com/algolia/algoliasearch-client-go/v4 go 1.21.11 - -require github.com/go-playground/validator/v10 v10.26.0 - -require ( - github.com/gabriel-vasile/mimetype v1.4.8 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/leodido/go-urn v1.4.0 // indirect - golang.org/x/crypto v0.33.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/sys v0.30.0 // indirect - golang.org/x/text v0.22.0 // indirect -) diff --git a/clients/algoliasearch-client-go/go.sum b/clients/algoliasearch-client-go/go.sum index 73fb444e544..e69de29bb2d 100644 --- a/clients/algoliasearch-client-go/go.sum +++ b/clients/algoliasearch-client-go/go.sum @@ -1,28 +0,0 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= -github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k= -github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= -github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= -github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/scripts/cts/testServer/algoliaMock.ts b/scripts/cts/testServer/algoliaMock.ts index 0f32fcbb024..30b35542b62 100644 --- a/scripts/cts/testServer/algoliaMock.ts +++ b/scripts/cts/testServer/algoliaMock.ts @@ -37,6 +37,51 @@ function addRoutes(app: Express): void { processingTimeMS: 0, }); }); + + // languages that just put the response in a map, there is no strict parsing or types to match. + const isLaxLanguage = (lang: string) => { + return lang === 'dart' || lang === 'javascript' || lang === 'python' || lang === 'php'; + }; + + app.get('/1/indexes/:indexName/settings', (req, res) => { + const lang = req.params.indexName.match(/^cts_e2e_unknownField_(.*)$/)?.[1] as string; + let unknown = {}; + if (!isLaxLanguage(lang)) { + unknown = { + unknownFieldNameThatWillNeverBeAddedToTheSpecIHope: 'hello', + }; + } + + res.json({ + minWordSizefor1Typo: 12, + minWordSizefor2Typos: 13, + hitsPerPage: 14, + ...unknown, + }); + }); + + app.get('/1/indexes/:indexName/rules/:objectID', (req, res) => { + const lang = req.params.indexName.match(/^cts_e2e_unknownFieldNested_(.*)$/)?.[1] as string; + let unknown = {}; + if (!isLaxLanguage(lang)) { + unknown = { + unknownFieldNameThatWillNeverBeAddedToTheSpecIHope: 'hello', + }; + } + + res.json({ + objectID: req.params.objectID, + consequence: { + promote: [ + { + objectID: '1', + position: 10, + ...unknown, + }, + ], + }, + }); + }); } export function algoliaMockServer(): Promise { diff --git a/templates/go/client.mustache b/templates/go/client.mustache index b33142b36c6..6a3552164f3 100644 --- a/templates/go/client.mustache +++ b/templates/go/client.mustache @@ -18,8 +18,6 @@ import ( "slices" "time" - "github.com/go-playground/validator/v10" - "github.com/algolia/algoliasearch-client-go/v4/algolia/call" "github.com/algolia/algoliasearch-client-go/v4/algolia/compression" "github.com/algolia/algoliasearch-client-go/v4/algolia/transport" @@ -284,24 +282,6 @@ func reportError(format string, a ...any) error { return fmt.Errorf(format, a...) } -// A wrapper for strict JSON decoding -func newStrictDecoder(data []byte) *json.Decoder { //nolint:unused - dec := json.NewDecoder(bytes.NewBuffer(data)) - dec.DisallowUnknownFields() - return dec -} - -// A wrapper for validating a struct, returns nil if value is not a struct -func validateStruct(v any) error { //nolint:unused - err := validator.New().Struct(v) - validationErrors, ok := err.(validator.ValidationErrors) - if ok && len(validationErrors) > 0 { - return validationErrors - } - - return nil -} - // Set request body from an any func setBody(body any, c compression.Compression) (*bytes.Buffer, error) { if body == nil { diff --git a/templates/go/model_oneof.mustache b/templates/go/model_oneof.mustache index 0121f7011a1..483e1499613 100644 --- a/templates/go/model_oneof.mustache +++ b/templates/go/model_oneof.mustache @@ -28,15 +28,15 @@ func (dst *{{classname}}) UnmarshalJSON(data []byte) error { {{#vendorExtensions.x-has-discriminator}} // use discriminator value to speed up the lookup if possible, if not we will try every possibility var jsonDict map[string]any - _ = newStrictDecoder(data).Decode(&jsonDict) + _ = json.Unmarshal(data, &jsonDict) {{/vendorExtensions.x-has-discriminator}} {{#composedSchemas.oneOf}} {{#vendorExtensions.x-discriminator-fields.size}} if {{#vendorExtensions.x-discriminator-fields}}utils.HasKey(jsonDict, "{{.}}"){{^-last}} && {{/-last}}{{/vendorExtensions.x-discriminator-fields}} { {{/vendorExtensions.x-discriminator-fields.size}} // try to unmarshal data into {{#lambda.type-to-name}}{{{dataType}}}{{/lambda.type-to-name}} - err = newStrictDecoder(data).Decode(&dst.{{#lambda.type-to-name}}{{{dataType}}}{{/lambda.type-to-name}}) - if err == nil && validateStruct(dst.{{#lambda.type-to-name}}{{{dataType}}}{{/lambda.type-to-name}}) == nil { + err = json.Unmarshal(data, &dst.{{#lambda.type-to-name}}{{{dataType}}}{{/lambda.type-to-name}}) + if err == nil { return nil // found the correct type } else { dst.{{#lambda.type-to-name}}{{{dataType}}}{{/lambda.type-to-name}} = nil diff --git a/templates/go/snippets/go.mod.mustache b/templates/go/snippets/go.mod.mustache index 5a24c93cc9a..b86d5a2d26b 100644 --- a/templates/go/snippets/go.mod.mustache +++ b/templates/go/snippets/go.mod.mustache @@ -5,15 +5,3 @@ go 1.21.11 replace github.com/algolia/algoliasearch-client-go/v4 => ../../../clients/algoliasearch-client-go require github.com/algolia/algoliasearch-client-go/v4 v4.0.0 - -require ( - github.com/gabriel-vasile/mimetype v1.4.3 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.22.1 // indirect - github.com/leodido/go-urn v1.4.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect -) diff --git a/templates/kotlin/tests/client/tests.mustache b/templates/kotlin/tests/client/tests.mustache index f808270fc6b..021df0e9c0c 100644 --- a/templates/kotlin/tests/client/tests.mustache +++ b/templates/kotlin/tests/client/tests.mustache @@ -37,7 +37,7 @@ fun `{{#lambda.replaceBacktick}}{{{testName}}}{{/lambda.replaceBacktick}}`() = r assertEquals({{#match}}{{> tests/param_value}}{{/match}}, it.url.host); {{/testHost}} }{{/testResponse}}{{#testResponse}} - {{#isHelper}}response = { + response = { {{^match.isPrimitive}} assertNotNull(it) JSONAssert.assertEquals("""{{{match.value}}}""", Json.encodeToString(Json.encodeToJsonElement(it)), JSONCompareMode.STRICT) @@ -50,11 +50,7 @@ fun `{{#lambda.replaceBacktick}}{{{testName}}}{{/lambda.replaceBacktick}}`() = r assertEquals({{#match}}{{> tests/param_value}}{{/match}}, it) {{/match.isNull}} {{/match.isPrimitive}} - }{{/isHelper}} - {{^isHelper}}response = { - val response = Json.encodeToString(it) - assertEquals({{#match}}{{> tests/param_value}}{{/match}}, response) - }{{/isHelper}} + } {{/testResponse}} ) {{/isMethod}} diff --git a/templates/swift/tests/client/method.mustache b/templates/swift/tests/client/method.mustache index b93c98a2bef..c83fac869c2 100644 --- a/templates/swift/tests/client/method.mustache +++ b/templates/swift/tests/client/method.mustache @@ -1,13 +1,9 @@ -{{#hasResponse}}let response{{#isGeneric}}: Response<{{#lambda.prefix}}{{{returnType}}}{{/lambda.prefix}}<{{#lambda.prefix}}Hit{{/lambda.prefix}}>>{{/isGeneric}} = {{> tests/method}}{{/hasResponse}} -{{^hasResponse}}let _{{#isGeneric}}: Response<{{#lambda.prefix}}{{{returnType}}}{{/lambda.prefix}}<{{#lambda.prefix}}Hit{{/lambda.prefix}}>>{{/isGeneric}} = {{> tests/method}}{{/hasResponse}} +{{#hasResponse}}let response{{#isGeneric}}: {{#useEchoRequester}}Response<{{/useEchoRequester}}{{#lambda.prefix}}{{{returnType}}}{{/lambda.prefix}}<{{#lambda.prefix}}Hit{{/lambda.prefix}}>{{#useEchoRequester}}>{{/useEchoRequester}}{{/isGeneric}} = {{> tests/method}}{{/hasResponse}} +{{^hasResponse}}let _ = {{> tests/method}}{{/hasResponse}} {{^isHelper}} {{^isBenchmark}} -let responseBodyData = try XCTUnwrap(response.bodyData) {{#useEchoRequester}} -let echoResponse = try CodableHelper.jsonDecoder.decode(EchoResponse.self, from: responseBodyData) -{{/useEchoRequester}} -{{^useEchoRequester}} -let responseBodyJSON = try XCTUnwrap(responseBodyData.jsonString) +let echoResponse = try CodableHelper.jsonDecoder.decode(EchoResponse.self, from: XCTUnwrap(response.bodyData)) {{/useEchoRequester}} {{/isBenchmark}} {{/isHelper}} \ No newline at end of file diff --git a/templates/swift/tests/client/tests.mustache b/templates/swift/tests/client/tests.mustache index d9072620a09..1df06c93b3e 100644 --- a/templates/swift/tests/client/tests.mustache +++ b/templates/swift/tests/client/tests.mustache @@ -41,8 +41,7 @@ {{#testResponse}} {{#isHelper}} {{^match.isPrimitive}} - let comparableData = try XCTUnwrap("{{#lambda.escapeQuotes}}{{{match.value}}}{{/lambda.escapeQuotes}}".data(using: .utf8)) - try XCTLenientAssertEqual(received: CodableHelper.jsonEncoder.encode(response), expected: comparableData) + try XCTLenientAssertEqual(received: response, expected: "{{#lambda.escapeQuotes}}{{{match.value}}}{{/lambda.escapeQuotes}}") {{/match.isPrimitive}} {{#match.isPrimitive}} {{#match.isNull}} @@ -54,9 +53,7 @@ {{/match.isPrimitive}} {{/isHelper}} {{^isHelper}} - let comparableData = "{{#lambda.escapeQuotes}}{{{match.value}}}{{/lambda.escapeQuotes}}".data(using: .utf8) - let comparableJSON = try XCTUnwrap(comparableData?.jsonString) - XCTAssertEqual(comparableJSON, responseBodyJSON); + XTCJSONEquals(received: response, expected: "{{#lambda.escapeQuotes}}{{{match.value}}}{{/lambda.escapeQuotes}}") {{/isHelper}} {{/testResponse}} {{#shouldScope}} diff --git a/templates/swift/tests/e2e/e2e.mustache b/templates/swift/tests/e2e/e2e.mustache index 4a8112dbc9e..e65fbdb9665 100644 --- a/templates/swift/tests/e2e/e2e.mustache +++ b/templates/swift/tests/e2e/e2e.mustache @@ -63,12 +63,7 @@ final class {{client}}RequestsTestsE2E: XCTestCase { {{#response}} let response{{#isGeneric}}: Response<{{#lambda.prefix}}{{{returnType}}}{{/lambda.prefix}}<{{#lambda.prefix}}Hit{{/lambda.prefix}}>>{{/isGeneric}} = {{> tests/method}} {{#body}} - let responseBody = try XCTUnwrap(response.body) - let responseBodyData = try CodableHelper.jsonEncoder.encode(responseBody) - - let expectedBodyData = try XCTUnwrap("{{#lambda.escapeJSON}}{{{body}}}{{/lambda.escapeJSON}}".data(using: .utf8)) - - XCTLenientAssertEqual(received: responseBodyData, expected: expectedBodyData) + try XCTLenientAssertEqual(received: XCTUnwrap(response.body), expected: "{{#lambda.escapeJSON}}{{{body}}}{{/lambda.escapeJSON}}") {{/body}} {{#statusCode}} diff --git a/templates/swift/tests/method.mustache b/templates/swift/tests/method.mustache index b8ff0e3936a..bce88e6ae58 100644 --- a/templates/swift/tests/method.mustache +++ b/templates/swift/tests/method.mustache @@ -1,4 +1,4 @@ -try {{#isAsyncMethod}}await {{/isAsyncMethod}}client.{{method}}{{^isHelper}}{{^isGuide}}WithHTTPInfo{{/isGuide}}{{/isHelper}}({{#hasParams}}{{#parametersWithDataType}}{{> tests/generateParams }}{{^-last}}, {{/-last}}{{/parametersWithDataType}}{{/hasParams}}{{#hasRequestOptions}}{{#requestOptions}}, requestOptions: RequestOptions( +try {{#isAsyncMethod}}await {{/isAsyncMethod}}client.{{method}}{{#useEchoRequester}}WithHTTPInfo{{/useEchoRequester}}({{#hasParams}}{{#parametersWithDataType}}{{> tests/generateParams }}{{^-last}}, {{/-last}}{{/parametersWithDataType}}{{/hasParams}}{{#hasRequestOptions}}{{#requestOptions}}, requestOptions: RequestOptions( {{#headers}} headers: [{{#parametersWithDataType}}"{{key}}": {{> tests/paramValue }}{{^-last}}, {{/-last}}{{/parametersWithDataType}}]{{#queryParameters}},{{/queryParameters}} {{/headers}} diff --git a/tests/CTS/client/search/api.json b/tests/CTS/client/search/api.json index a2def1c53be..b57dca7daa0 100644 --- a/tests/CTS/client/search/api.json +++ b/tests/CTS/client/search/api.json @@ -224,5 +224,80 @@ } } ] + }, + { + "testName": "can handle unknown response fields", + "autoCreateClient": false, + "steps": [ + { + "type": "createClient", + "parameters": { + "appId": "test-app-id", + "apiKey": "test-api-key", + "region": "us", + "customHosts": [ + { + "port": 6686 + } + ] + } + }, + { + "type": "method", + "method": "getSettings", + "parameters": { + "indexName": "cts_e2e_unknownField_${{language}}" + }, + "expected": { + "type": "response", + "match": { + "minWordSizefor1Typo": 12, + "minWordSizefor2Typos": 13, + "hitsPerPage": 14 + } + } + } + ] + }, + { + "testName": "can handle unknown response fields inside a nested oneOf", + "autoCreateClient": false, + "steps": [ + { + "type": "createClient", + "parameters": { + "appId": "test-app-id", + "apiKey": "test-api-key", + "region": "us", + "customHosts": [ + { + "port": 6686 + } + ] + } + }, + { + "type": "method", + "method": "getRule", + "parameters": { + "indexName": "cts_e2e_unknownFieldNested_${{language}}", + "objectID": "ruleObjectID" + }, + "expected": { + "type": "response", + "match": { + "objectID": "ruleObjectID", + "consequence": { + "promote": [ + { + "objectID": "1", + "position": 10 + } + ] + } + } + } + } + ] } ] diff --git a/tests/output/go/go.mod b/tests/output/go/go.mod index b15cc831111..c1df701fe9f 100644 --- a/tests/output/go/go.mod +++ b/tests/output/go/go.mod @@ -15,15 +15,6 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/gabriel-vasile/mimetype v1.4.8 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.26.0 // indirect - github.com/leodido/go-urn v1.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/crypto v0.33.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/sys v0.30.0 // indirect - golang.org/x/text v0.22.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/tests/output/go/go.sum b/tests/output/go/go.sum index d91a2eab029..7454aecf932 100644 --- a/tests/output/go/go.sum +++ b/tests/output/go/go.sum @@ -1,33 +1,13 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= -github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k= -github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/kinbiko/jsonassert v1.2.0 h1:+/JthIVXdIrThrOtSN9ry0mNtWKXMWuvxR0nU7gQ+tI= github.com/kinbiko/jsonassert v1.2.0/go.mod h1:pCc3uudOt+lVAbkji9O0uw8MSVt4s+1ZJ0y8Ux2F1Og= -github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= -github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/tests/output/swift/Tests/Utils/Utils.swift b/tests/output/swift/Tests/Utils/Utils.swift index f078bfc8c0d..16f4e701722 100644 --- a/tests/output/swift/Tests/Utils/Utils.swift +++ b/tests/output/swift/Tests/Utils/Utils.swift @@ -31,14 +31,31 @@ struct TestError: Error { let message: String } -public func XCTLenientAssertEqual(received: Data, expected: Data) { +public func XTCJSONEquals(received: some Encodable, expected: String) { + let expectedData = expected.data(using: .utf8)! + let receivedJSON = try! JSONEncoder().encode(received) + + let dictReceived = try! JSONSerialization.jsonObject(with: receivedJSON) as! NSDictionary + let dictExpected = try! JSONSerialization.jsonObject(with: expectedData) as! NSDictionary + + XCTAssertEqual( + dictReceived, + dictExpected, + """ + Received JSON: \(String(data: receivedJSON, encoding: .utf8) ?? "nil") + Expected JSON: \(expected) + """ + ) +} + +public func XCTLenientAssertEqual(received: some Encodable, expected: String) { + let receivedData = try! JSONEncoder().encode(received) guard let unionizedObject = try? union( - expected: JSONSerialization.jsonObject(with: expected, options: [.fragmentsAllowed]), - received: JSONSerialization.jsonObject(with: received, options: [.fragmentsAllowed]) + expected: JSONSerialization.jsonObject(with: expected.data(using: .utf8)!, options: [.fragmentsAllowed]), + received: JSONSerialization.jsonObject(with: receivedData, options: [.fragmentsAllowed]) ) else { - if let receivedString = String(data: received, encoding: .utf8), - let expectedString = String(data: expected, encoding: .utf8) { - XCTAssertEqual(receivedString, expectedString) + if let receivedString = String(data: receivedData, encoding: .utf8) { + XCTAssertEqual(receivedString, expected) } else { XCTFail("Unable to unionize received and expected objects") } @@ -47,9 +64,11 @@ public func XCTLenientAssertEqual(received: Data, expected: Data) { guard let unionizedData = try? JSONSerialization.data(withJSONObject: unionizedObject, options: .fragmentsAllowed), let unionizedJSON = unionizedData.jsonString?.data(using: .utf8), - let expectedJSON = expected.jsonString?.data(using: .utf8), let unionizedString = String(data: unionizedJSON, encoding: .utf8), - let expectedString = String(data: expectedJSON, encoding: .utf8) + let expectedJSON = try? JSONSerialization.jsonObject(with: expected.data(using: .utf8)!, options: .fragmentsAllowed), + let expectedData = try? JSONSerialization.data(withJSONObject: expectedJSON, options: .fragmentsAllowed), + let expectedMinifiedJSON = expectedData.jsonString?.data(using: .utf8), + let expectedString = String(data: expectedMinifiedJSON, encoding: .utf8) else { XCTFail("Unable to serialize JSON strings") return