Skip to content

chore(test): check that the response can contain unknown field #4805

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
13 changes: 0 additions & 13 deletions clients/algoliasearch-client-go/go.mod
Original file line number Diff line number Diff line change
@@ -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
)
28 changes: 0 additions & 28 deletions clients/algoliasearch-client-go/go.sum
Original file line number Diff line number Diff line change
@@ -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=
45 changes: 45 additions & 0 deletions scripts/cts/testServer/algoliaMock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Server> {
Expand Down
20 changes: 0 additions & 20 deletions templates/go/client.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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 {
Expand Down
6 changes: 3 additions & 3 deletions templates/go/model_oneof.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 0 additions & 12 deletions templates/go/snippets/go.mod.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
8 changes: 2 additions & 6 deletions templates/kotlin/tests/client/tests.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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}}
Expand Down
10 changes: 3 additions & 7 deletions templates/swift/tests/client/method.mustache
Original file line number Diff line number Diff line change
@@ -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}}
7 changes: 2 additions & 5 deletions templates/swift/tests/client/tests.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -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}}
Expand All @@ -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}}
Expand Down
7 changes: 1 addition & 6 deletions templates/swift/tests/e2e/e2e.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -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}}
Expand Down
2 changes: 1 addition & 1 deletion templates/swift/tests/method.mustache
Original file line number Diff line number Diff line change
@@ -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}}
Expand Down
75 changes: 75 additions & 0 deletions tests/CTS/client/search/api.json
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
]
}
}
}
}
]
}
]
9 changes: 0 additions & 9 deletions tests/output/go/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
20 changes: 0 additions & 20 deletions tests/output/go/go.sum
Original file line number Diff line number Diff line change
@@ -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=
Expand Down
Loading