public async Task ArgsContainBookmarkUsed() { // Arrange var bookmark = Bookmark.From("Bookmark1"); var bookmarks = new List <Bookmark> { bookmark }; const string queryText = "RETURN [] AS data"; var queryParams = new Dictionary <string, object>(); var cypherQuery = new CypherQuery(queryText, queryParams, CypherResultMode.Set, CypherResultFormat.Transactional, "neo4j") { Bookmarks = bookmarks }; using (var testHarness = new BoltTestHarness()) { var recordMock = new Mock <IRecord>(); recordMock.Setup(r => r["data"]).Returns(new List <INode>()); recordMock.Setup(r => r.Keys).Returns(new[] { "data" }); var testStatementResult = new TestStatementResult(new[] { "data" }, recordMock.Object); testHarness.SetupCypherRequestResponse(cypherQuery.QueryText, cypherQuery.QueryParameters, testStatementResult); var graphClient = await testHarness.CreateAndConnectBoltGraphClient(); graphClient.OperationCompleted += (s, e) => { e.BookmarksUsed.Should().Contain(bookmarks[0]); }; await graphClient.ExecuteGetCypherResultsAsync <IEnumerable <ObjectWithIds> >(cypherQuery); } }
public async Task CollectionShouldDeserializeCorrectly() { // simulate a collect() const string queryText = "MATCH (start:Node) RETURN collect(start) AS data"; var queryParams = new Dictionary <string, object>(); var cypherQuery = new CypherQuery(queryText, queryParams, CypherResultMode.Set, CypherResultFormat.Transactional, "neo4j"); using (var testHarness = new BoltTestHarness()) { var nodeMock = new Mock <INode>(); nodeMock .Setup(n => n.Id) .Returns(1); nodeMock .Setup(n => n.Properties) .Returns(new Dictionary <string, object>() { { "Ids", new List <int> { 1, 2, 3 } } }); var recordMock = new Mock <IRecord>(); recordMock .Setup(r => r["data"]) .Returns(new List <INode>() { nodeMock.Object }); recordMock .Setup(r => r.Keys) .Returns(new[] { "data" }); var testStatementResult = new TestStatementResult(new[] { "data" }, recordMock.Object); testHarness.SetupCypherRequestResponse(cypherQuery.QueryText, cypherQuery.QueryParameters, testStatementResult); var graphClient = await testHarness.CreateAndConnectBoltGraphClient(); var results = (await graphClient.ExecuteGetCypherResultsAsync <IEnumerable <ObjectWithIds> >(cypherQuery)).ToArray(); //Assert var deserializedObject = results.First().First(); deserializedObject.Ids.Count.Should().Be(3); deserializedObject.Ids[0].Should().Be(1); deserializedObject.Ids[1].Should().Be(2); deserializedObject.Ids[2].Should().Be(3); } }
public async Task RelationshipShouldDeserializeInDefinedType() { // Arrange const string queryText = "MATCH (n:Test)-[r]->(t:Test) RETURN r AS Rel"; var cypherQuery = new CypherQuery(queryText, new Dictionary <string, object>(), CypherResultMode.Projection, CypherResultFormat.Transactional, "neo4j"); using (var testHarness = new BoltTestHarness()) { var relationshipMock = new Mock <IRelationship>(); relationshipMock .Setup(r => r.StartNodeId) .Returns(1); relationshipMock .Setup(r => r.EndNodeId) .Returns(2); relationshipMock .Setup(r => r.Type) .Returns("Xx"); relationshipMock .Setup(r => r.Id) .Returns(3); relationshipMock .Setup(r => r.Properties) .Returns(new Dictionary <string, object>() { { "Id", 42 } }); var recordMock = new Mock <IRecord>(); recordMock .Setup(r => r["Rel"]) .Returns(relationshipMock.Object); recordMock .Setup(r => r.Keys) .Returns(new[] { "Rel" }); var testStatementResult = new TestStatementResult(new[] { "Rel" }, recordMock.Object); testHarness.SetupCypherRequestResponse(cypherQuery.QueryText, cypherQuery.QueryParameters, testStatementResult); var graphClient = await testHarness.CreateAndConnectBoltGraphClient(); var results = (await graphClient.ExecuteGetCypherResultsAsync <RelationGrouper>(cypherQuery)).ToArray(); //Assert results.Length.Should().Be(1); var relation = results.First().Rel; relation.Id.Should().Be(42); } }
public static void GetDriverAndSession(out IDriver driver, out IAsyncSession session, out IAsyncTransaction transaction) { var mockNode = Substitute.For <INode>(); mockNode["Name"].Returns("Value"); mockNode.Labels.Returns(new List <string> { "Node" }); mockNode.Properties.Returns(new Dictionary <string, object> { { "Name", "Value" } }); var mockRecord = Substitute.For <IRecord>(); mockRecord.Keys.Returns(new List <string> { "Node" }); mockRecord["Node"].Returns(mockNode); mockRecord.Values["Node"].Returns(mockNode); var mockStatementResult = new TestStatementResult(new List <IRecord>(new[] { mockRecord })); var mockTransaction = Substitute.For <IAsyncTransaction>(); mockTransaction.RunAsync(Arg.Any <string>(), Arg.Any <IDictionary <string, object> >()).Returns(mockStatementResult); var task = Task.FromResult(mockTransaction); task.Result.Should().NotBe(null); var mockSession = Substitute.For <IAsyncSession>(); var dbmsReturn = GetDbmsComponentsResponse(); mockSession.RunAsync("CALL dbms.components()").Returns(dbmsReturn); mockSession.BeginTransactionAsync().Returns(Task.FromResult(mockTransaction)); mockSession.BeginTransactionAsync(Arg.Any <Action <TransactionConfigBuilder> >()).Returns(Task.FromResult(mockTransaction)); var mockDriver = Substitute.For <IDriver>(); mockDriver.AsyncSession().Returns(mockSession); mockDriver.AsyncSession(Arg.Any <Action <SessionConfigBuilder> >()).Returns(mockSession); driver = mockDriver; session = mockSession; transaction = mockTransaction; }
public static IResultCursor GetDbmsComponentsResponse() { var record = Substitute.For <IRecord>(); record["name"].Returns("neo4j kernel"); record["versions"].Returns(new List <object> { "3.1.0" }); var response = new List <IRecord> { record }; var statementResult = new TestStatementResult(response); return(statementResult); }
public async Task ReturnsQueryStats_WhenInTransaction() { // BoltClientTestHelper.GetDriverAndSession(out var mockDriver, out _, out _); bool completedRaised = false; QueryStats stats = null; var cypherQuery = new CypherQuery("MATCH (n) RETURN id(n)", new Dictionary <string, object>(), CypherResultMode.Set, CypherResultFormat.Transactional, "neo4j", includeQueryStats: true); var value = new Dictionary <string, object> { { "id(n)", 4 } }; var recordMock = new Mock <IRecord>(); recordMock.Setup(x => x.Values).Returns(value); recordMock.Setup(x => x["id(n)"]).Returns(4); recordMock.Setup(x => x.Keys).Returns(new[] { "id(n)" }); var testStatementResult = new TestStatementResult(new[] { "id(n)" }, recordMock.Object); using (var testHarness = new BoltTestHarness()) { testHarness.SetupCypherRequestResponse(cypherQuery.QueryText, cypherQuery.QueryParameters, testStatementResult); var client = await testHarness.CreateAndConnectBoltGraphClient(); client.OperationCompleted += (o, e) => { stats = e.QueryStats; completedRaised = true; }; using (var tx = ((ITransactionalGraphClient)client).BeginTransaction()) { var results = (await client.ExecuteGetCypherResultsAsync <long>(cypherQuery)).ToArray(); results.First().Should().Be(4); } } completedRaised.Should().BeTrue(); stats.Should().NotBeNull(); }
public async Task RelationshipShouldDeserializeInAnonymousType() { // Arrange const string queryText = @"MATCH (n:Test)-[r]->(t:Test) RETURN r AS Rel"; var cypherQuery = new CypherQuery(queryText, new Dictionary <string, object>(), CypherResultMode.Projection, CypherResultFormat.Transactional, "neo4j"); using (var testHarness = new BoltTestHarness()) { var relationshipMock = new Mock <IRelationship>(); relationshipMock .Setup(r => r.StartNodeId) .Returns(1); relationshipMock .Setup(r => r.EndNodeId) .Returns(2); relationshipMock .Setup(r => r.Type) .Returns("Xx"); relationshipMock .Setup(r => r.Id) .Returns(3); relationshipMock .Setup(r => r.Properties) .Returns(new Dictionary <string, object>() { { "Id", 42 } }); var recordMock = new Mock <IRecord>(); recordMock .Setup(r => r["Rel"]) .Returns(relationshipMock.Object); recordMock .Setup(r => r.Keys) .Returns(new[] { "Rel" }); var testStatementResult = new TestStatementResult(new[] { "Rel" }, recordMock.Object); testHarness.SetupCypherRequestResponse(cypherQuery.QueryText, cypherQuery.QueryParameters, testStatementResult); //Session mock??? var dummy = new { Rel = new RelationType() }; var anonType = dummy.GetType(); var graphClient = await testHarness.CreateAndConnectBoltGraphClient(); var genericGetCypherResults = typeof(IRawGraphClient).GetMethod(nameof(graphClient.ExecuteGetCypherResultsAsync)); var anonymousGetCypherResults = genericGetCypherResults.MakeGenericMethod(anonType); var genericResultsTask = anonymousGetCypherResults.Invoke(graphClient, new object[] { cypherQuery }); await(Task) genericResultsTask; var genericResults = (IEnumerable)((dynamic)genericResultsTask).Result; var results = genericResults.Cast <object>().ToArray(); //Assert Assert.Equal(1, results.Length); var relation = (RelationType)anonType.GetProperty(nameof(dummy.Rel)).GetValue(results.First(), null); relation.Id.Should().Be(42); } }