Skip to content

Commit 0112bab

Browse files
authored
make tests using the same database instance for all integration tests (#204)
1 parent 4a76e81 commit 0112bab

File tree

3 files changed

+82
-73
lines changed

3 files changed

+82
-73
lines changed
Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,84 @@
11
package org.neo4j.graphql
22

3-
import org.junit.jupiter.api.TestFactory
3+
import apoc.cypher.CypherFunctions
4+
import org.junit.jupiter.api.*
45
import org.neo4j.graphql.utils.CypherTestSuite
6+
import org.neo4j.harness.Neo4j
7+
import org.neo4j.harness.Neo4jBuilders
8+
import java.nio.file.Files
9+
import java.nio.file.Path
10+
import java.nio.file.Paths
11+
import java.util.stream.Stream
512

13+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
614
class CypherTests {
715

16+
private var neo4j: Neo4j? = null
17+
18+
@BeforeAll
19+
fun setup() {
20+
if (INTEGRATION_TESTS) {
21+
neo4j = Neo4jBuilders
22+
.newInProcessBuilder(Path.of("target/test-db"))
23+
.withProcedure(apoc.cypher.Cypher::class.java)
24+
.withFunction(CypherFunctions::class.java)
25+
.build()
26+
}
27+
}
28+
29+
@AfterAll
30+
fun tearDown() {
31+
neo4j?.close()
32+
}
33+
834
@TestFactory
9-
fun `cypher-directive-tests`() = CypherTestSuite("cypher-directive-tests.adoc").generateTests()
35+
fun `cypher-directive-tests`() = CypherTestSuite("cypher-directive-tests.adoc", neo4j).generateTests()
1036

1137
@TestFactory
12-
fun `dynamic-property-tests`() = CypherTestSuite("dynamic-property-tests.adoc").generateTests()
38+
fun `dynamic-property-tests`() = CypherTestSuite("dynamic-property-tests.adoc", neo4j).generateTests()
1339

1440
@TestFactory
15-
fun `filter-tests`() = CypherTestSuite("filter-tests.adoc").generateTests()
41+
fun `filter-tests`() = CypherTestSuite("filter-tests.adoc", neo4j).generateTests()
1642

1743
@TestFactory
18-
fun `relationship-tests`() = CypherTestSuite("relationship-tests.adoc").generateTests()
44+
fun `relationship-tests`() = CypherTestSuite("relationship-tests.adoc", neo4j).generateTests()
1945

2046
@TestFactory
21-
fun `movie-tests`() = CypherTestSuite("movie-tests.adoc").generateTests()
47+
fun `movie-tests`() = CypherTestSuite("movie-tests.adoc", neo4j).generateTests()
2248

2349
@TestFactory
24-
fun `property-tests`() = CypherTestSuite("property-tests.adoc").generateTests()
50+
fun `property-tests`() = CypherTestSuite("property-tests.adoc", neo4j).generateTests()
2551

2652
@TestFactory
27-
fun `translator-tests1`() = CypherTestSuite("translator-tests1.adoc").generateTests()
53+
fun `translator-tests1`() = CypherTestSuite("translator-tests1.adoc", neo4j).generateTests()
2854

2955
@TestFactory
30-
fun `translator-tests2`() = CypherTestSuite("translator-tests2.adoc").generateTests()
56+
fun `translator-tests2`() = CypherTestSuite("translator-tests2.adoc", neo4j).generateTests()
3157

3258
@TestFactory
33-
fun `translator-tests3`() = CypherTestSuite("translator-tests3.adoc").generateTests()
59+
fun `translator-tests3`() = CypherTestSuite("translator-tests3.adoc", neo4j).generateTests()
3460

3561
@TestFactory
36-
fun `translator-tests-custom-scalars`() = CypherTestSuite("translator-tests-custom-scalars.adoc").generateTests()
62+
fun `translator-tests-custom-scalars`() = CypherTestSuite("translator-tests-custom-scalars.adoc", neo4j).generateTests()
3763

3864
@TestFactory
39-
fun `optimized-query-for-filter`() = CypherTestSuite("optimized-query-for-filter.adoc").generateTests()
65+
fun `optimized-query-for-filter`() = CypherTestSuite("optimized-query-for-filter.adoc", neo4j).generateTests()
4066

4167
@TestFactory
42-
fun `custom-fields`() = CypherTestSuite("custom-fields.adoc").generateTests()
68+
fun `custom-fields`() = CypherTestSuite("custom-fields.adoc", neo4j).generateTests()
69+
70+
@TestFactory
71+
fun `test issues`(): Stream<DynamicNode>? = Files
72+
.list(Paths.get("src/test/resources/issues"))
73+
.map {
74+
DynamicContainer.dynamicContainer(
75+
it.fileName.toString(),
76+
it.toUri(),
77+
CypherTestSuite("issues/${it.fileName}", neo4j).generateTests()
78+
)
79+
}
80+
81+
companion object {
82+
private val INTEGRATION_TESTS = System.getProperty("neo4j-graphql-java.integration-tests", "false") == "true"
83+
}
4384
}

core/src/test/kotlin/org/neo4j/graphql/IssuesTests.kt

Lines changed: 0 additions & 23 deletions
This file was deleted.

core/src/test/kotlin/org/neo4j/graphql/utils/CypherTestSuite.kt

Lines changed: 28 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
package org.neo4j.graphql.utils
22

3-
import apoc.cypher.CypherFunctions
43
import org.assertj.core.api.Assertions
54
import org.junit.jupiter.api.Assumptions
65
import org.junit.jupiter.api.DynamicNode
76
import org.junit.jupiter.api.DynamicTest
87
import org.neo4j.graphql.*
9-
import org.neo4j.harness.Neo4jBuilders
8+
import org.neo4j.harness.Neo4j
109
import org.opentest4j.AssertionFailedError
11-
import java.nio.file.Path
1210
import java.util.*
1311
import java.util.concurrent.FutureTask
1412
import kotlin.streams.toList
1513

16-
class CypherTestSuite(fileName: String) : AsciiDocTestSuite(
14+
class CypherTestSuite(fileName: String, val neo4j: Neo4j? = null) : AsciiDocTestSuite(
1715
fileName,
1816
listOf(
1917
SCHEMA_CONFIG_MARKER,
@@ -43,7 +41,7 @@ class CypherTestSuite(fileName: String) : AsciiDocTestSuite(
4341
tests.add(printGeneratedQuery(result))
4442
tests.add(printReplacedParameter(result))
4543
}
46-
if (INTEGRATION_TESTS) {
44+
if (neo4j != null) {
4745
val testData = globalBlocks[TEST_DATA_MARKER]
4846
val response = getOrCreateBlock(codeBlocks, GRAPHQL_RESPONSE_MARKER, "GraphQL-Response")
4947

@@ -142,48 +140,41 @@ class CypherTestSuite(fileName: String) : AsciiDocTestSuite(
142140
}
143141

144142
private fun integrationTest(testData: ParsedBlock, response: ParsedBlock, result: () -> Cypher): DynamicNode = DynamicTest.dynamicTest("Integration Test", response.uri) {
145-
Neo4jBuilders
146-
.newInProcessBuilder(Path.of("target/test-db"))
147-
.withProcedure(apoc.cypher.Cypher::class.java)
148-
.withFunction(CypherFunctions::class.java)
149-
.also { builder ->
150-
if (testData.code().isNotBlank()) {
151-
testData.code()
152-
.split(";")
153-
.filter { it.isNotBlank() }
154-
.forEach { builder.withFixture(it) }
155-
}
143+
neo4j?.defaultDatabaseService()?.let { db ->
144+
db.executeTransactionally("MATCH (n) DETACH DELETE n")
145+
if (testData.code().isNotBlank()) {
146+
testData.code()
147+
.split(";")
148+
.filter { it.isNotBlank() }
149+
.forEach { db.executeTransactionally(it) }
150+
}
151+
val (cypher, params, type, variable) = result()
152+
val values = db.executeTransactionally(cypher, params) { result ->
153+
mutableMapOf(variable to result.stream().map { it[variable] }.let {
154+
when {
155+
type?.isList() == true -> it.toList()
156+
else -> it.findFirst().orElse(null)
157+
}
158+
})
156159
}
157-
.build()
158-
.use { neo4j ->
159-
val (cypher, params, type, variable) = result()
160-
val values = neo4j.defaultDatabaseService().executeTransactionally(cypher, params) { result ->
161-
mutableMapOf(variable to result.stream().map { it[variable] }.let {
162-
when {
163-
type?.isList() == true -> it.toList()
164-
else -> it.findFirst().orElse(null)
165-
}
166-
})
167-
}
168160

169-
if (response.code.isEmpty()) {
161+
if (response.code.isEmpty()) {
162+
val actualCode = MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(values)
163+
response.adjustedCode = actualCode
164+
} else {
165+
val expected = fixNumbers(response.code().parseJsonMap())
166+
val actual = fixNumber(values)
167+
if (!Objects.equals(expected, actual)) {
170168
val actualCode = MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(values)
171169
response.adjustedCode = actualCode
172-
} else {
173-
val expected = fixNumbers(response.code().parseJsonMap())
174-
val actual = fixNumber(values)
175-
if (!Objects.equals(expected, actual)) {
176-
val actualCode = MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(values)
177-
response.adjustedCode = actualCode
178-
}
179-
Assertions.assertThat(actual).isEqualTo(expected)
180170
}
171+
Assertions.assertThat(actual).isEqualTo(expected)
181172
}
173+
}
182174
}
183175

184176
companion object {
185177
private val DEBUG = System.getProperty("neo4j-graphql-java.debug", "false") == "true"
186-
private val INTEGRATION_TESTS = System.getProperty("neo4j-graphql-java.integration-tests", "false") == "true"
187178

188179
private const val TEST_DATA_MARKER = "[source,cypher,test-data=true]"
189180
private const val CYPHER_MARKER = "[source,cypher]"

0 commit comments

Comments
 (0)