Skip to content
This repository was archived by the owner on Aug 26, 2022. It is now read-only.

Commit 7f45ba5

Browse files
committed
Implement Deletes and Updates
1 parent c5eb5eb commit 7f45ba5

File tree

69 files changed

+995
-639
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+995
-639
lines changed

CypherNet.UnitTests/CypherQueryTests.cs

+103-29
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
1-
using System;
2-
using System.Linq.Expressions;
3-
4-
namespace CypherNet.UnitTests
1+
namespace CypherNet.UnitTests
52
{
63
#region
74

5+
using System;
86
using System.Linq;
9-
using CypherNet.Queries;
7+
using System.Linq.Expressions;
108
using Dynamic4Neo.Tests;
119
using Microsoft.VisualStudio.TestTools.UnitTesting;
1210
using Moq;
11+
using Queries;
1312
using Transaction;
1413

1514
#endregion
1615

1716
[TestClass]
1817
public class CypherQueryTests
1918
{
20-
2119
[TestMethod]
2220
public void BuildCypherQuery_WithStartAndMatch_ExecutesCorrectQuery()
2321
{
@@ -29,10 +27,66 @@ public void BuildCypherQuery_WithStartAndMatch_ExecutesCorrectQuery()
2927
var results = query
3028
.Start(v => Start.At(v.movie, 1))
3129
.Match(v => Pattern.Start(v.movie).Incoming("STARED_IN", 1, 5).From(v.actor))
32-
.Return(v => new { v.actor, v.movie })
30+
31+
.Return(v => new {v.actor, v.movie})
3332
.Fetch();
3433

35-
VerifyCypher(cypher, results.FirstOrDefault(), "START movie=node(1) MATCH (movie)<-[:STARED_IN*1..5]-(actor) RETURN actor as actor, id(actor) as actor__Id, labels(actor) as actor__Labels, movie as movie, id(movie) as movie__Id, labels(movie) as movie__Labels");
34+
VerifyCypher(cypher, results.FirstOrDefault(),
35+
"START movie=node(1) MATCH (movie)<-[:STARED_IN*1..5]-(actor) RETURN actor as actor, id(actor) as actor__Id, labels(actor) as actor__Labels, movie as movie, id(movie) as movie__Id, labels(movie) as movie__Labels");
36+
}
37+
38+
[TestMethod]
39+
public void BuildCypherQuery_WithSimpleReturn_ExecutesCorrectQuery()
40+
{
41+
var cypher = new Mock<ICypherClient>();
42+
cypher.Setup(c => c.ExecuteQuery<TestCypherClause>(It.IsAny<string>())).Returns(() => null);
43+
var factory = new Mock<ICypherClientFactory>();
44+
factory.Setup(f => f.Create()).Returns(cypher.Object);
45+
var query = new FluentCypherQueryBuilder<TestCypherClause>(factory.Object);
46+
var results = query
47+
.Start(v => Start.At(v.movie, 1))
48+
.Return(v => v.movie)
49+
.Fetch();
50+
51+
VerifyCypher(cypher, results.FirstOrDefault(),
52+
"START movie=node(1) RETURN movie as movie, id(movie) as movie__Id, labels(movie) as movie__Labels");
53+
}
54+
55+
[TestMethod]
56+
public void BuildCypherQuery_WithSimpleDelete_ExecutesCorrectQuery()
57+
{
58+
var cypher = new Mock<ICypherClient>();
59+
cypher.Setup(c => c.ExecuteQuery<TestCypherClause>(It.IsAny<string>())).Returns(() => null);
60+
var factory = new Mock<ICypherClientFactory>();
61+
factory.Setup(f => f.Create()).Returns(cypher.Object);
62+
var query = new FluentCypherQueryBuilder<TestCypherClause>(factory.Object);
63+
query
64+
.Start(v => Start.At(v.movie, 1))
65+
.Match(v => Pattern.Start(v.movie).Incoming("STARED_IN", 1, 5).From(v.actor))
66+
67+
.Delete(v => v.actor)
68+
.Execute();
69+
70+
VerifyCypher(cypher,
71+
"START movie=node(1) MATCH (movie)<-[:STARED_IN*1..5]-(actor) DELETE actor");
72+
}
73+
74+
[TestMethod]
75+
public void BuildCypherQuery_WithComplexDelete_ExecutesCorrectQuery()
76+
{
77+
var cypher = new Mock<ICypherClient>();
78+
cypher.Setup(c => c.ExecuteQuery<TestCypherClause>(It.IsAny<string>())).Returns(() => null);
79+
var factory = new Mock<ICypherClientFactory>();
80+
factory.Setup(f => f.Create()).Returns(cypher.Object);
81+
var query = new FluentCypherQueryBuilder<TestCypherClause>(factory.Object);
82+
query
83+
.Start(v => Start.At(v.movie, 1))
84+
.Match(v => Pattern.Start(v.movie).Incoming("STARED_IN", 1, 5).From(v.actor))
85+
.Delete(v => new { v.actor, v.movie })
86+
.Execute();
87+
88+
VerifyCypher(cypher,
89+
"START movie=node(1) MATCH (movie)<-[:STARED_IN*1..5]-(actor) DELETE actor, movie");
3690
}
3791

3892
[TestMethod]
@@ -46,10 +100,12 @@ public void BuildCypherQuery_UsingSetMethod_ExecutesCorrectQuery()
46100
var results = query
47101
.Match(v => Pattern.Start(v.movie, "arthouse"))
48102
.Update(v => v.movie.Set("requiresSubtitles", "yes"))
49-
.Return(v => new { v.actor, v.movie })
103+
104+
.Return(v => new {v.actor, v.movie})
50105
.Fetch();
51106

52-
VerifyCypher(cypher, results.FirstOrDefault(), @"MATCH (movie:arthouse) SET movie.requiresSubtitles = ""yes"" RETURN actor as actor, id(actor) as actor__Id, labels(actor) as actor__Labels, movie as movie, id(movie) as movie__Id, labels(movie) as movie__Labels");
107+
VerifyCypher(cypher, results.FirstOrDefault(),
108+
@"MATCH (movie:arthouse) SET movie.requiresSubtitles = ""yes"" RETURN actor as actor, id(actor) as actor__Id, labels(actor) as actor__Labels, movie as movie, id(movie) as movie__Id, labels(movie) as movie__Labels");
53109
}
54110

55111
[TestMethod]
@@ -63,10 +119,11 @@ public void BuildCypherQuery_CreateRelationship_ExecutesCorrectQuery()
63119
var results = query
64120
.Start(v => Start.At(v.actor, 1).At(v.movie, 2))
65121
.Create(v => Create.Relationship(v.actor, v.actedIn, "ACTED_IN", v.movie))
66-
.Return(v => new { v.actedIn })
122+
.Return(v => new {v.actedIn})
67123
.Fetch();
68-
69-
VerifyCypher(cypher, results.FirstOrDefault(), "START actor=node(1), movie=node(2) CREATE (actor)-[actedIn:ACTED_IN]->(movie) RETURN actedIn as actedIn, id(actedIn) as actedIn__Id, type(actedIn) as actedIn__Type");
124+
125+
VerifyCypher(cypher, results.FirstOrDefault(),
126+
"START actor=node(1), movie=node(2) CREATE (actor)-[actedIn:ACTED_IN]->(movie) RETURN actedIn as actedIn, id(actedIn) as actedIn__Id, type(actedIn) as actedIn__Type");
70127
}
71128

72129
[TestMethod]
@@ -79,11 +136,12 @@ public void BuildCypherQuery_CreateRelationshipWithProperties_ExecutesCorrectQue
79136
var query = new FluentCypherQueryBuilder<TestCypherClause>(factory.Object);
80137
var results = query
81138
.Start(v => Start.At(v.actor, 1).At(v.movie, 2))
82-
.Create(v => Create.Relationship(v.actor, v.actedIn, "ACTED_IN", new { name = "mark" }, v.movie))
83-
.Return(v => new { v.actedIn })
139+
.Create(v => Create.Relationship(v.actor, v.actedIn, "ACTED_IN", new {name = "mark"}, v.movie))
140+
.Return(v => new {v.actedIn})
84141
.Fetch();
85142

86-
VerifyCypher(cypher, results.FirstOrDefault(), @"START actor=node(1), movie=node(2) CREATE (actor)-[actedIn:ACTED_IN {""name"": ""mark""}]->(movie) RETURN actedIn as actedIn, id(actedIn) as actedIn__Id, type(actedIn) as actedIn__Type");
143+
VerifyCypher(cypher, results.FirstOrDefault(),
144+
@"START actor=node(1), movie=node(2) CREATE (actor)-[actedIn:ACTED_IN {""name"": ""mark""}]->(movie) RETURN actedIn as actedIn, id(actedIn) as actedIn__Id, type(actedIn) as actedIn__Type");
87145
}
88146

89147
[TestMethod]
@@ -99,10 +157,11 @@ public void BuildCypherQuery_WithStartMatchWhere_ExecutesCorrectQuery()
99157
.Start(v => Start.Any(v.movie))
100158
.Match(v => Pattern.Start(v.movie).Incoming("STARED_IN").From(v.actor))
101159
.Where(v => v.actor.Get<string>("name") == "Bob Dinero" || v.actor.Get<string>("role") == "Keyser Söze")
102-
.Return(v => new { v.actor, v.movie })
160+
.Return(v => new {v.actor, v.movie})
103161
.Fetch();
104162

105-
VerifyCypher(cypher, results.FirstOrDefault(), "START movie=node(*) MATCH (movie)<-[:STARED_IN]-(actor) WHERE ((actor.name = 'Bob Dinero') OR (actor.role = 'Keyser Söze')) RETURN actor as actor, id(actor) as actor__Id, labels(actor) as actor__Labels, movie as movie, id(movie) as movie__Id, labels(movie) as movie__Labels");
163+
VerifyCypher(cypher, results.FirstOrDefault(),
164+
"START movie=node(*) MATCH (movie)<-[:STARED_IN]-(actor) WHERE ((actor.name = 'Bob Dinero') OR (actor.role = 'Keyser Söze')) RETURN actor as actor, id(actor) as actor__Id, labels(actor) as actor__Labels, movie as movie, id(movie) as movie__Id, labels(movie) as movie__Labels");
106165
}
107166

108167
[TestMethod]
@@ -114,11 +173,18 @@ public void BuildCypherQuery_MatchByLabel_ExecutesCorrectQuery()
114173
factory.Setup(f => f.Create()).Returns(cypher.Object);
115174
var query = new FluentCypherQueryBuilder<TestCypherClause>(factory.Object);
116175
var results = query
117-
.Match(v => Pattern.Start(v.actor, "METHOD_ACTOR").Outgoing("STARED_IN").To().Outgoing(v.directedBy, "DIRECTED_BY").To(v.director))
118-
.Return(v => new { v.actor, v.director })
176+
.Match(
177+
v =>
178+
Pattern.Start(v.actor, "METHOD_ACTOR")
179+
.Outgoing("STARED_IN")
180+
.To()
181+
.Outgoing(v.directedBy, "DIRECTED_BY")
182+
.To(v.director))
183+
.Return(v => new {v.actor, v.director})
119184
.Fetch();
120185

121-
VerifyCypher(cypher, results.FirstOrDefault(), "MATCH (actor:METHOD_ACTOR)-[:STARED_IN]->()-[directedBy:DIRECTED_BY]->(director) RETURN actor as actor, id(actor) as actor__Id, labels(actor) as actor__Labels, director as director, id(director) as director__Id, labels(director) as director__Labels");
186+
VerifyCypher(cypher, results.FirstOrDefault(),
187+
"MATCH (actor:METHOD_ACTOR)-[:STARED_IN]->()-[directedBy:DIRECTED_BY]->(director) RETURN actor as actor, id(actor) as actor__Id, labels(actor) as actor__Labels, director as director, id(director) as director__Id, labels(director) as director__Labels");
122188
}
123189

124190
[TestMethod]
@@ -131,25 +197,33 @@ public void BuildCypherQuery_StartAtNodeN_ExecutesCorrectQuery()
131197
var query = new FluentCypherQueryBuilder<TestCypherClause>(factory.Object);
132198
var results = query
133199
.Start(v => Start.At(v.actor, 1))
134-
.Return(v => new { v.actor })
200+
.Return(v => new {v.actor})
135201
.OrderBy(p => p.actedIn.Get<int>("fgds"), p => p.actedIn.Get<string>("name"))
136202
.Skip(2)
137203
.Limit(1)
138204
.Fetch();
139205

140-
VerifyCypher(cypher, results.FirstOrDefault(), "START actor=node(1) RETURN actor as actor, id(actor) as actor__Id, labels(actor) as actor__Labels ORDER BY actedIn.fgds, actedIn.name SKIP 2 LIMIT 1");
206+
VerifyCypher(cypher, results.FirstOrDefault(),
207+
"START actor=node(1) RETURN actor as actor, id(actor) as actor__Id, labels(actor) as actor__Labels ORDER BY actedIn.fgds, actedIn.name SKIP 2 LIMIT 1");
208+
}
209+
210+
private void VerifyCypher<TResult>(Mock<ICypherClient> mock, TResult proto, string query)
211+
{
212+
mock.Verify(
213+
c =>
214+
c.ExecuteQuery<TResult>(query));
141215
}
142216

143-
void VerifyCypher<TResult>(Mock<ICypherClient> mock, TResult proto, string query)
217+
private void VerifyCypher(Mock<ICypherClient> mock, string query)
144218
{
145219
mock.Verify(
146-
c =>
147-
c.ExecuteQuery<TResult>(query));
220+
c =>
221+
c.ExecuteCommand(query));
148222
}
149223

150-
void DoIt<TResult, TInput>(TInput proto, Expression<Func<TResult>> inputFunc) where TResult : TInput, ICypherClientFactory
224+
private void DoIt<TResult, TInput>(TInput proto, Expression<Func<TResult>> inputFunc)
225+
where TResult : TInput, ICypherClientFactory
151226
{
152-
153227
}
154228
}
155-
}
229+
}

CypherNet.UnitTests/DeserializationTests.cs

+18-18
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Globalization;
4-
using System.Linq;
5-
using System.Text;
6-
using System.Threading.Tasks;
7-
using CypherNet.Graph;
8-
using CypherNet.Queries;
9-
using CypherNet.Serialization;
10-
using Microsoft.VisualStudio.TestTools.UnitTesting;
11-
using Newtonsoft.Json.Linq;
12-
13-
namespace CypherNet.UnitTests
1+
namespace CypherNet.UnitTests
142
{
3+
#region
4+
5+
using System;
6+
using System.Linq;
7+
using Graph;
8+
using Microsoft.VisualStudio.TestTools.UnitTesting;
9+
using Queries;
10+
using Serialization;
11+
12+
#endregion
13+
1514
[TestClass]
1615
public class SerializationTests
1716
{
18-
1917
[TestMethod]
2018
public void DerializeJson_EntitiesOnly_ReturnsCollectionOfEntities()
2119
{
@@ -85,16 +83,18 @@ public void DerializeJson_EntitiesOnly_ReturnsCollectionOfEntities()
8583
var deserializer = new DefaultJsonSerializer();
8684

8785
var retval = deserializer.Deserialize<CypherResponse<DeserializationTestClass>>(json);
88-
Assert.AreEqual(retval.Results.Count(),2);
86+
Assert.AreEqual(retval.Results.Count(), 2);
8987
dynamic actor = retval.Results.Select(r => r.Actor).First();
90-
Assert.AreEqual(actor.age,33);
88+
Assert.AreEqual(actor.age, 33);
9189
Assert.AreEqual(actor.name, "mark");
9290
}
9391

9492
[TestMethod]
9593
public void SerializeCypherRequest__IsValid()
9694
{
97-
var request = CypherQueryRequest.Create(@"START x=node(1), y=node(2) CREATE x-[r:OWNS {""name"":""mark""}]->y<-[r2:IS_OWNED_BY {""age"": 33}]");
95+
var request =
96+
CypherQueryRequest.Create(
97+
@"START x=node(1), y=node(2) CREATE x-[r:OWNS {""name"":""mark""}]->y<-[r2:IS_OWNED_BY {""age"": 33}]");
9898
var serializer = new DefaultJsonSerializer();
9999
var result = serializer.Serialize(request);
100100
Console.WriteLine(result);
@@ -114,4 +114,4 @@ public DeserializationTestClass(Node actor, Relationship actedIn, Node movie)
114114
public Relationship ActedIn { get; set; }
115115
public Node Movie { get; set; }
116116
}
117-
}
117+
}

0 commit comments

Comments
 (0)