Skip to content
This repository was archived by the owner on Jul 6, 2023. It is now read-only.

Commit 1c82665

Browse files
committed
Add more tests
1 parent d0c3e5a commit 1c82665

File tree

4 files changed

+193
-5
lines changed

4 files changed

+193
-5
lines changed

cypher-shell/src/main/java/org/neo4j/shell/CypherShell.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ public boolean isTransactionOpen() {
177177
return boltStateHandler.isTransactionOpen();
178178
}
179179

180-
void setCommandHelper(@Nonnull CommandHelper commandHelper) {
180+
public void setCommandHelper(@Nonnull CommandHelper commandHelper) {
181181
this.commandHelper = commandHelper;
182182
}
183183

cypher-shell/src/main/java/org/neo4j/shell/cli/InteractiveShellRunner.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ public class InteractiveShellRunner implements ShellRunner, SignalHandler {
3939
private final static String TRANSACTION_PROMPT = "# ";
4040
private final static String USERNAME_DB_DELIMITER = "@";
4141
private final static int ONELINE_PROMPT_MAX_LENGTH = 50;
42-
private static final String UNRESOLVED_DEFAULT_DB_PROPMPT_TEXT = "<default_database>";
43-
private static final String DATABASE_UNAVAILABLE_ERROR_PROMPT_TEXT = "[UNAVAILABLE]";
42+
static final String UNRESOLVED_DEFAULT_DB_PROPMPT_TEXT = "<default_database>";
43+
static final String DATABASE_UNAVAILABLE_ERROR_PROMPT_TEXT = "[UNAVAILABLE]";
4444

4545
// Need to know if we are currently executing when catch Ctrl-C, needs to be atomic due to
4646
// being called from different thread

cypher-shell/src/test/java/org/neo4j/shell/OfflineTestShell.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.neo4j.shell;
22

3-
43
import org.neo4j.shell.log.Logger;
54
import org.neo4j.shell.prettyprint.PrettyPrinter;
65
import org.neo4j.shell.state.BoltStateHandler;
@@ -12,7 +11,7 @@
1211
*/
1312
public class OfflineTestShell extends CypherShell {
1413

15-
OfflineTestShell( Logger logger, BoltStateHandler boltStateHandler, PrettyPrinter prettyPrinter ) {
14+
public OfflineTestShell(Logger logger, BoltStateHandler boltStateHandler, PrettyPrinter prettyPrinter) {
1615
super(logger, boltStateHandler, prettyPrinter, new ShellParameterMap());
1716
}
1817

cypher-shell/src/test/java/org/neo4j/shell/cli/InteractiveShellRunnerTest.java

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,36 @@
66
import org.junit.rules.ExpectedException;
77
import org.junit.rules.TemporaryFolder;
88
import org.neo4j.driver.exceptions.ClientException;
9+
import org.neo4j.driver.exceptions.DiscoveryException;
10+
import org.neo4j.driver.exceptions.ServiceUnavailableException;
11+
import org.neo4j.driver.exceptions.TransientException;
912
import org.neo4j.shell.ConnectionConfig;
1013
import org.neo4j.shell.CypherShell;
1114
import org.neo4j.shell.DatabaseManager;
1215
import org.neo4j.shell.Historian;
16+
import org.neo4j.shell.OfflineTestShell;
1317
import org.neo4j.shell.ShellParameterMap;
1418
import org.neo4j.shell.StatementExecuter;
1519
import org.neo4j.shell.TransactionHandler;
1620
import org.neo4j.shell.UserMessagesHandler;
21+
import org.neo4j.shell.commands.CommandHelper;
1722
import org.neo4j.shell.exception.CommandException;
1823
import org.neo4j.shell.exception.ExitException;
1924
import org.neo4j.shell.exception.NoMoreInputException;
2025
import org.neo4j.shell.log.AnsiFormattedText;
26+
import org.neo4j.shell.log.AnsiLogger;
2127
import org.neo4j.shell.log.Logger;
2228
import org.neo4j.shell.parser.ShellStatementParser;
2329
import org.neo4j.shell.parser.StatementParser;
2430
import org.neo4j.shell.prettyprint.OutputFormatter;
2531
import org.neo4j.shell.prettyprint.PrettyPrinter;
2632
import org.neo4j.shell.state.BoltStateHandler;
33+
2734
import sun.misc.Signal;
2835

2936
import javax.annotation.Nonnull;
3037
import java.io.ByteArrayInputStream;
38+
import java.io.ByteArrayOutputStream;
3139
import java.io.File;
3240
import java.io.IOException;
3341
import java.io.InputStream;
@@ -37,6 +45,7 @@
3745
import java.util.concurrent.atomic.AtomicReference;
3846

3947
import static java.lang.String.format;
48+
import static org.hamcrest.CoreMatchers.containsString;
4049
import static org.hamcrest.CoreMatchers.is;
4150
import static org.hamcrest.MatcherAssert.assertThat;
4251
import static org.junit.Assert.assertEquals;
@@ -49,6 +58,7 @@
4958
import static org.mockito.Mockito.verify;
5059
import static org.mockito.Mockito.verifyNoMoreInteractions;
5160
import static org.mockito.Mockito.when;
61+
import static org.neo4j.shell.cli.InteractiveShellRunner.DATABASE_UNAVAILABLE_ERROR_PROMPT_TEXT;
5262

5363
public class InteractiveShellRunnerTest {
5464
@Rule
@@ -293,6 +303,78 @@ public void testPrompt() throws Exception {
293303
assertEquals(OutputFormatter.repeat(' ', wantedPrompt.length()), prompt.plainString());
294304
}
295305

306+
@Test
307+
public void testPromptShowDatabaseAsSetByUserWhenServerReportNull() throws Exception {
308+
// given
309+
InputStream inputStream = new ByteArrayInputStream("".getBytes());
310+
InteractiveShellRunner runner = new InteractiveShellRunner(cmdExecuter, txHandler, databaseManager, logger, statementParser, inputStream,
311+
historyFile, userMessagesHandler, connectionConfig);
312+
313+
// when
314+
when(txHandler.isTransactionOpen()).thenReturn(false);
315+
when(databaseManager.getActiveDatabaseAsSetByUser()).thenReturn("foo");
316+
when(databaseManager.getActualDatabaseAsReportedByServer()).thenReturn(null);
317+
AnsiFormattedText prompt = runner.updateAndGetPrompt();
318+
319+
// then
320+
String wantedPrompt = "myusername@foo> ";
321+
assertEquals(wantedPrompt, prompt.plainString());
322+
}
323+
324+
@Test
325+
public void testPromptShowDatabaseAsSetByUserWhenServerReportAbsent() throws Exception {
326+
// given
327+
InputStream inputStream = new ByteArrayInputStream("".getBytes());
328+
InteractiveShellRunner runner = new InteractiveShellRunner(cmdExecuter, txHandler, databaseManager, logger, statementParser, inputStream,
329+
historyFile, userMessagesHandler, connectionConfig);
330+
331+
// when
332+
when(txHandler.isTransactionOpen()).thenReturn(false);
333+
when(databaseManager.getActiveDatabaseAsSetByUser()).thenReturn("foo");
334+
when(databaseManager.getActualDatabaseAsReportedByServer()).thenReturn(DatabaseManager.ABSENT_DB_NAME);
335+
AnsiFormattedText prompt = runner.updateAndGetPrompt();
336+
337+
// then
338+
String wantedPrompt = "myusername@foo> ";
339+
assertEquals(wantedPrompt, prompt.plainString());
340+
}
341+
342+
@Test
343+
public void testPromptShowUnresolvedDefaultDatabaseWhenServerReportNull() throws Exception {
344+
// given
345+
InputStream inputStream = new ByteArrayInputStream("".getBytes());
346+
InteractiveShellRunner runner = new InteractiveShellRunner(cmdExecuter, txHandler, databaseManager, logger, statementParser, inputStream,
347+
historyFile, userMessagesHandler, connectionConfig);
348+
349+
// when
350+
when(txHandler.isTransactionOpen()).thenReturn(false);
351+
when(databaseManager.getActiveDatabaseAsSetByUser()).thenReturn(DatabaseManager.ABSENT_DB_NAME);
352+
when(databaseManager.getActualDatabaseAsReportedByServer()).thenReturn(null);
353+
AnsiFormattedText prompt = runner.updateAndGetPrompt();
354+
355+
// then
356+
String wantedPrompt = format("myusername@%s> ", InteractiveShellRunner.UNRESOLVED_DEFAULT_DB_PROPMPT_TEXT);
357+
assertEquals(wantedPrompt, prompt.plainString());
358+
}
359+
360+
@Test
361+
public void testPromptShowUnresolvedDefaultDatabaseWhenServerReportAbsent() throws Exception {
362+
// given
363+
InputStream inputStream = new ByteArrayInputStream("".getBytes());
364+
InteractiveShellRunner runner = new InteractiveShellRunner(cmdExecuter, txHandler, databaseManager, logger, statementParser, inputStream,
365+
historyFile, userMessagesHandler, connectionConfig);
366+
367+
// when
368+
when(txHandler.isTransactionOpen()).thenReturn(false);
369+
when(databaseManager.getActiveDatabaseAsSetByUser()).thenReturn(DatabaseManager.ABSENT_DB_NAME);
370+
when(databaseManager.getActualDatabaseAsReportedByServer()).thenReturn(DatabaseManager.ABSENT_DB_NAME);
371+
AnsiFormattedText prompt = runner.updateAndGetPrompt();
372+
373+
// then
374+
String wantedPrompt = format("myusername@%s> ", InteractiveShellRunner.UNRESOLVED_DEFAULT_DB_PROPMPT_TEXT);
375+
assertEquals(wantedPrompt, prompt.plainString());
376+
}
377+
296378
@Test
297379
public void testLongPrompt() throws Exception {
298380
// given
@@ -499,4 +581,111 @@ public String getActualDatabaseAsReportedByServer() {
499581
return DEFAULT_DEFAULT_DB_NAME;
500582
}
501583
}
584+
585+
private static class TestInteractiveShellRunner {
586+
InteractiveShellRunner runner;
587+
ByteArrayOutputStream output;
588+
ByteArrayOutputStream error;
589+
BoltStateHandler mockedBoltStateHandler;
590+
591+
TestInteractiveShellRunner(InteractiveShellRunner runner, ByteArrayOutputStream output,
592+
ByteArrayOutputStream error, BoltStateHandler mockedBoltStateHandler) {
593+
this.runner = runner;
594+
this.output = output;
595+
this.error = error;
596+
this.mockedBoltStateHandler = mockedBoltStateHandler;
597+
}
598+
}
599+
600+
private TestInteractiveShellRunner setupInteractiveTestShellRunner(String input) throws Exception {
601+
// NOTE: Tests using this will test a bit more of the stack using OfflineTestShell
602+
ByteArrayOutputStream output = new ByteArrayOutputStream();
603+
ByteArrayOutputStream error = new ByteArrayOutputStream();
604+
605+
BoltStateHandler mockedBoltStateHandler = mock(BoltStateHandler.class);
606+
when(mockedBoltStateHandler.getServerVersion()).thenReturn("");
607+
608+
final PrettyPrinter mockedPrettyPrinter = mock(PrettyPrinter.class);
609+
610+
Logger logger = new AnsiLogger(false, Format.VERBOSE, new PrintStream(output), new PrintStream(error));
611+
612+
OfflineTestShell offlineTestShell = new OfflineTestShell(logger, mockedBoltStateHandler, mockedPrettyPrinter);
613+
CommandHelper commandHelper = new CommandHelper(logger, Historian.empty, offlineTestShell);
614+
offlineTestShell.setCommandHelper(commandHelper);
615+
616+
InputStream inputStream = new ByteArrayInputStream(input.getBytes());
617+
InteractiveShellRunner runner = new InteractiveShellRunner(offlineTestShell, offlineTestShell, offlineTestShell, logger,
618+
new ShellStatementParser(), inputStream, historyFile, userMessagesHandler, connectionConfig);
619+
620+
return new TestInteractiveShellRunner(runner, output, error, mockedBoltStateHandler);
621+
}
622+
623+
@Test
624+
public void testSwitchToUnavailableDatabase1() throws Exception {
625+
// given
626+
String input = ":use foo;\n";
627+
TestInteractiveShellRunner sr = setupInteractiveTestShellRunner(input);
628+
629+
// when
630+
when(sr.mockedBoltStateHandler.getActualDatabaseAsReportedByServer()).thenReturn("foo");
631+
doThrow(new TransientException(DatabaseManager.DATABASE_UNAVAILABLE_ERROR_CODE, "Not available"))
632+
.when(sr.mockedBoltStateHandler).setActiveDatabase("foo");
633+
634+
sr.runner.runUntilEnd();
635+
636+
// then
637+
assertThat(sr.output.toString(), containsString(format("myusername@foo%s> ", DATABASE_UNAVAILABLE_ERROR_PROMPT_TEXT)));
638+
assertThat(sr.error.toString(), containsString("Not available"));
639+
}
640+
641+
@Test
642+
public void testSwitchToUnavailableDatabase2() throws Exception {
643+
// given
644+
String input = ":use foo;\n";
645+
TestInteractiveShellRunner sr = setupInteractiveTestShellRunner(input);
646+
647+
// when
648+
when(sr.mockedBoltStateHandler.getActualDatabaseAsReportedByServer()).thenReturn("foo");
649+
doThrow(new ServiceUnavailableException("Not available")).when(sr.mockedBoltStateHandler).setActiveDatabase("foo");
650+
651+
sr.runner.runUntilEnd();
652+
653+
// then
654+
assertThat(sr.output.toString(), containsString(format("myusername@foo%s> ", DATABASE_UNAVAILABLE_ERROR_PROMPT_TEXT)));
655+
assertThat(sr.error.toString(), containsString("Not available"));
656+
}
657+
658+
@Test
659+
public void testSwitchToUnavailableDatabase3() throws Exception {
660+
// given
661+
String input = ":use foo;\n";
662+
TestInteractiveShellRunner sr = setupInteractiveTestShellRunner(input);
663+
664+
// when
665+
when(sr.mockedBoltStateHandler.getActualDatabaseAsReportedByServer()).thenReturn("foo");
666+
doThrow(new DiscoveryException("Not available", null)).when(sr.mockedBoltStateHandler).setActiveDatabase("foo");
667+
668+
sr.runner.runUntilEnd();
669+
670+
// then
671+
assertThat(sr.output.toString(), containsString(format("myusername@foo%s> ", DATABASE_UNAVAILABLE_ERROR_PROMPT_TEXT)));
672+
assertThat(sr.error.toString(), containsString("Not available"));
673+
}
674+
675+
@Test
676+
public void testSwitchToNonExistingDatabase() throws Exception {
677+
// given
678+
String input = ":use foo;\n";
679+
TestInteractiveShellRunner sr = setupInteractiveTestShellRunner(input);
680+
681+
// when
682+
when(sr.mockedBoltStateHandler.getActualDatabaseAsReportedByServer()).thenReturn("mydb");
683+
doThrow(new ClientException("Non existing")).when(sr.mockedBoltStateHandler).setActiveDatabase("foo");
684+
685+
sr.runner.runUntilEnd();
686+
687+
// then
688+
assertThat(sr.output.toString(), containsString("myusername@mydb> "));
689+
assertThat(sr.error.toString(), containsString("Non existing"));
690+
}
502691
}

0 commit comments

Comments
 (0)