blob: a1fb59efc7cd9fe891bd016bfb781a417024f629 [file]
#region License
/*
* 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.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Gremlin.Net.Driver;
using Gremlin.Net.Driver.Exceptions;
using Gremlin.Net.Driver.Messages;
using Gremlin.Net.IntegrationTest.Util;
using Microsoft.Extensions.Logging;
using NSubstitute;
using Xunit;
namespace Gremlin.Net.IntegrationTest.Driver
{
public class GremlinClientTests
{
private readonly RequestMessageProvider _requestMessageProvider = new();
private static readonly string TestHost = ConfigProvider.Configuration["TestServerIpAddress"]!;
private static readonly int TestPort = Convert.ToInt32(ConfigProvider.Configuration["TestServerPort"]);
[Theory]
[InlineData("g.inject('justAString')", "justAString")]
[InlineData("g.inject('HelloWorld')", "HelloWorld")]
public async Task ShouldSendScriptForEvaluationAndReturnCorrectResult(string requestMsg, string expectedResponse)
{
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
var response = await gremlinClient.SubmitWithSingleResultAsync<string>(requestMsg);
Assert.Equal(expectedResponse, response);
}
}
[Fact]
public async Task ShouldHandleBigResponse()
{
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
var requestMsg = "g.inject(1,2,3,4,5,6,7,8,9,10)";
var response = await gremlinClient.SubmitAsync<int>(requestMsg);
var results = await response.ToListAsync();
Assert.Equal(10, results.Count);
}
}
[Fact]
public async Task ShouldHandleResponseWithoutContent()
{
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
var gremlinScript = "g.V().has('name','unknownTestName')";
var response =
await gremlinClient.SubmitWithSingleResultAsync<object>(gremlinScript);
Assert.Null(response);
}
}
[Fact]
public async Task ShouldThrowExceptionForInvalidScript()
{
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
var requestMsg = "invalid";
var exception =
await Assert.ThrowsAsync<ResponseException>(async () =>
{
var resultSet = await gremlinClient.SubmitAsync<object>(requestMsg);
await resultSet.ToListAsync();
});
Assert.Equal(typeof(ResponseException), exception.GetType());
Assert.Contains("Failed to interpret Gremlin query", exception.Message);
}
}
[Fact]
public async Task ShouldReassembleResponseBatches()
{
var expectedResult = new List<int> {1, 2, 3, 4, 5};
var requestScript = "g.inject(1,2,3,4,5)";
var requestMessage = RequestMessage.Build(requestScript).Create();
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
var response = await gremlinClient.SubmitAsync<int>(requestMessage);
Assert.Equal(expectedResult, await response.ToListAsync());
}
}
[Fact]
public async Task ShouldReturnEnumerableResult()
{
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
var expectedResult = new List<int> {1, 2, 3, 4, 5};
var requestMsg = "g.inject(1,2,3,4,5)";
var response = await gremlinClient.SubmitAsync<int>(requestMsg);
Assert.Equal(expectedResult, await response.ToListAsync());
}
}
[Fact]
public async Task ShouldThrowOnExecutionOfSimpleInvalidScript()
{
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
var invalidRequestScript = "invalid";
await Assert.ThrowsAsync<ResponseException>(async () =>
{
var resultSet = await gremlinClient.SubmitAsync<object>(invalidRequestScript);
await resultSet.ToListAsync();
});
}
}
[Fact]
public async Task ShouldHandleSimpleScriptWithoutErrors()
{
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
var requestMsg = _requestMessageProvider.GetDummyMessage();
await gremlinClient.SubmitAsync(requestMsg);
}
}
[Fact]
public async Task ShouldUseBindingsForScript()
{
var gremlinServer = new GremlinServer(TestHost, TestPort);
using (var gremlinClient = new GremlinClient(gremlinServer))
{
var requestMsg = "g.inject(3)";
var response =
await gremlinClient.SubmitWithSingleResultAsync<int>(requestMsg);
Assert.Equal(3, response);
}
}
[Fact]
public void ShouldLogWithProvidedLoggerFactory()
{
var loggerFactory = Substitute.For<ILoggerFactory>();
var logger = Substitute.For<ILogger>();
logger.IsEnabled(Arg.Any<LogLevel>()).Returns(true);
loggerFactory.CreateLogger(Arg.Any<string>()).Returns(logger);
var gremlinServer = new GremlinServer(TestHost, TestPort);
using var gremlinClient = new GremlinClient(gremlinServer, loggerFactory: loggerFactory);
logger.VerifyMessageWasLogged(LogLevel.Information, "connections");
}
[Fact]
public void ShouldNotLogForDisabledLogLevel()
{
var loggerFactory = Substitute.For<ILoggerFactory>();
var logger = Substitute.For<ILogger>();
logger.IsEnabled(Arg.Any<LogLevel>()).Returns(false);
loggerFactory.CreateLogger(Arg.Any<string>()).Returns(logger);
var gremlinServer = new GremlinServer(TestHost, TestPort);
using var gremlinClient = new GremlinClient(gremlinServer, loggerFactory: loggerFactory);
logger.VerifyNothingWasLogged();
}
}
}