public void AsyncRequestsInTransactionShouldBeExecutedInOrder() { const string queryTextBase = @"MATCH (n) RETURN {0} as Total"; const string resultColumnBase = @"{{'columns':['Total'], 'data':[{{'row':[{0}]}}]}}"; const int asyncRequests = 15; var queries = new CypherQuery[asyncRequests]; var apiQueries = new CypherStatementList[asyncRequests]; var responses = new MockResponse[asyncRequests]; var testHarness = new RestHarnessWithCounter(); for (int i = 0; i < asyncRequests; i++) { queries[i] = new CypherQuery(string.Format(queryTextBase, i), new Dictionary <string, object>(), CypherResultMode.Projection); apiQueries[i] = new CypherStatementList { new CypherTransactionStatement(queries[i], false) }; responses[i] = MockResponse.Json(200, @"{'results':[" + string.Format(resultColumnBase, i) + @"], 'errors':[] }"); if (i > 0) { testHarness.Add(MockRequest.PostObjectAsJson("/transaction/1", apiQueries[i]), responses[i]); } } testHarness.Add( MockRequest.PostObjectAsJson("/transaction", apiQueries[0]), MockResponse.Json(201, TransactionRestResponseHelper.GenerateInitTransactionResponse(1, string.Format(resultColumnBase, 0)), "http://foo/db/data/transaction/1") ); testHarness.Add( MockRequest.PostJson("/transaction/1/commit", @"{'statements': []}"), MockResponse.Json(200, @"{'results':[], 'errors':[] }") ); try { var client = testHarness.CreateAndConnectTransactionalGraphClient(); var rawClient = (IRawGraphClient)client; var tasks = new Task[asyncRequests]; using (var tran = client.BeginTransaction()) { for (int i = 0; i < asyncRequests; i++) { int tmpResult = i; tasks[i] = rawClient.ExecuteGetCypherResultsAsync <DummyTotal>(queries[i]).ContinueWith(task => { Assert.Equal(tmpResult, task.Result.Single().Total); }); } Task.WaitAll(tasks); tran.Commit(); } } finally { testHarness.Dispose(); } // check that we have a total order Assert.Equal(asyncRequests, testHarness.Queue.Count); int lastElement = -1; for (int i = 0; i < asyncRequests; i++) { int headItem; Assert.True(testHarness.Queue.TryDequeue(out headItem)); headItem.Should().BeGreaterThan(lastElement); lastElement = headItem; } }
public void ExecuteMultipleStatementInOneRequestHttpRequest() { const string headerName = "MyTestHeader"; const string headerValue = "myTestHeaderValue"; var customHeaders = new NameValueCollection(); customHeaders.Add(headerName, headerValue); var initTransactionRequest = MockRequest.PostJson("/transaction", @"{ 'statements': [{'statement': 'MATCH n\r\nRETURN count(n)', 'resultDataContents':[], 'parameters': {}}, {'statement': 'MATCH t\r\nRETURN count(t)', 'resultDataContents':[], 'parameters': {}}]}"); var commitRequest = MockRequest.PostJson("/transaction/1/commit", @"{'statements': []}"); using (var testHarness = new RestTestHarness { { initTransactionRequest, MockResponse.Json(201, TransactionRestResponseHelper.GenerateInitTransactionResponse(1), "http://foo/db/data/transaction/1") }, { commitRequest, MockResponse.Json(200, @"{'results':[], 'errors':[] }") } }) { var response = MockResponse.NeoRoot20(); testHarness.Add(MockRequest.Get(""), response); var httpClient = testHarness.GenerateHttpClient("http://foo/db/data"); testHarness.CreateAndConnectTransactionalGraphClient(); ITransactionalGraphClient client = new GraphClient(new Uri("http://foo/db/data"), httpClient); client.Connect(); using (var transaction = client.BeginTransaction()) { // dummy query to generate request var rawClient = client as IRawGraphClient; if (rawClient == null) { throw new Exception("ITransactionalGraphClient is not IRawGraphClient"); } var queries = new List <CypherQuery>() { client.Cypher .Match("n") .Return(n => n.Count()) .Query, client.Cypher .Match("t") .Return(t => t.Count()) .Query }; httpClient.ClearReceivedCalls(); rawClient.ExecuteMultipleCypherQueriesInTransaction(queries, customHeaders); transaction.Commit(); var calls = httpClient.ReceivedCalls().ToList(); Assert.NotEmpty(calls); HttpRequestMessage requestMessage = null; foreach (var call in calls) { if (call.GetArguments().Single().GetType() == typeof(HttpRequestMessage)) { requestMessage = (HttpRequestMessage)call.GetArguments().Single(); } } Assert.NotNull(requestMessage); var customHeader = requestMessage.Headers.Single(h => h.Key == headerName); Assert.NotNull(customHeader); Assert.Equal(headerValue, customHeader.Value.Single()); } } }
public void ShouldReturnIEnumerableOfObjects() { using (var testHarness = new RestTestHarness { { MockRequest.PostJson( "/ext/GremlinPlugin/graphdb/execute_script", @"{ 'script': 'foo bar query', 'params': { 'foo': 123, 'bar': 'baz' } }" ), MockResponse.Json(HttpStatusCode.OK, @"[ { 'outgoing_relationships' : 'http://foo/db/data/node/5/relationships/out', 'data' : { 'Bar' : 'bar', 'Baz' : 'baz' }, 'traverse' : 'http://foo/db/data/node/5/traverse/{returnType}', 'all_typed_relationships' : 'http://foo/db/data/node/5/relationships/all/{-list|&|types}', 'property' : 'http://foo/db/data/node/5/properties/{key}', 'self' : 'http://foo/db/data/node/5', 'properties' : 'http://foo/db/data/node/5/properties', 'outgoing_typed_relationships' : 'http://foo/db/data/node/5/relationships/out/{-list|&|types}', 'incoming_relationships' : 'http://foo/db/data/node/5/relationships/in', 'extensions' : { }, 'create_relationship' : 'http://foo/db/data/node/5/relationships', 'all_relationships' : 'http://foo/db/data/node/5/relationships/all', 'incoming_typed_relationships' : 'http://foo/db/data/node/5/relationships/in/{-list|&|types}' }, { 'outgoing_relationships' : 'http://foo/db/data/node/6/relationships/out', 'data' : { 'Bar' : '123', 'Baz' : '456' }, 'traverse' : 'http://foo/db/data/node/6/traverse/{returnType}', 'all_typed_relationships' : 'http://foo/db/data/node/6/relationships/all/{-list|&|types}', 'property' : 'http://foo/db/data/node/6/properties/{key}', 'self' : 'http://foo/db/data/node/6', 'properties' : 'http://foo/db/data/node/6/properties', 'outgoing_typed_relationships' : 'http://foo/db/data/node/6/relationships/out/{-list|&|types}', 'incoming_relationships' : 'http://foo/db/data/node/6/relationships/in', 'extensions' : { }, 'create_relationship' : 'http://foo/db/data/node/6/relationships', 'all_relationships' : 'http://foo/db/data/node/6/relationships/all', 'incoming_typed_relationships' : 'http://foo/db/data/node/6/relationships/in/{-list|&|types}' } ]" ) } }) { var graphClient = (GraphClient)testHarness.CreateAndConnectGraphClient(); //Act var parameters = new Dictionary <string, object> { { "foo", 123 }, { "bar", "baz" } }; var nodes = graphClient .ExecuteGetAllNodesGremlin <Foo>("foo bar query", parameters) .ToList(); //Assert Assert.AreEqual(2, nodes.Count()); Assert.AreEqual(5, nodes.ElementAt(0).Reference.Id); Assert.AreEqual("bar", nodes.ElementAt(0).Data.Bar); Assert.AreEqual("baz", nodes.ElementAt(0).Data.Baz); Assert.AreEqual(6, nodes.ElementAt(1).Reference.Id); Assert.AreEqual("123", nodes.ElementAt(1).Data.Bar); Assert.AreEqual("456", nodes.ElementAt(1).Data.Baz); } }