Skip to content
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: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ GOBUILDTAGSOPT=-tags "$(GOBUILDTAGS)"

ARANGODB ?= arangodb/enterprise:latest
STARTER ?= arangodb/arangodb-starter:latest
# ARANGODB ?= public.ecr.aws/b0b8h2r4/enterprise-preview:2025-12-01-devel-d759089-amd64
# STARTER ?= arangodb/arangodb-starter:local-test
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Test configuration comments may be accidentally committed

Commented-out test configuration lines referencing specific preview images (enterprise-preview:2025-12-01-devel-d759089-amd64) and local-test starter appear to be developer-specific test settings that were likely not intended to be committed. While harmless as comments, they add clutter and may confuse other contributors.

Fix in Cursor Fix in Web


ifdef VERBOSE
TESTVERBOSEOPTIONS := -v
Expand Down
9 changes: 9 additions & 0 deletions test/asyncjob_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,9 @@ func TestAsyncJobListPending(t *testing.T) {
EnsureVersion(t, ctx, c).CheckVersion(MinimumVersion("3.11.1"))
skipResilientSingle(t)

// for disabling v8 tests
skipAboveVersion(c, "3.12.6-1", t)

db := ensureDatabase(ctx, c, databaseName("db", "async"), nil, t)
defer func() {
err := db.Remove(ctx)
Expand Down Expand Up @@ -254,6 +257,9 @@ func TestAsyncJobDelete(t *testing.T) {
})

t.Run("delete pending job", func(t *testing.T) {
// for disabling v8 tests
skipAboveVersion(c, "3.12.6-1", t)

idTransaction := runLongRequest(t, ctxAsync, db, 10, col.Name())
require.NotEmpty(t, idTransaction)

Expand All @@ -275,6 +281,9 @@ func TestAsyncJobDelete(t *testing.T) {
})

t.Run("delete expired jobs", func(t *testing.T) {
// for disabling v8 tests
skipAboveVersion(c, "3.12.6-1", t)

idTransaction := runLongRequest(t, ctxAsync, db, 10, col.Name())
require.NotEmpty(t, idTransaction)

Expand Down
14 changes: 14 additions & 0 deletions test/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -670,3 +670,17 @@ func checkDBAccess(ctx context.Context, conn driver.Connection, dbName, username

return nil
}

// skipAboveVersion skips the test if the current server version is greater than
// the given version.
func skipAboveVersion(c driver.Client, version driver.Version, t testEnv) driver.VersionInfo {
x, err := c.Version(nil)
if err != nil {
t.Fatalf("Failed to get version info: %s", describe(err))
}
t.Logf("version info %s, version received %s", x.Version, version)
if x.Version.CompareTo(version) > 0 {
t.Skipf("Skipping above version '%s', got version '%s'", version, x.Version)
}
return x
}
4 changes: 3 additions & 1 deletion test/database_transaction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ import (

func TestDatabaseTransaction(t *testing.T) {
c := createClient(t, nil)
skipBelowVersion(c, "3.2", t)
// for disabling v8 tests
skipAboveVersion(c, "3.12.6-1", t)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Minimum version check accidentally removed from transaction test

The skipBelowVersion(c, "3.2", t) check was removed and replaced with only skipAboveVersion(c, "3.12.6-1", t). The original check ensured the test wouldn't run on ArangoDB versions below 3.2 that may not support JavaScript transactions. Both checks serve different purposes and should coexist: the minimum version check protects against old versions lacking the feature, while the maximum version check skips tests on future versions without V8.

Fix in Cursor Fix in Web


db := ensureDatabase(nil, c, "transaction_test", nil, t)
defer func() {
err := db.Remove(nil)
Expand Down
3 changes: 2 additions & 1 deletion v2/arangodb/client_admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ type ClientAdmin interface {
// options of the queried arangod instance.
GetStartupConfigurationDescription(ctx context.Context) (map[string]interface{}, error)

// ReloadRoutingTable reloads the routing information from the _routing system collection.
// ReloadRoutingTable reloads the routing information from the _routing system
// collection, causing Foxx services to rebuild their routing table.
ReloadRoutingTable(ctx context.Context, dbName string) error

// ExecuteAdminScript executes JavaScript code on the server.
Expand Down
3 changes: 2 additions & 1 deletion v2/tests/admin_cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -369,9 +369,10 @@ func Test_ClusterResignLeadership(t *testing.T) {
}

func Test_ClusterStatistics(t *testing.T) {
requireClusterMode(t)

Wrap(t, func(t *testing.T, client arangodb.Client) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, tb testing.TB) {
requireClusterMode(t)
skipBelowVersion(client, ctx, "3.7", t)
// Detect DB-Server ID
serverRole, err := client.ServerRole(ctx)
Expand Down
20 changes: 11 additions & 9 deletions v2/tests/admin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ func Test_GetServerStatus(t *testing.T) {

func Test_GetDeploymentSupportInfo(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
withContextT(t, time.Minute, func(ctx context.Context, t testing.TB) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, t testing.TB) {

serverRole, err := client.ServerRole(ctx)
require.NoError(t, err)
Expand Down Expand Up @@ -209,7 +209,8 @@ func Test_GetStartupConfiguration(t *testing.T) {
func Test_ReloadRoutingTable(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
WithDatabase(t, client, nil, func(db arangodb.Database) {
withContextT(t, time.Minute, func(ctx context.Context, t testing.TB) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, t testing.TB) {
requireV8Enabled(client, ctx, t)
err := client.ReloadRoutingTable(ctx, db.Name())
require.NoError(t, err)
})
Expand All @@ -221,6 +222,7 @@ func Test_ExecuteAdminScript(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
WithDatabase(t, client, nil, func(db arangodb.Database) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, tb testing.TB) {
requireV8Enabled(client, ctx, t)
tests := []struct {
name string
script string
Expand Down Expand Up @@ -275,7 +277,7 @@ func Test_CompactDatabases(t *testing.T) {
// that may conflict with other tests and server role checks can be inconsistent in parallel execution.

Wrap(t, func(t *testing.T, client arangodb.Client) {
withContextT(t, time.Minute, func(ctx context.Context, t testing.TB) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, t testing.TB) {
if !isNoAuth() {
t.Skip("Skipping: superuser tests run only in no-auth mode (TEST_AUTH=none)")
}
Expand Down Expand Up @@ -376,7 +378,7 @@ func validateTLSResponse(t testing.TB, tlsResp arangodb.TLSDataResponse, operati
// Test_ReloadTLSData tests TLS certificate reload functionality, skipping if superuser rights unavailable.
func Test_ReloadTLSData(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
withContextT(t, time.Minute, func(ctx context.Context, t testing.TB) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, t testing.TB) {
if !isNoAuth() {
t.Skip("Skipping: superuser tests run only in no-auth mode (TEST_AUTH=none)")
}
Expand All @@ -397,7 +399,7 @@ func Test_ReloadTLSData(t *testing.T) {
// The test is skipped if superuser rights are missing or the feature is disabled/not configured.
func Test_RotateEncryptionAtRestKey(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
withContextT(t, time.Minute, func(ctx context.Context, t testing.TB) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, t testing.TB) {
if !isNoAuth() {
t.Skip("Skipping: superuser tests run only in no-auth mode (TEST_AUTH=none)")
}
Expand Down Expand Up @@ -464,7 +466,7 @@ func Test_GetJWTSecrets(t *testing.T) {
// Test_ReloadJWTSecrets validates JWT secrets reload functionality, skipping if not available.
func Test_ReloadJWTSecrets(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
withContextT(t, time.Minute, func(ctx context.Context, t testing.TB) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, t testing.TB) {
resp, err := client.ReloadJWTSecrets(ctx)
if err != nil {
if handleJWTSecretsError(t, err, "ReloadJWTSecrets", []int{http.StatusForbidden, http.StatusBadRequest}) {
Expand Down Expand Up @@ -528,7 +530,7 @@ func validateJWTSecretsResponse(t testing.TB, resp arangodb.JWTSecretsResult, op
}
func Test_HandleAdminVersion(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
withContextT(t, time.Minute, func(ctx context.Context, tb testing.TB) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, tb testing.TB) {
t.Run("With Options", func(t *testing.T) {
resp, err := client.HandleAdminVersion(context.Background(), &arangodb.GetVersionOptions{
Details: utils.NewType(true),
Expand All @@ -554,7 +556,7 @@ func Test_HandleAdminVersion(t *testing.T) {
func Test_GetDeploymentId(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
t.Run("Success case", func(t *testing.T) {
withContextT(t, time.Minute, func(ctx context.Context, t testing.TB) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, t testing.TB) {
version := skipBelowVersion(client, ctx, "3.12.6", t)
t.Logf("Current Version %s", version.Version)

Expand All @@ -568,7 +570,7 @@ func Test_GetDeploymentId(t *testing.T) {
})

t.Run("Multiple calls consistency", func(t *testing.T) {
withContextT(t, time.Minute, func(ctx context.Context, t testing.TB) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, t testing.TB) {
version := skipBelowVersion(client, ctx, "3.12.6", t)
t.Logf("Current Version %s", version.Version)

Expand Down
4 changes: 4 additions & 0 deletions v2/tests/asyncjob_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ func TestAsyncJobListPending(t *testing.T) {
skipBelowVersion(client, ctx, "3.11.1", t)
skipResilientSingleMode(t)

requireV8Enabled(client, ctx, t)

ctxAsync := connection.WithAsync(context.Background())

idTransaction := runLongRequest(t, ctxAsync, db, 2, col.Name())
Expand Down Expand Up @@ -254,6 +256,7 @@ func TestAsyncJobDelete(t *testing.T) {
})

t.Run("delete pending job", func(t *testing.T) {
requireV8Enabled(client, ctx, t)
idTransaction := runLongRequest(t, ctxAsync, db, 10, col.Name())
require.NotEmpty(t, idTransaction)

Expand All @@ -275,6 +278,7 @@ func TestAsyncJobDelete(t *testing.T) {
})

t.Run("delete expired jobs", func(t *testing.T) {
requireV8Enabled(client, ctx, t)
idTransaction := runLongRequest(t, ctxAsync, db, 10, col.Name())
require.NotEmpty(t, idTransaction)

Expand Down
6 changes: 5 additions & 1 deletion v2/tests/call_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,11 @@ func Test_CallWithChecks(t *testing.T) {
ok, arangoErr := shared.IsArangoError(err)
require.True(t, ok)
require.True(t, arangoErr.HasError)
require.Equal(t, http.StatusNotFound, resp.Code())
t.Logf("Response code: %d", resp.Code())
require.True(t,
resp.Code() == http.StatusNotFound ||
resp.Code() == http.StatusNotImplemented,
"expected status 404 or 501, got %d", resp.Code())
})
})
})
Expand Down
1 change: 1 addition & 0 deletions v2/tests/database_query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1302,6 +1302,7 @@ func Test_UserDefinedFunctions(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
WithDatabase(t, client, nil, func(db arangodb.Database) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, tb testing.TB) {
requireV8Enabled(client, ctx, tb)
// Define UDF details
namespace := "myfunctions::temperature::" + StringWithCharset(16, charset)
functionName := namespace + "::celsiustofahrenheit"
Expand Down
2 changes: 1 addition & 1 deletion v2/tests/database_transactionsjs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ func Test_DatabaseTransactionsJS(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
WithDatabase(t, client, nil, func(db arangodb.Database) {
WithCollectionV2(t, db, nil, func(col arangodb.Collection) {

requireV8Enabled(client, context.Background(), t)
t.Run("Transaction ReturnValue", func(t *testing.T) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, t testing.TB) {
txJSOptions := arangodb.TransactionJSOptions{
Expand Down
3 changes: 3 additions & 0 deletions v2/tests/foxx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ func Test_FoxxItzpapalotlService(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
WithDatabase(t, client, nil, func(db arangodb.Database) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, tb testing.TB) {
requireV8Enabled(client, ctx, tb)
if os.Getenv("TEST_CONNECTION") == "vst" {
skipBelowVersion(client, ctx, "3.6", t)
}
Expand Down Expand Up @@ -298,6 +299,7 @@ func Test_ListInstalledFoxxServices(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
WithDatabase(t, client, nil, func(db arangodb.Database) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, tb testing.TB) {
requireV8Enabled(client, ctx, tb)
services, err := client.ListInstalledFoxxServices(ctx, db.Name(), nil)
require.NoError(t, err)
require.NotEmpty(t, services)
Expand Down Expand Up @@ -325,6 +327,7 @@ func Test_GetInstalledFoxxService(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
WithDatabase(t, client, nil, func(db arangodb.Database) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, tb testing.TB) {
requireV8Enabled(client, ctx, tb)
mount := "/_api/foxx"
serviceDetails, err := client.GetInstalledFoxxService(ctx, db.Name(), &mount)
require.NoError(t, err)
Expand Down
3 changes: 3 additions & 0 deletions v2/tests/tasks_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ func Test_CreateNewTask(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
WithDatabase(t, client, nil, func(db arangodb.Database) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, tb testing.TB) {
requireV8Enabled(client, ctx, tb)
testCases := map[string]*arangodb.TaskOptions{
"taskWithParams": {
Name: utils.NewType("taskWithParams"),
Expand Down Expand Up @@ -128,6 +129,7 @@ func Test_ValidationsForCreateNewTask(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
WithDatabase(t, client, nil, func(db arangodb.Database) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, tb testing.TB) {
requireV8Enabled(client, ctx, tb)
testCases := map[string]*arangodb.TaskOptions{
"taskWithoutCommand": {
Name: utils.NewType("taskWithoutCommand"),
Expand Down Expand Up @@ -160,6 +162,7 @@ func Test_TaskCreationWithId(t *testing.T) {
Wrap(t, func(t *testing.T, client arangodb.Client) {
WithDatabase(t, client, nil, func(db arangodb.Database) {
withContextT(t, defaultTestTimeout, func(ctx context.Context, tb testing.TB) {
requireV8Enabled(client, ctx, tb)
taskID := "test-task-id" + StringWithCharset(16, charset)
options := &arangodb.TaskOptions{
ID: &taskID, // Optional if CreateTaskWithID sets it, but safe to keep
Expand Down
25 changes: 25 additions & 0 deletions v2/tests/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
"github.com/stretchr/testify/require"

"github.com/arangodb/go-driver/v2/arangodb"
"github.com/arangodb/go-driver/v2/utils"
)

func getTestMode() string {
Expand Down Expand Up @@ -136,3 +137,27 @@ func skipVersionNotInRange(c arangodb.Client, ctx context.Context, minVersion, m
}
return x
}

// requireV8Enabled skips the test if V8 is disabled in the ArangoDB server.
// V8 is required for features like tasks, UDFs, Foxx, JS transactions, and simple queries.
// This function checks the v8-version field in the version details.
// If v8-version is "none", V8 is disabled and the test will be skipped.
func requireV8Enabled(c arangodb.Client, ctx context.Context, t testing.TB) {
versionInfo, err := c.VersionWithOptions(ctx, &arangodb.GetVersionOptions{
Details: utils.NewType(true),
})
t.Logf("V8-Version %s", versionInfo.Details["v8-version"])
if err != nil {
t.Fatalf("Failed to get version info with details: %s", err)
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Error checked after using potentially invalid result

The requireV8Enabled function accesses versionInfo.Details["v8-version"] on line 149 before checking if the VersionWithOptions call returned an error on line 150. If the API call fails, versionInfo may be empty or have nil Details, causing a potential nil map access or logging incorrect information before the error is properly handled and the test is terminated with Fatalf.

Fix in Cursor Fix in Web


// Check if v8-version exists in Details and if it's "none"
if versionInfo.Details != nil {
if v8Version, ok := versionInfo.Details["v8-version"]; ok {
if v8VersionStr, ok := v8Version.(string); ok && v8VersionStr == "none" {
t.Skip("Skipping test: V8 is disabled in this ArangoDB server (v8-version: none). " +
"This test requires V8 enabled.")
}
}
}
}