Skip to content

Commit b1a040d

Browse files
committed
Refactored tests, review fixes
1 parent 633f244 commit b1a040d

File tree

3 files changed

+99
-62
lines changed

3 files changed

+99
-62
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,56 @@
11
package com.neueda.jetbrains.plugin.graphdb.test.integration.neo4j.tests.cypher.inspection;
22

3-
import com.intellij.psi.PsiFile;
4-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.state.DataSourceApi;
3+
import com.intellij.codeInspection.LocalInspectionTool;
54
import com.neueda.jetbrains.plugin.graphdb.jetbrains.inspection.CypherExplainWarningInspection;
6-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.util.NameUtil;
7-
import com.neueda.jetbrains.plugin.graphdb.test.integration.neo4j.util.base.BaseIntegrationTest;
5+
import com.neueda.jetbrains.plugin.graphdb.platform.GraphConstants;
6+
import com.neueda.jetbrains.plugin.graphdb.test.integration.neo4j.tests.cypher.util.BaseInspectionTest;
87

9-
public class CypherExplainWarningInspectionTest extends BaseIntegrationTest {
8+
import java.util.Set;
109

11-
private DataSourceApi dsApi;
10+
import static java.util.Collections.singleton;
11+
import static java.util.Collections.singletonList;
12+
13+
public class CypherExplainWarningInspectionTest extends BaseInspectionTest {
1214

1315
@Override
14-
public void setUp() throws Exception {
15-
super.setUp();
16-
this.dsApi = dataSource().neo4j31();
17-
myFixture.enableInspections(CypherExplainWarningInspection.class);
16+
protected Set<Class<? extends LocalInspectionTool>> provideInspectionClasses() {
17+
return singleton(CypherExplainWarningInspection.class);
1818
}
1919

2020
public void testNonDataSourceFile_NoHighlight() {
21-
PsiFile psiFile = myFixture.addFileToProject("a.cyp", "MATCH (a)-->(b) RETURN *");
22-
myFixture.configureFromExistingVirtualFile(psiFile.getVirtualFile());
23-
myFixture.checkHighlighting();
21+
addFileAndCheck("a.cyp", "MATCH (a)-->(b) RETURN *");
2422
}
2523

2624
public void testDataSourceFile_NoHighlight() {
27-
String fileName = NameUtil.createDataSourceFileName(dsApi);
28-
PsiFile psiFile = myFixture.addFileToProject(fileName,
29-
"MATCH (a)-->(b) RETURN *");
30-
myFixture.configureFromExistingVirtualFile(psiFile.getVirtualFile());
31-
myFixture.checkHighlighting();
25+
addDataSourceFileAndCheck("MATCH (a)-->(b) RETURN *");
3226
}
3327

3428
public void testDataSourceFile_HighlightExplainWarning() {
35-
String fileName = NameUtil.createDataSourceFileName(dsApi);
36-
PsiFile psiFile = myFixture.addFileToProject(fileName,
37-
"MATCH (a)-[r:" +
38-
"<warning descr=\"The provided relationship type is not in the database.\">" +
39-
"ART</warning>]-(b) RETURN *;");
40-
myFixture.configureFromExistingVirtualFile(psiFile.getVirtualFile());
41-
myFixture.checkHighlighting();
29+
addDataSourceFileAndCheck("MATCH (a)-[r:" +
30+
"<warning descr=\"The provided relationship type is not in the database.\">" +
31+
"ART</warning>]-(b) RETURN *;");
4232
}
4333

4434
public void testDataSourceFile_NoHighlightQueryError() {
45-
String fileName = NameUtil.createDataSourceFileName(dsApi);
46-
PsiFile psiFile = myFixture.addFileToProject(fileName,
47-
"MATCH (a)-->() RETURN b;");
48-
myFixture.configureFromExistingVirtualFile(psiFile.getVirtualFile());
49-
myFixture.checkHighlighting();
35+
addDataSourceFileAndCheck("MATCH (a)-->() RETURN b;");
5036
}
5137

5238
public void testDataSourceFile_NoHighlightParserError() {
53-
String fileName = NameUtil.createDataSourceFileName(dsApi);
54-
PsiFile psiFile = myFixture.addFileToProject(fileName,
55-
"MATCH a<error>-</error>->() RETURN *;");
56-
myFixture.configureFromExistingVirtualFile(psiFile.getVirtualFile());
57-
myFixture.checkHighlighting();
39+
addDataSourceFileAndCheck("MATCH a<error>-</error>->() RETURN *;");
40+
}
41+
42+
public void testDataSourceFile_NoDataSource() {
43+
component().dataSources().getDataSourceContainer().removeDataSources(singletonList(dataSource().neo4j31()));
44+
addFileAndCheck(GraphConstants.BOUND_DATA_SOURCE_PREFIX + "imaginary-ds-uuid-with-36-symbols-in.cypher",
45+
"MATCH (a:Turbo)-->() RETURN *;");
46+
}
47+
48+
public void testDataSourceFile_UserCreatedDSLikeFile() {
49+
component().dataSources().getDataSourceContainer().removeDataSources(singletonList(dataSource().neo4j31()));
50+
// uuid should be 36 symbols long, let's assume user created a file with a name, starting like ds file
51+
// but does not match the expected format
52+
addFileAndCheck(GraphConstants.BOUND_DATA_SOURCE_PREFIX + "ds-uuid-with-23-symbols.cypher",
53+
"MATCH (a:Turbo)-->() RETURN *;");
5854
}
5955

6056
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.neueda.jetbrains.plugin.graphdb.test.integration.neo4j.tests.cypher.util;
2+
3+
import com.intellij.codeInspection.LocalInspectionTool;
4+
import com.intellij.openapi.vfs.VirtualFile;
5+
import com.intellij.psi.PsiFile;
6+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.util.NameUtil;
7+
import com.neueda.jetbrains.plugin.graphdb.test.integration.neo4j.util.base.BaseIntegrationTest;
8+
9+
import java.util.Optional;
10+
import java.util.Set;
11+
12+
public abstract class BaseInspectionTest extends BaseIntegrationTest {
13+
private String dsApiUUID;
14+
15+
@Override
16+
public void setUp() throws Exception {
17+
super.setUp();
18+
this.dsApiUUID = dataSource().neo4j31().getUUID();
19+
myFixture.enableInspections(provideInspectionClasses());
20+
}
21+
22+
protected abstract Set<Class<? extends LocalInspectionTool>> provideInspectionClasses();
23+
24+
protected void addFileAndCheck(String filePath, String fileContent) {
25+
PsiFile psiFile = myFixture.addFileToProject(filePath, fileContent);
26+
configureAndCheck(psiFile.getVirtualFile());
27+
}
28+
29+
protected void addDataSourceFileAndCheck(String fileContent) {
30+
String fileName = Optional.of(dsApiUUID)
31+
.flatMap(uuid -> component().dataSources().getDataSourceContainer().findDataSource(uuid))
32+
.map(NameUtil::createDataSourceFileName)
33+
.orElseThrow(IllegalStateException::new);
34+
35+
addFileAndCheck(fileName, fileContent);
36+
}
37+
38+
private void configureAndCheck(VirtualFile virtualFile) {
39+
myFixture.configureFromExistingVirtualFile(virtualFile);
40+
myFixture.checkHighlighting();
41+
}
42+
}

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/inspection/CypherExplainWarningInspection.java

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import com.neueda.jetbrains.plugin.graphdb.language.cypher.psi.CypherTypes;
1515
import com.neueda.jetbrains.plugin.graphdb.platform.GraphConstants;
1616
import org.jetbrains.annotations.NotNull;
17-
import org.jetbrains.annotations.Nullable;
1817
import org.neo4j.driver.v1.exceptions.ClientException;
1918

2019
import java.util.Objects;
@@ -53,36 +52,29 @@ public void visitElement(PsiElement element) {
5352

5453
private void checkStatement(@NotNull PsiElement statement, @NotNull ProblemsHolder problemsHolder) {
5554
if (statement.getNode().getElementType() == CypherTypes.SINGLE_QUERY) {
55+
Optional.of(statement.getContainingFile().getName())
56+
.filter(s -> s.startsWith(GraphConstants.BOUND_DATA_SOURCE_PREFIX))
57+
.map(this::safeExtractDataSourceUUID)
58+
.flatMap(uuid -> statement.getProject()
59+
.getComponent(DataSourcesComponent.class)
60+
.getDataSourceContainer()
61+
.findDataSource(uuid))
62+
.map(service::getDatabaseFor)
63+
.map(api -> this.executeExplainQuery(api, statement.getText()))
64+
.filter(Objects::nonNull)
65+
.map(GraphQueryResult::getNotifications)
66+
.filter(list -> !list.isEmpty())
67+
.ifPresent(notifications -> notifications.forEach(notification -> {
68+
PsiElement elementAt = Optional.ofNullable(notification.getPositionOffset())
69+
.filter(position -> position > 0)
70+
.map(statement::findElementAt)
71+
.orElse(statement);
5672

57-
String fileName = statement.getContainingFile().getName();
58-
if (fileName.startsWith(GraphConstants.BOUND_DATA_SOURCE_PREFIX)) {
59-
DataSourcesComponent component = statement.getProject().getComponent(DataSourcesComponent.class);
60-
61-
component.getDataSourceContainer()
62-
.findDataSource(NameUtil.extractDataSourceUUID(fileName))
63-
.map(service::getDatabaseFor)
64-
.map(api -> this.executeExplainQuery(api, statement.getText()))
65-
.filter(Objects::nonNull)
66-
.map(GraphQueryResult::getNotifications)
67-
.filter(list -> !list.isEmpty())
68-
.ifPresent(notifications -> notifications.forEach(notification -> {
69-
PsiElement elementAt = Optional.ofNullable(notification.getPositionOffset())
70-
.filter(position -> position > 0)
71-
.map(statement::findElementAt)
72-
.orElse(statement);
73-
74-
problemsHolder.registerProblem(elementAt, notification.getTitle());
75-
}));
76-
}
73+
problemsHolder.registerProblem(elementAt, notification.getTitle());
74+
}));
7775
}
7876
}
7977

80-
@Nullable
81-
@Override
82-
public String loadDescription() {
83-
return super.loadDescription();
84-
}
85-
8678
private GraphQueryResult executeExplainQuery(GraphDatabaseApi api, String query) {
8779
try {
8880
return api.execute("EXPLAIN " + query);
@@ -91,4 +83,11 @@ private GraphQueryResult executeExplainQuery(GraphDatabaseApi api, String query)
9183
}
9284
}
9385

86+
private String safeExtractDataSourceUUID(String fileName) {
87+
try {
88+
return NameUtil.extractDataSourceUUID(fileName);
89+
} catch (IndexOutOfBoundsException e) {
90+
return null;
91+
}
92+
}
9493
}

0 commit comments

Comments
 (0)