From 30a1f2797c9c848d461b6dceee5592aa48910ab2 Mon Sep 17 00:00:00 2001
From: Pierre Millot
Date: Thu, 18 Jan 2024 12:17:29 +0100
Subject: [PATCH] feat(go): add client tests (#2552)
---
.github/.cache_version | 2 +-
clients/algoliasearch-client-go/README.md | 2 +-
.../algolia/{internal => }/errs/net_err.go | 0
.../errs/no_more_host_to_try_err.go | 0
.../algolia/{internal => }/errs/wait_err.go | 0
.../algolia/transport/configuration.go | 22 +
.../{internal => }/transport/requester.go | 37 +-
.../transport/retry_strategy.go | 0
.../{internal => }/transport/stateful_host.go | 0
.../{internal => }/transport/transport.go | 29 +-
.../algolia/{internal => }/transport/utils.go | 5 -
.../algolia/{abtesting => utils}/utils.go | 18 +-
clients/algoliasearch-client-go/go.mod | 2 +-
config/generation.config.mjs | 4 +-
.../algolia/codegen/AlgoliaGoGenerator.java | 8 +-
.../codegen/cts/manager/GoCTSManager.java | 6 -
.../codegen/cts/tests/ClientTestData.java | 2 +-
.../cts/tests/ParametersWithDataType.java | 24 +-
.../codegen/cts/tests/TestsClient.java | 5 +
.../com/algolia/codegen/utils/Helpers.java | 6 +
scripts/ci/githubActions/createMatrix.ts | 2 +-
scripts/cts/runCts.ts | 2 +-
templates/go/api.mustache | 52 ++-
templates/go/client.mustache | 97 ++---
templates/go/configuration.mustache | 40 +-
templates/go/model.mustache | 1 +
.../go/tests/client/createClient.mustache | 9 +
templates/go/tests/client/method.mustache | 5 +
templates/go/tests/client/step.mustache | 6 +
templates/go/tests/client/suite.mustache | 74 ++++
templates/go/tests/common.mustache | 35 --
.../go/tests/generateInnerParams.mustache | 2 +-
templates/go/tests/requests/requests.mustache | 36 +-
templates/go/utils.mustache | 376 ------------------
templates/ruby/snippets/method.mustache | 4 +-
templates/ruby/tests/client/method.mustache | 2 +-
templates/ruby/tests/generateParams.mustache | 1 +
.../tests/requests/generateParams.mustache | 1 -
.../ruby/tests/requests/requests.mustache | 6 +-
tests/output/go/.golangci.yml | 10 +
tests/output/go/go.mod | 4 +-
tests/output/go/tests/echo.go | 47 +++
...-or-move-index-rules-settings-synonyms.mdx | 6 +-
.../guides/customized-client-usage.mdx | 8 +-
.../docs/clients/guides/delete-objects.mdx | 2 +-
.../clients/guides/filtering-your-search.mdx | 6 +-
.../guides/manage-dictionary-entries.mdx | 8 +-
.../guides/replace-all-rules-synonyms.mdx | 4 +-
.../docs/clients/guides/retrieving-facets.mdx | 4 +-
.../clients/guides/send-data-to-algolia.mdx | 4 +-
.../guides/wait-for-a-task-to-finish.mdx | 2 +-
.../guides/wait-for-api-key-to-be-valid.mdx | 2 +-
website/docs/clients/installation.mdx | 2 +-
website/docs/clients/migration-guides/go.md | 2 +-
website/docs/contributing/setup-repository.md | 5 +
55 files changed, 396 insertions(+), 643 deletions(-)
rename clients/algoliasearch-client-go/algolia/{internal => }/errs/net_err.go (100%)
rename clients/algoliasearch-client-go/algolia/{internal => }/errs/no_more_host_to_try_err.go (100%)
rename clients/algoliasearch-client-go/algolia/{internal => }/errs/wait_err.go (100%)
create mode 100644 clients/algoliasearch-client-go/algolia/transport/configuration.go
rename clients/algoliasearch-client-go/algolia/{internal => }/transport/requester.go (50%)
rename clients/algoliasearch-client-go/algolia/{internal => }/transport/retry_strategy.go (100%)
rename clients/algoliasearch-client-go/algolia/{internal => }/transport/stateful_host.go (100%)
rename clients/algoliasearch-client-go/algolia/{internal => }/transport/transport.go (81%)
rename clients/algoliasearch-client-go/algolia/{internal => }/transport/utils.go (79%)
rename clients/algoliasearch-client-go/algolia/{abtesting => utils}/utils.go (95%)
create mode 100644 templates/go/tests/client/createClient.mustache
create mode 100644 templates/go/tests/client/method.mustache
create mode 100644 templates/go/tests/client/step.mustache
create mode 100644 templates/go/tests/client/suite.mustache
delete mode 100644 templates/go/tests/common.mustache
delete mode 100644 templates/go/utils.mustache
create mode 100644 templates/ruby/tests/generateParams.mustache
delete mode 100644 templates/ruby/tests/requests/generateParams.mustache
create mode 100644 tests/output/go/.golangci.yml
create mode 100644 tests/output/go/tests/echo.go
diff --git a/.github/.cache_version b/.github/.cache_version
index 238d6e882a..b0f3d96f87 100644
--- a/.github/.cache_version
+++ b/.github/.cache_version
@@ -1 +1 @@
-1.0.7
+1.0.8
diff --git a/clients/algoliasearch-client-go/README.md b/clients/algoliasearch-client-go/README.md
index a98a42ceb6..9a8e3d1108 100644
--- a/clients/algoliasearch-client-go/README.md
+++ b/clients/algoliasearch-client-go/README.md
@@ -10,7 +10,7 @@
-
+
diff --git a/clients/algoliasearch-client-go/algolia/internal/errs/net_err.go b/clients/algoliasearch-client-go/algolia/errs/net_err.go
similarity index 100%
rename from clients/algoliasearch-client-go/algolia/internal/errs/net_err.go
rename to clients/algoliasearch-client-go/algolia/errs/net_err.go
diff --git a/clients/algoliasearch-client-go/algolia/internal/errs/no_more_host_to_try_err.go b/clients/algoliasearch-client-go/algolia/errs/no_more_host_to_try_err.go
similarity index 100%
rename from clients/algoliasearch-client-go/algolia/internal/errs/no_more_host_to_try_err.go
rename to clients/algoliasearch-client-go/algolia/errs/no_more_host_to_try_err.go
diff --git a/clients/algoliasearch-client-go/algolia/internal/errs/wait_err.go b/clients/algoliasearch-client-go/algolia/errs/wait_err.go
similarity index 100%
rename from clients/algoliasearch-client-go/algolia/internal/errs/wait_err.go
rename to clients/algoliasearch-client-go/algolia/errs/wait_err.go
diff --git a/clients/algoliasearch-client-go/algolia/transport/configuration.go b/clients/algoliasearch-client-go/algolia/transport/configuration.go
new file mode 100644
index 0000000000..794d35d7e1
--- /dev/null
+++ b/clients/algoliasearch-client-go/algolia/transport/configuration.go
@@ -0,0 +1,22 @@
+package transport
+
+import (
+ "time"
+
+ "github.com/algolia/algoliasearch-client-go/v4/algolia/compression"
+)
+
+type Configuration struct {
+ AppID string
+ ApiKey string
+
+ Hosts []string
+ DefaultHeader map[string]string
+ UserAgent string
+ Debug bool
+ Requester Requester
+ ReadTimeout time.Duration
+ WriteTimeout time.Duration
+ ConnectTimeout time.Duration
+ Compression compression.Compression
+}
diff --git a/clients/algoliasearch-client-go/algolia/internal/transport/requester.go b/clients/algoliasearch-client-go/algolia/transport/requester.go
similarity index 50%
rename from clients/algoliasearch-client-go/algolia/internal/transport/requester.go
rename to clients/algoliasearch-client-go/algolia/transport/requester.go
index d14cb28ecd..d6c20997dd 100644
--- a/clients/algoliasearch-client-go/algolia/internal/transport/requester.go
+++ b/clients/algoliasearch-client-go/algolia/transport/requester.go
@@ -22,37 +22,40 @@ const (
// the Algolia API client (by wrapping it in a user-defined instance of
// transport.Requester) but would like to wrap it into a middleware layer or
// pass it to an HTTP interceptor.
-func DefaultHTTPClient() *http.Client {
- return &http.Client{
- Transport: defaultTransport,
+func DefaultHTTPClient(connectTimeout *time.Duration) *http.Client {
+ connectTimeoutValue := DefaultConnectTimeout
+ if connectTimeout != nil {
+ connectTimeoutValue = *connectTimeout
}
-}
-var defaultTransport = &http.Transport{
- DialContext: (&net.Dialer{
- KeepAlive: DefaultKeepAliveDuration,
- Timeout: DefaultConnectTimeout,
- }).DialContext,
- DisableKeepAlives: false,
- MaxIdleConnsPerHost: DefaultMaxIdleConnsPerHost,
- Proxy: http.ProxyFromEnvironment,
- TLSHandshakeTimeout: DefaultTLSHandshakeTimeout,
+ return &http.Client{
+ Transport: &http.Transport{
+ DialContext: (&net.Dialer{
+ KeepAlive: DefaultKeepAliveDuration,
+ Timeout: connectTimeoutValue,
+ }).DialContext,
+ DisableKeepAlives: false,
+ MaxIdleConnsPerHost: DefaultMaxIdleConnsPerHost,
+ Proxy: http.ProxyFromEnvironment,
+ TLSHandshakeTimeout: DefaultTLSHandshakeTimeout,
+ },
+ }
}
type Requester interface {
- Request(req *http.Request) (*http.Response, error)
+ Request(req *http.Request, timeout time.Duration, connectTimeout time.Duration) (*http.Response, error)
}
type defaultRequester struct {
client *http.Client
}
-func newDefaultRequester() *defaultRequester {
+func NewDefaultRequester(connectTimeout *time.Duration) *defaultRequester {
return &defaultRequester{
- client: DefaultHTTPClient(),
+ client: DefaultHTTPClient(connectTimeout),
}
}
-func (r *defaultRequester) Request(req *http.Request) (*http.Response, error) {
+func (r *defaultRequester) Request(req *http.Request, _, _ time.Duration) (*http.Response, error) {
return r.client.Do(req)
}
diff --git a/clients/algoliasearch-client-go/algolia/internal/transport/retry_strategy.go b/clients/algoliasearch-client-go/algolia/transport/retry_strategy.go
similarity index 100%
rename from clients/algoliasearch-client-go/algolia/internal/transport/retry_strategy.go
rename to clients/algoliasearch-client-go/algolia/transport/retry_strategy.go
diff --git a/clients/algoliasearch-client-go/algolia/internal/transport/stateful_host.go b/clients/algoliasearch-client-go/algolia/transport/stateful_host.go
similarity index 100%
rename from clients/algoliasearch-client-go/algolia/internal/transport/stateful_host.go
rename to clients/algoliasearch-client-go/algolia/transport/stateful_host.go
diff --git a/clients/algoliasearch-client-go/algolia/internal/transport/transport.go b/clients/algoliasearch-client-go/algolia/transport/transport.go
similarity index 81%
rename from clients/algoliasearch-client-go/algolia/internal/transport/transport.go
rename to clients/algoliasearch-client-go/algolia/transport/transport.go
index 31772cf147..6723a1a11e 100644
--- a/clients/algoliasearch-client-go/algolia/internal/transport/transport.go
+++ b/clients/algoliasearch-client-go/algolia/transport/transport.go
@@ -11,13 +11,14 @@ import (
"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/debug"
- "github.com/algolia/algoliasearch-client-go/v4/algolia/internal/errs"
+ "github.com/algolia/algoliasearch-client-go/v4/algolia/errs"
)
type Transport struct {
- requester Requester
- retryStrategy *RetryStrategy
- compression compression.Compression
+ requester Requester
+ retryStrategy *RetryStrategy
+ compression compression.Compression
+ connectTimeout time.Duration
}
func New(
@@ -25,16 +26,22 @@ func New(
requester Requester,
readTimeout time.Duration,
writeTimeout time.Duration,
+ connectTimeout time.Duration,
compression compression.Compression,
) *Transport {
+ if connectTimeout == 0 {
+ connectTimeout = DefaultConnectTimeout
+ }
+
if requester == nil {
- requester = newDefaultRequester()
+ requester = NewDefaultRequester(&connectTimeout)
}
return &Transport{
- requester: requester,
- retryStrategy: newRetryStrategy(hosts, readTimeout, writeTimeout),
- compression: compression,
+ requester: requester,
+ retryStrategy: newRetryStrategy(hosts, readTimeout, writeTimeout),
+ compression: compression,
+ connectTimeout: connectTimeout,
}
}
@@ -56,7 +63,7 @@ func (t *Transport) Request(ctx context.Context, req *http.Request, k call.Kind)
// cancelled` error may happen when the body is read.
perRequestCtx, cancel := context.WithTimeout(ctx, h.timeout)
req = req.WithContext(perRequestCtx)
- res, err := t.request(req, h.host)
+ res, err := t.request(req, h.host, h.timeout, t.connectTimeout)
code := 0
if res != nil {
@@ -98,12 +105,12 @@ func (t *Transport) Request(ctx context.Context, req *http.Request, k call.Kind)
return nil, errs.ErrNoMoreHostToTry
}
-func (t *Transport) request(req *http.Request, host string) (*http.Response, error) {
+func (t *Transport) request(req *http.Request, host string, timeout time.Duration, connectTimeout time.Duration) (*http.Response, error) {
req.URL.Scheme = "https"
req.URL.Host = host
debug.Display(req)
- res, err := t.requester.Request(req)
+ res, err := t.requester.Request(req, timeout, connectTimeout)
debug.Display(res)
if err != nil {
diff --git a/clients/algoliasearch-client-go/algolia/internal/transport/utils.go b/clients/algoliasearch-client-go/algolia/transport/utils.go
similarity index 79%
rename from clients/algoliasearch-client-go/algolia/internal/transport/utils.go
rename to clients/algoliasearch-client-go/algolia/transport/utils.go
index 4972050916..57e97ea287 100644
--- a/clients/algoliasearch-client-go/algolia/internal/transport/utils.go
+++ b/clients/algoliasearch-client-go/algolia/transport/utils.go
@@ -2,13 +2,8 @@ package transport
import (
"math/rand"
- "time"
)
-func init() {
- rand.Seed(int64(time.Now().Nanosecond()))
-}
-
func Shuffle(hosts []*StatefulHost) []*StatefulHost {
if hosts == nil {
return nil
diff --git a/clients/algoliasearch-client-go/algolia/abtesting/utils.go b/clients/algoliasearch-client-go/algolia/utils/utils.go
similarity index 95%
rename from clients/algoliasearch-client-go/algolia/abtesting/utils.go
rename to clients/algoliasearch-client-go/algolia/utils/utils.go
index 559bd8d274..fef1bbdb77 100644
--- a/clients/algoliasearch-client-go/algolia/abtesting/utils.go
+++ b/clients/algoliasearch-client-go/algolia/utils/utils.go
@@ -1,21 +1,11 @@
-/*
-A/B Testing API
-
-API powering the A/B Testing feature of Algolia.
-
-API version: 1.0.0
-*/
-
-// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
-
-package abtesting
+package utils
import (
"encoding/json"
"reflect"
"time"
- "github.com/algolia/algoliasearch-client-go/v4/algolia/internal/errs"
+ "github.com/algolia/algoliasearch-client-go/v4/algolia/errs"
)
// PtrBool is a helper routine that returns a pointer to given boolean value.
@@ -330,8 +320,8 @@ func (v *NullableTime) UnmarshalJSON(src []byte) error {
return json.Unmarshal(src, &v.value)
}
-// isNilorEmpty checks if an input is nil or empty
-func isNilorEmpty(i any) bool {
+// IsNilOrEmpty checks if an input is nil or empty.
+func IsNilOrEmpty(i any) bool {
if i == nil {
return true
}
diff --git a/clients/algoliasearch-client-go/go.mod b/clients/algoliasearch-client-go/go.mod
index eae471241b..672b1d6cbe 100644
--- a/clients/algoliasearch-client-go/go.mod
+++ b/clients/algoliasearch-client-go/go.mod
@@ -1,6 +1,6 @@
module github.com/algolia/algoliasearch-client-go/v4
-go 1.19
+go 1.21
require github.com/go-playground/validator/v10 v10.17.0
diff --git a/config/generation.config.mjs b/config/generation.config.mjs
index fd8b43ac6a..cd73aa50c9 100644
--- a/config/generation.config.mjs
+++ b/config/generation.config.mjs
@@ -41,10 +41,12 @@ export const patterns = [
'clients/algoliasearch-client-go/algolia/**',
'!clients/algoliasearch-client-go/.github/**',
'!clients/algoliasearch-client-go/*',
- '!clients/algoliasearch-client-go/algolia/internal/**',
+ '!clients/algoliasearch-client-go/algolia/transport/**',
+ '!clients/algoliasearch-client-go/algolia/errs/**',
'!clients/algoliasearch-client-go/algolia/call/*',
'!clients/algoliasearch-client-go/algolia/compression/*',
'!clients/algoliasearch-client-go/algolia/debug/*',
+ '!clients/algoliasearch-client-go/algolia/utils/*',
'tests/output/go/go.sum',
diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java
index 648eea7efb..a7ae97abe3 100644
--- a/generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java
+++ b/generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java
@@ -51,8 +51,6 @@ public void processOpts() {
supportingFiles.clear();
supportingFiles.add(new SupportingFile("configuration.mustache", "", "configuration.go"));
supportingFiles.add(new SupportingFile("client.mustache", "", "client.go"));
- supportingFiles.add(new SupportingFile("response.mustache", "", "response.go"));
- supportingFiles.add(new SupportingFile("utils.mustache", "", "utils.go"));
try {
Helpers.generateServer(client, additionalProperties);
@@ -76,11 +74,11 @@ public Map postProcessAllModels(Map objs)
for (Map.Entry entry : models.entrySet()) {
String modelName = entry.getKey();
- ModelsMap model = entry.getValue();
+ CodegenModel model = entry.getValue().getModels().get(0).getModel();
// for some reason the property additionalPropertiesIsAnyType is not propagated to the
// property
- for (CodegenProperty prop : model.getModels().get(0).getModel().getVars()) {
+ for (CodegenProperty prop : model.getVars()) {
ModelsMap propertyModel = models.get(prop.datatypeWithEnum);
if (propertyModel != null && propertyModel.getModels().get(0).getModel().getAdditionalPropertiesIsAnyType()) {
// consider it the same as model for our purpose
@@ -92,6 +90,8 @@ public Map postProcessAllModels(Map objs)
prop.dataType = prop.dataType.replace("[]*[]", "[][]");
prop.vendorExtensions.put("x-go-base-type", prop.dataType);
}
+
+ prop.dataType = prop.dataType.replace("NullableBool", "utils.NullableBool");
}
}
return models;
diff --git a/generators/src/main/java/com/algolia/codegen/cts/manager/GoCTSManager.java b/generators/src/main/java/com/algolia/codegen/cts/manager/GoCTSManager.java
index 1513b4fd90..3962f728e5 100644
--- a/generators/src/main/java/com/algolia/codegen/cts/manager/GoCTSManager.java
+++ b/generators/src/main/java/com/algolia/codegen/cts/manager/GoCTSManager.java
@@ -2,15 +2,9 @@
import com.algolia.codegen.exceptions.GeneratorException;
import java.util.*;
-import org.openapitools.codegen.SupportingFile;
public class GoCTSManager implements CTSManager {
- @Override
- public void addTestsSupportingFiles(List supportingFiles) {
- supportingFiles.add(new SupportingFile("tests/common.mustache", "tests/output/go/tests/requests", "common.go"));
- }
-
@Override
public void addDataToBundle(Map bundle) throws GeneratorException {
Object clientPrefix = bundle.get("clientPrefix");
diff --git a/generators/src/main/java/com/algolia/codegen/cts/tests/ClientTestData.java b/generators/src/main/java/com/algolia/codegen/cts/tests/ClientTestData.java
index a68d31deb2..66a9cf700b 100644
--- a/generators/src/main/java/com/algolia/codegen/cts/tests/ClientTestData.java
+++ b/generators/src/main/java/com/algolia/codegen/cts/tests/ClientTestData.java
@@ -22,6 +22,6 @@ class Step {
class Expected {
public String type;
- public Object error;
+ public String error;
public Object match;
}
diff --git a/generators/src/main/java/com/algolia/codegen/cts/tests/ParametersWithDataType.java b/generators/src/main/java/com/algolia/codegen/cts/tests/ParametersWithDataType.java
index b90fd642a2..0fe740856f 100644
--- a/generators/src/main/java/com/algolia/codegen/cts/tests/ParametersWithDataType.java
+++ b/generators/src/main/java/com/algolia/codegen/cts/tests/ParametersWithDataType.java
@@ -145,7 +145,7 @@ private Map traverseParams(
testOutput.put("isParentFreeFormObject", isParentFreeFormObject);
if (param == null) {
- handleNull(testOutput);
+ handleNull(spec, testOutput);
} else if (spec.getIsArray()) {
handleArray(paramName, param, testOutput, spec, suffix);
} else if (spec.getIsEnum()) {
@@ -155,7 +155,7 @@ private Map traverseParams(
handleModel(paramName, param, testOutput, spec, baseType, parent, suffix);
} else if (baseType.equals("Object")) {
// not var, no item, pure free form
- handleObject(paramName, param, testOutput, suffix);
+ handleObject(paramName, param, testOutput, true, suffix);
} else if (spec.getIsMap()) {
// free key but only one type
handleMap(paramName, param, testOutput, spec, suffix);
@@ -188,11 +188,11 @@ private Map traverseParamsWithoutSpec(String paramName, Object p
}
if (param == null) {
- handleNull(testOutput);
+ handleNull(null, testOutput);
} else if (param instanceof List) {
handleArray(paramName, param, testOutput, null, suffix);
} else if (param instanceof Map) {
- handleObject(paramName, param, testOutput, suffix);
+ handleObject(paramName, param, testOutput, false, suffix);
} else {
handlePrimitive(param, testOutput, null);
}
@@ -205,6 +205,7 @@ private Map createDefaultOutput() {
// we need to set all types to false otherwise mustache will read the one from the parent
// context and run into a infinite loop
testOutput.put("isObject", false);
+ testOutput.put("isNullObject", false);
testOutput.put("isArray", false);
testOutput.put("isNull", false);
testOutput.put("isFreeFormObject", false);
@@ -224,8 +225,11 @@ private Map createDefaultOutput() {
return testOutput;
}
- private void handleNull(Map testOutput) {
+ private void handleNull(IJsonSchemaValidationProperties spec, Map testOutput) {
testOutput.put("isNull", true);
+ if (spec.getIsModel() || spec instanceof CodegenModel) {
+ testOutput.put("isNullObject", true);
+ }
}
private void handleArray(
@@ -385,7 +389,8 @@ private void handleModel(
testOutput.put("optionalValue", optionalValues);
}
- private void handleObject(String paramName, Object param, Map testOutput, int suffix) throws CTSException {
+ private void handleObject(String paramName, Object param, Map testOutput, boolean isSimpleObject, int suffix)
+ throws CTSException {
Map vars = (Map) param;
List