Skip to content

Commit

Permalink
GH-950 - Respect null position in notifications.
Browse files Browse the repository at this point in the history
Closes #950
  • Loading branch information
meistermeier committed Jul 12, 2023
1 parent 96981ac commit b378efa
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -124,17 +124,19 @@ private static void logNotifications(ResultSummary resultSummary) {
* @param forQuery The query that caused the notification
* @return A formatted string
*/
static String format(Notification notification, String forQuery) {
private static String format(Notification notification, String forQuery) {

InputPosition position = notification.position();
int lineNumber = position != null ? position.line() : 1;
int column = position != null ? position.column() : 1;

StringBuilder queryHint = new StringBuilder();
String[] lines = forQuery.split("(\r\n|\n)");
for (int i = 0; i < lines.length; i++) {
String line = lines[i];
queryHint.append("\t").append(line).append(LINE_SEPARATOR);
if (i + 1 == position.line()) {
queryHint.append("\t").append(Stream.generate(() -> " ").limit(position.column() - 1)
if (i + 1 == lineNumber) {
queryHint.append("\t").append(Stream.generate(() -> " ").limit(column - 1)
.collect(Collectors.joining())).append("^").append(System.lineSeparator());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,35 @@
*/
package org.neo4j.ogm.drivers.bolt.driver;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.neo4j.driver.Driver;
import org.neo4j.ogm.domain.cypher_exception_test.ConstraintedNode;
import org.neo4j.ogm.drivers.bolt.response.BoltResponse;
import org.neo4j.ogm.exception.CypherException;
import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.neo4j.ogm.testutil.LoggerRule;
import org.neo4j.ogm.testutil.TestContainersTestBase;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.Map;

/**
* @author Michael J. Simons
*/
public class BoltCypherExceptionTest extends TestContainersTestBase {

@RegisterExtension
public final LoggerRule loggerRule = new LoggerRule();

private static SessionFactory sessionFactory;

private static final String CONSTRAINT_VIOLATED_MESSAGE_PATTERN
Expand Down Expand Up @@ -63,6 +76,25 @@ void constraintViolationExceptionShouldBeConsistent() {
}).withMessageStartingWith(CONSTRAINT_VIOLATED_MESSAGE_PATTERN);
}

@Test
void shouldNotThrowNullPointerExceptionOnMissingNotificationPosition() {
Logger logger = (Logger) LoggerFactory.getLogger(BoltResponse.class);
Level originalLevel = logger.getLevel();
logger.setLevel(Level.INFO);

try {
Session session = sessionFactory.openSession();
Map<String, Object> parameters = Map.of("records", List.of(Map.of("a", 1, "b", 2), Map.of("c", 3, "d", 4)));
Assertions.assertThatCode(() -> session.query(
"CREATE (n:A) CREATE (n)-[:B]->(_v0:C:D) WITH _v0 MATCH (_v4:E {a:\"2\"}) CREATE (_v0)-[:F]->(_v4) FOREACH (record in $records| CREATE (_v0)-[:G]->(_v6:H) SET _v6 = record)",
parameters)).doesNotThrowAnyException();
} finally {
logger.setLevel(originalLevel);
}


}

@AfterAll
public static void removeDataAndCloseSessionFactory() {
try (var session = getDriver().unwrap(Driver.class).session()) {
Expand Down

0 comments on commit b378efa

Please sign in to comment.