This is an automated email from the ASF dual-hosted git repository.

kenhuuu pushed a commit to branch empty-params
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit e82ddcc093d14fb2edd7004c200f97628040229b
Author: Ken Hu <[email protected]>
AuthorDate: Wed Jul 15 20:00:32 2026 -0700

    Stop sending traversal source as GremlinLang parameter
    
    Remote traversals should select the traversal source with the top-level HTTP
    request `g` field. The `parameters` field is only for query values 
referenced by
    the Gremlin string, so adding `g` there was unused by Gremlin Server.
    
    Assisted-by: Codex:gpt-5.5
---
 CHANGELOG.asciidoc                                 |  1 +
 docs/src/upgrade/release-4.x.x.asciidoc            | 27 +++++++
 .../gremlin/process/traversal/GremlinLang.java     |  7 --
 .../Driver/Remote/DriverRemoteConnection.cs        |  2 -
 .../Driver/Remote/TransactionRemoteConnection.cs   |  2 -
 .../Gremlin.Net/Process/Traversal/GremlinLang.cs   |  9 ---
 .../Driver/DriverRemoteConnectionTests.cs          | 20 +++++
 .../driver/remote/DriverRemoteConnection.java      |  1 -
 .../driver/remote/DriverRemoteConnectionTest.java  | 59 +++++++++++++-
 gremlin-go/driver/gremlinlang.go                   |  4 -
 .../lib/driver/driver-remote-connection.ts         |  2 -
 .../gremlin-javascript/lib/process/gremlin-lang.ts |  6 +-
 .../test/unit/driver-remote-connection-test.js     | 57 +++++++++++++
 .../driver/driver_remote_connection.py             |  2 -
 .../python/gremlin_python/driver/transaction.py    |  2 -
 .../python/gremlin_python/process/traversal.py     |  3 -
 .../tests/unit/driver/test_client_options.py       | 93 ++++++++++++++++++++++
 17 files changed, 257 insertions(+), 40 deletions(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index c0f496c0e5..0076cc3168 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -41,6 +41,7 @@ 
image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 ** JavaScript: adopted `undici` for the default dispatcher; renamed 
`reader`->`responseSerializer`; added `readTimeoutMillis`, 
`keepAliveTimeMillis`, `maxResponseHeaderBytes`, `proxy`, `compression`, 
`batchSize`, `bulkResults`, `logger`; removed `headers` (use interceptors) and 
`ca`/`cert`/`pfx`/`rejectUnauthorized`/`agent` (TLS via the Node/undici 
runtime); undici is swapped out in browser bundles. *(breaking)*
 ** All drivers: compression now defaults on; `connectTimeout` lowered to 5s 
and applied to transport establishment; `readTimeout` is a streaming-safe 
idle-read timeout (off by default); `idleTimeout` reaps only pooled connections.
 * Changed all GLV drivers to always serialize requests as JSON 
(`application/json`). Request serialization is no longer configurable and the 
serializer options (now `responseSerializer`) control only response 
deserialization.
+* Fixed remote traversals in Java, Python, .NET, and JavaScript to avoid 
sending the traversal source alias as a GremlinLang parameter, and removed the 
unused GremlinLang traversal-source helpers.
 * Fixed `gremlin-javascript` `Client.submit()` so that an explicit 
`bulkResults: false` request option is forwarded to the server instead of being 
silently dropped.
 * Fixed `gremlin-dotnet` deflate response decompression, which threw on the 
server's zlib-framed output because it used `DeflateStream` (raw DEFLATE, RFC 
1951) instead of `ZLibStream` (zlib, RFC 1950); the bug was previously masked 
because compression was off by default.
 * Fixed `gremlin-dotnet` SSL options cloning (used on the 
skip-certificate-validation path) to copy `ClientCertificateContext` and 
`AllowTlsResume`, which were previously dropped, breaking mTLS client 
certificates and silently re-enabling TLS resumption.
diff --git a/docs/src/upgrade/release-4.x.x.asciidoc 
b/docs/src/upgrade/release-4.x.x.asciidoc
index 60be32de2e..8343ebad32 100644
--- a/docs/src/upgrade/release-4.x.x.asciidoc
+++ b/docs/src/upgrade/release-4.x.x.asciidoc
@@ -65,6 +65,33 @@ 
RequestMessage.build("g.V(x)").addParameters(params).create();
 
 See: link:https://issues.apache.org/jira/browse/TINKERPOP-3262[TINKERPOP-3262]
 
+==== Traversal Source Not In Parameters
+
+The traversal source alias for an HTTP request is selected with the top-level 
`g` request field. Query `parameters`
+are only the named values referenced by the Gremlin string. Earlier 3.8.x 
driver builds could place the traversal
+source alias into `bindings` as `g` (reminder: `bindings` have been renamed to 
`parameters`). Gremlin Server will ignore
+this "g" value in "parameters" so use the `g` field instead.
+
+Applications that construct HTTP requests directly should keep the traversal 
source alias out of `parameters` and set
+the top-level `g` field instead:
+
+[source,text]
+----
+// old
+{
+  "gremlin": "g.V(x)",
+  "parameters": "[\"g\":\"gmodern\",\"x\":1]"
+}
+
+// new
+{
+  "gremlin": "g.V(x)",
+  "g": "gmodern",
+  "parameters": "[\"x\":1]"
+}
+----
+
+
 ==== Standardizing GLV Connection Options
 
 TinkerPop 4.x standardizes connection option names and defaults across all 
five Gremlin Language Variants (Java, Python,
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLang.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLang.java
index af64ee02b9..5bbe49e5ae 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLang.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLang.java
@@ -495,13 +495,6 @@ public class GremlinLang implements Cloneable, 
Serializable {
         return sb.toString();
     }
 
-    /**
-     * The alias to set.
-     */
-    public void addG(final String g) {
-        parameters.put("g", g);
-    }
-
     /**
      * Add a {@link TraversalSource} instruction to the GremlinLang.
      *
diff --git 
a/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs 
b/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs
index c473260b5c..3f3ef7462b 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/DriverRemoteConnection.cs
@@ -118,8 +118,6 @@ namespace Gremlin.Net.Driver.Remote
             CancellationToken cancellationToken = default)
         {
             _logger.SubmittingGremlinLang(gremlinLang);
-            gremlinLang.AddG(_traversalSource);
-
             var requestMsg = RequestMessage.Build(gremlinLang.GetGremlin())
                 .AddG(_traversalSource);
 
diff --git 
a/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/TransactionRemoteConnection.cs 
b/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/TransactionRemoteConnection.cs
index 404f4ffe00..ac60914b5a 100644
--- 
a/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/TransactionRemoteConnection.cs
+++ 
b/gremlin-dotnet/src/Gremlin.Net/Driver/Remote/TransactionRemoteConnection.cs
@@ -60,8 +60,6 @@ namespace Gremlin.Net.Driver.Remote
                 throw new InvalidOperationException("Transaction is not open");
             }
 
-            gremlinLang.AddG(_traversalSource);
-
             var requestMsg = RequestMessage.Build(gremlinLang.GetGremlin())
                 .AddG(_traversalSource);
 
diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs 
b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs
index 629ac9fd89..661004fd46 100644
--- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs
+++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs
@@ -91,15 +91,6 @@ namespace Gremlin.Net.Process.Traversal
             AddToGremlin(stepName, arguments);
         }
 
-        /// <summary>
-        ///     Sets the alias for the traversal source.
-        /// </summary>
-        /// <param name="g">The alias to set.</param>
-        public void AddG(string g)
-        {
-            _parameters["g"] = g;
-        }
-
         /// <summary>
         ///     Appends raw text to the gremlin string. Used for temporary 
options rendering.
         /// </summary>
diff --git 
a/gremlin-dotnet/test/Gremlin.Net.UnitTest/Driver/DriverRemoteConnectionTests.cs
 
b/gremlin-dotnet/test/Gremlin.Net.UnitTest/Driver/DriverRemoteConnectionTests.cs
index 02e78f8353..e4c1b1fb05 100644
--- 
a/gremlin-dotnet/test/Gremlin.Net.UnitTest/Driver/DriverRemoteConnectionTests.cs
+++ 
b/gremlin-dotnet/test/Gremlin.Net.UnitTest/Driver/DriverRemoteConnectionTests.cs
@@ -118,6 +118,26 @@ namespace Gremlin.Net.UnitTest.Driver
             Assert.NotNull(capturedRequest);
             var parametersString = 
(string)capturedRequest!.Fields[Tokens.ArgsParameters];
             Assert.Contains("\"x\":42", parametersString);
+            Assert.DoesNotContain("\"g\":", parametersString);
+        }
+
+        [Fact]
+        public async Task ShouldNotBuildRequestWithTraversalSourceAsParameter()
+        {
+            RequestMessage? capturedRequest = null;
+            var client = CreateCapturingClient(msg => capturedRequest = msg);
+            var connection = new DriverRemoteConnection(client, "mySource");
+
+            var gl = new GremlinLang();
+            gl.AddStep("V", Array.Empty<object>());
+
+            await connection.SubmitAsync<object, object>(gl);
+
+            Assert.NotNull(capturedRequest);
+            var parametersString = 
capturedRequest!.Fields.TryGetValue(Tokens.ArgsParameters, out var parameters)
+                ? (string) parameters
+                : "";
+            Assert.DoesNotContain("\"g\":", parametersString);
         }
 
         [Fact]
diff --git 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
index 67715efba7..809162c792 100644
--- 
a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
+++ 
b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java
@@ -240,7 +240,6 @@ public class DriverRemoteConnection implements 
RemoteConnection {
         }
 
         try {
-            gremlinLang.addG(remoteTraversalSourceName);
             return client.submitAsync(gremlinLang.getGremlin(), 
getRequestOptions(gremlinLang))
                     .thenApply(rs -> new DriverRemoteTraversal<>(rs, client, 
attachElements, conf));
         } catch (Exception ex) {
diff --git 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnectionTest.java
 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnectionTest.java
index a69eaf348a..2d9e0a8d18 100644
--- 
a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnectionTest.java
+++ 
b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnectionTest.java
@@ -18,14 +18,30 @@
  */
 package org.apache.tinkerpop.gremlin.driver.remote;
 
+import org.apache.tinkerpop.gremlin.driver.Client;
 import org.apache.tinkerpop.gremlin.driver.RequestOptions;
-import org.apache.tinkerpop.gremlin.util.Tokens;
+import org.apache.tinkerpop.gremlin.driver.ResultSet;
+import org.apache.tinkerpop.gremlin.process.traversal.GremlinLang;
 import 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+import org.apache.tinkerpop.gremlin.util.Tokens;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import java.util.Collections;
+import java.util.concurrent.CompletableFuture;
 
 import static 
org.apache.tinkerpop.gremlin.driver.RequestOptions.getRequestOptions;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
@@ -55,4 +71,45 @@ public class DriverRemoteConnectionTest {
         assertEquals(Integer.valueOf(100), options.getBatchSize().get());
         assertEquals(Long.valueOf(1000), options.getTimeoutMillis().get());
     }
+
+    @Test
+    public void shouldSubmitTraversalWithoutTraversalSourceAsParameter() 
throws Exception {
+        final Client client = mockClient();
+        final DriverRemoteConnection connection = 
DriverRemoteConnection.using(client, "mySource");
+
+        connection.submitAsync(g.V().asAdmin().getGremlinLang()).get();
+
+        final RequestOptions options = captureRequestOptions(client, "g.V()");
+        assertFalse(options.getParameters().orElse("").contains("\"g\":"));
+    }
+
+    @Test
+    public void shouldSubmitTraversalWithOnlyExplicitParameters() throws 
Exception {
+        final Client client = mockClient();
+        final DriverRemoteConnection connection = 
DriverRemoteConnection.using(client, "mySource");
+        final GremlinLang gremlinLang = g.V(GValue.of("x", 
42)).asAdmin().getGremlinLang();
+
+        connection.submitAsync(gremlinLang).get();
+
+        final RequestOptions options = captureRequestOptions(client, "g.V(x)");
+        assertTrue(options.getParameters().isPresent());
+        assertTrue(options.getParameters().get().contains("\"x\":42"));
+        assertFalse(options.getParameters().get().contains("\"g\":"));
+    }
+
+    private static Client mockClient() {
+        final Client client = mock(Client.class);
+        final ResultSet resultSet = mock(ResultSet.class);
+        when(resultSet.iterator()).thenReturn(Collections.emptyIterator());
+        when(client.alias("mySource")).thenReturn(client);
+        when(client.submitAsync(anyString(), any(RequestOptions.class)))
+                .thenReturn(CompletableFuture.completedFuture(resultSet));
+        return client;
+    }
+
+    private static RequestOptions captureRequestOptions(final Client client, 
final String gremlin) {
+        final ArgumentCaptor<RequestOptions> optionsCaptor = 
ArgumentCaptor.forClass(RequestOptions.class);
+        verify(client).submitAsync(eq(gremlin), optionsCaptor.capture());
+        return optionsCaptor.getValue();
+    }
 }
diff --git a/gremlin-go/driver/gremlinlang.go b/gremlin-go/driver/gremlinlang.go
index e0533dcaf7..7e90cb341e 100644
--- a/gremlin-go/driver/gremlinlang.go
+++ b/gremlin-go/driver/gremlinlang.go
@@ -554,10 +554,6 @@ func ConvertParametersToString(params 
map[string]interface{}) string {
        return sb.String()
 }
 
-func (gl *GremlinLang) AddG(g string) {
-       gl.parameters["g"] = g
-}
-
 func (gl *GremlinLang) AddSource(name string, arguments ...interface{}) {
        if (name == "withStrategies" || name == "withoutStrategies") && 
len(arguments) != 0 {
                args := gl.buildStrategyArgs(arguments...)
diff --git 
a/gremlin-js/gremlin-javascript/lib/driver/driver-remote-connection.ts 
b/gremlin-js/gremlin-javascript/lib/driver/driver-remote-connection.ts
index 570adc9576..d61fde3fd4 100644
--- a/gremlin-js/gremlin-javascript/lib/driver/driver-remote-connection.ts
+++ b/gremlin-js/gremlin-javascript/lib/driver/driver-remote-connection.ts
@@ -76,8 +76,6 @@ export default class DriverRemoteConnection extends 
RemoteConnection {
   }
 
   #buildRequestArgs(gremlinLang: GremlinLang) {
-    gremlinLang.addG(this.options.traversalSource || 'g');
-
     let requestOptions: RequestOptions | undefined = undefined;
     const strategies = gremlinLang.getOptionsStrategies();
     if (strategies.length > 0) {
diff --git a/gremlin-js/gremlin-javascript/lib/process/gremlin-lang.ts 
b/gremlin-js/gremlin-javascript/lib/process/gremlin-lang.ts
index f718e9621e..47cd08a28a 100644
--- a/gremlin-js/gremlin-javascript/lib/process/gremlin-lang.ts
+++ b/gremlin-js/gremlin-javascript/lib/process/gremlin-lang.ts
@@ -51,10 +51,6 @@ export default class GremlinLang {
     this.gremlin += text;
   }
 
-  addG(g: string): void {
-    this.parameters.set('g', g);
-  }
-
   getParameters(): Map<string, any> {
     return this.parameters;
   }
@@ -304,4 +300,4 @@ export default class GremlinLang {
     });
     return '[' + parts.join(',') + ']';
   }
-}
\ No newline at end of file
+}
diff --git 
a/gremlin-js/gremlin-javascript/test/unit/driver-remote-connection-test.js 
b/gremlin-js/gremlin-javascript/test/unit/driver-remote-connection-test.js
new file mode 100644
index 0000000000..c4d5bbd13a
--- /dev/null
+++ b/gremlin-js/gremlin-javascript/test/unit/driver-remote-connection-test.js
@@ -0,0 +1,57 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+import assert from 'assert';
+import DriverRemoteConnection from 
'../../lib/driver/driver-remote-connection.js';
+import GremlinLang from '../../lib/process/gremlin-lang.js';
+
+describe('DriverRemoteConnection', function () {
+  function createConnection(capture) {
+    const connection = new 
DriverRemoteConnection('http://localhost:8182/gremlin',
+      { traversalSource: 'mySource', connectOnStartup: false });
+    connection._client = {
+      stream(gremlin, parameters, requestOptions) {
+        capture({ gremlin, parameters, requestOptions });
+        return (async function* () {})();
+      },
+    };
+    return connection;
+  }
+
+  it('does not send traversal source as a parameter', async function () {
+    let captured;
+    const connection = createConnection(args => captured = args);
+    const gremlinLang = new GremlinLang().addStep('V');
+
+    await connection.submit(gremlinLang);
+
+    assert.ok(!captured.requestOptions.parameters || 
!captured.requestOptions.parameters.includes("'g':"));
+  });
+
+  it('sends explicit GremlinLang parameters without adding traversal source', 
async function () {
+    let captured;
+    const connection = createConnection(args => captured = args);
+    const gremlinLang = new GremlinLang().addStep('V');
+    gremlinLang.getParameters().set('x', 42);
+
+    await connection.submit(gremlinLang);
+
+    assert.strictEqual(captured.requestOptions.parameters, "['x':42]");
+  });
+});
diff --git 
a/gremlin-python/src/main/python/gremlin_python/driver/driver_remote_connection.py
 
b/gremlin-python/src/main/python/gremlin_python/driver/driver_remote_connection.py
index e911720a3a..be0d92ed5b 100644
--- 
a/gremlin-python/src/main/python/gremlin_python/driver/driver_remote_connection.py
+++ 
b/gremlin-python/src/main/python/gremlin_python/driver/driver_remote_connection.py
@@ -70,7 +70,6 @@ class DriverRemoteConnection(RemoteConnection):
 
     def submit(self, gremlin_lang):
         log.debug("submit with gremlin lang script '%s'", 
gremlin_lang.get_gremlin())
-        gremlin_lang.add_g(self._traversal_source)
         result_set = self._client.submit(gremlin_lang.get_gremlin(),
                                          
request_options=self.extract_request_options(gremlin_lang))
         return RemoteTraversal(result_set)
@@ -85,7 +84,6 @@ class DriverRemoteConnection(RemoteConnection):
     def submit_async(self, gremlin_lang):
         log.debug("submit_async with gremlin lang script '%s'", 
gremlin_lang.get_gremlin())
         future = Future()
-        gremlin_lang.add_g(self._traversal_source)
         future_result_set = 
self._client.submit_async(gremlin_lang.get_gremlin(),
                                                       
request_options=self.extract_request_options(gremlin_lang))
 
diff --git 
a/gremlin-python/src/main/python/gremlin_python/driver/transaction.py 
b/gremlin-python/src/main/python/gremlin_python/driver/transaction.py
index d83ded122b..884b0db49a 100644
--- a/gremlin-python/src/main/python/gremlin_python/driver/transaction.py
+++ b/gremlin-python/src/main/python/gremlin_python/driver/transaction.py
@@ -166,8 +166,6 @@ class TransactionRemoteConnection(RemoteConnection):
         if not self._transaction.is_open:
             raise Exception("Transaction is not open")
 
-        gremlin_lang.add_g(self._traversal_source)
-
         from gremlin_python.driver.driver_remote_connection import 
DriverRemoteConnection
         request_options = 
DriverRemoteConnection.extract_request_options(gremlin_lang)
         request_options['transactionId'] = self._transaction.transaction_id
diff --git a/gremlin-python/src/main/python/gremlin_python/process/traversal.py 
b/gremlin-python/src/main/python/gremlin_python/process/traversal.py
index d8088e5779..5adc335d33 100644
--- a/gremlin-python/src/main/python/gremlin_python/process/traversal.py
+++ b/gremlin-python/src/main/python/gremlin_python/process/traversal.py
@@ -1090,9 +1090,6 @@ class GremlinLang(object):
             
parts.append(f'{helper._arg_as_string(k)}:{helper._arg_as_string(v)}')
         return '[' + ','.join(parts) + ']'
 
-    def add_g(self, g):
-        self.parameters['g'] = g
-
     def add_source(self, source_name, *args):
 
         if source_name == 'withStrategies' and len(args) != 0:
diff --git 
a/gremlin-python/src/main/python/tests/unit/driver/test_client_options.py 
b/gremlin-python/src/main/python/tests/unit/driver/test_client_options.py
index 8434fab4cc..a11473c9cf 100644
--- a/gremlin-python/src/main/python/tests/unit/driver/test_client_options.py
+++ b/gremlin-python/src/main/python/tests/unit/driver/test_client_options.py
@@ -21,6 +21,7 @@
 DriverRemoteConnection, and the SigV4 credentials-provider variant."""
 
 import warnings
+from concurrent.futures import Future
 from unittest.mock import MagicMock, patch
 
 import pytest
@@ -28,6 +29,7 @@ import pytest
 from gremlin_python.driver.client import Client
 from gremlin_python.driver.connection import Connection
 from gremlin_python.driver.request import RequestMessage
+from gremlin_python.process.traversal import GremlinLang, GValue
 
 
 # Patch Connection so Client._fill_pool does not attempt any real connections.
@@ -197,6 +199,97 @@ class TestDriverRemoteConnectionOptions:
         # self + gremlin_lang only
         assert params == ['self', 'gremlin_lang']
 
+    def test_submit_does_not_send_traversal_source_as_parameter(self):
+        from gremlin_python.driver.driver_remote_connection import 
DriverRemoteConnection
+        with 
patch('gremlin_python.driver.driver_remote_connection.client.Client') as 
MockClient:
+            instance = MockClient.return_value
+            instance._url = 'http://localhost:8182/gremlin'
+            instance._traversal_source = 'mySource'
+            instance.submit.return_value = []
+            connection = 
DriverRemoteConnection('http://localhost:8182/gremlin', 'mySource')
+            gremlin_lang = GremlinLang()
+            gremlin_lang.add_step('V')
+
+            connection.submit(gremlin_lang)
+
+        request_options = instance.submit.call_args.kwargs['request_options']
+        assert "'g':" not in request_options.get('parameters', '')
+
+    def test_submit_sends_only_explicit_parameters(self):
+        from gremlin_python.driver.driver_remote_connection import 
DriverRemoteConnection
+        with 
patch('gremlin_python.driver.driver_remote_connection.client.Client') as 
MockClient:
+            instance = MockClient.return_value
+            instance._url = 'http://localhost:8182/gremlin'
+            instance._traversal_source = 'mySource'
+            instance.submit.return_value = []
+            connection = 
DriverRemoteConnection('http://localhost:8182/gremlin', 'mySource')
+            gremlin_lang = GremlinLang()
+            gremlin_lang.add_step('V', GValue('x', 42))
+
+            connection.submit(gremlin_lang)
+
+        request_options = instance.submit.call_args.kwargs['request_options']
+        assert request_options['parameters'] == "['x':42]"
+        assert "'g':" not in request_options['parameters']
+
+    def test_submit_async_does_not_send_traversal_source_as_parameter(self):
+        from gremlin_python.driver.driver_remote_connection import 
DriverRemoteConnection
+        with 
patch('gremlin_python.driver.driver_remote_connection.client.Client') as 
MockClient:
+            instance = MockClient.return_value
+            instance._url = 'http://localhost:8182/gremlin'
+            instance._traversal_source = 'mySource'
+            result = Future()
+            result.set_result([])
+            instance.submit_async.return_value = result
+            connection = 
DriverRemoteConnection('http://localhost:8182/gremlin', 'mySource')
+            gremlin_lang = GremlinLang()
+            gremlin_lang.add_step('V')
+
+            connection.submit_async(gremlin_lang).result()
+
+        request_options = 
instance.submit_async.call_args.kwargs['request_options']
+        assert "'g':" not in request_options.get('parameters', '')
+
+    def 
test_transaction_submit_does_not_send_traversal_source_as_parameter(self):
+        from gremlin_python.driver.transaction import 
TransactionRemoteConnection
+        client = MagicMock()
+        client._url = 'http://localhost:8182/gremlin'
+        client._traversal_source = 'mySource'
+        client.submit.return_value = []
+        transaction = MagicMock()
+        transaction._client = client
+        transaction.is_open = True
+        transaction.transaction_id = 'tx-1'
+        connection = TransactionRemoteConnection(transaction)
+        gremlin_lang = GremlinLang()
+        gremlin_lang.add_step('V')
+
+        connection.submit(gremlin_lang)
+
+        request_options = client.submit.call_args.kwargs['request_options']
+        assert "'g':" not in request_options.get('parameters', '')
+
+    def test_transaction_submit_sends_only_explicit_parameters(self):
+        from gremlin_python.driver.transaction import 
TransactionRemoteConnection
+        client = MagicMock()
+        client._url = 'http://localhost:8182/gremlin'
+        client._traversal_source = 'mySource'
+        client.submit.return_value = []
+        transaction = MagicMock()
+        transaction._client = client
+        transaction.is_open = True
+        transaction.transaction_id = 'tx-1'
+        connection = TransactionRemoteConnection(transaction)
+        gremlin_lang = GremlinLang()
+        gremlin_lang.add_step('V', GValue('x', 42))
+
+        connection.submit(gremlin_lang)
+
+        request_options = client.submit.call_args.kwargs['request_options']
+        assert request_options['transactionId'] == 'tx-1'
+        assert request_options['parameters'] == "['x':42]"
+        assert "'g':" not in request_options['parameters']
+
 
 
 class TestSigV4CredentialsProvider:

Reply via email to