Skip to content

Commit c021d65

Browse files
committed
Add tests for init-command.
1 parent 3775c05 commit c021d65

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed

changelog.rst

+10
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
Upcoming (TBD)
2+
==============
3+
4+
Features:
5+
---------
6+
* Add support for `init-command` to run when the connection is established.
7+
* Command line option `--init-command`
8+
* Provide `init-command` in the config file
9+
* Support dsn specific init-command in the config file
10+
111
4.3.0 (2025-03-22)
212
==================
313

tests/test_init_commands_simple.py

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import pytest
2+
from click.testing import CliRunner
3+
4+
from pgcli.main import cli, PGCli
5+
6+
@pytest.fixture
7+
def dummy_exec(monkeypatch, tmp_path):
8+
# Capture executed commands
9+
# Isolate config directory for tests
10+
monkeypatch.setenv("XDG_CONFIG_HOME", str(tmp_path))
11+
dummy_cmds = []
12+
class DummyExec:
13+
def run(self, cmd):
14+
# Ignore ping SELECT 1 commands used for exiting CLI
15+
if cmd.strip().upper() == 'SELECT 1':
16+
return []
17+
# Record init commands
18+
dummy_cmds.append(cmd)
19+
return []
20+
21+
def fake_connect(self, *args, **kwargs):
22+
self.pgexecute = DummyExec()
23+
24+
monkeypatch.setattr(PGCli, "connect", fake_connect)
25+
return dummy_cmds
26+
27+
def test_init_command_option(dummy_exec):
28+
"Test that --init-command triggers execution of the command."
29+
runner = CliRunner()
30+
# Use a custom init command and --ping to exit the CLI after init commands
31+
result = runner.invoke(cli, ["--init-command", "SELECT foo", "--ping", "db", "user"])
32+
assert result.exit_code == 0
33+
# Should print the init command
34+
assert "Running init commands: SELECT foo" in result.output
35+
# Should exit via ping
36+
assert "PONG" in result.output
37+
# DummyExec should have recorded only the init command
38+
assert dummy_exec == ["SELECT foo"]
39+
40+
def test_init_commands_from_config(dummy_exec, tmp_path):
41+
"""
42+
Test that init commands defined in the config file are executed on startup.
43+
"""
44+
# Create a temporary config file with init-commands
45+
config_file = tmp_path / "pgclirc_test"
46+
config_file.write_text(
47+
"[init-commands]\n"
48+
"first = SELECT foo;\n"
49+
"second = SELECT bar;\n"
50+
)
51+
52+
runner = CliRunner()
53+
# Use --ping to exit the CLI after init commands
54+
result = runner.invoke(cli, ["--pgclirc", str(config_file), "--ping", "testdb", "testuser"])
55+
assert result.exit_code == 0
56+
# Should print both init commands in order (note trailing semicolons cause double ';;')
57+
assert "Running init commands: SELECT foo;; SELECT bar;" in result.output
58+
# DummyExec should have recorded both commands
59+
assert dummy_exec == ["SELECT foo;", "SELECT bar;"]
60+
61+
def test_init_commands_option_and_config(dummy_exec, tmp_path):
62+
"""
63+
Test that CLI-provided init command is appended after config-defined commands.
64+
"""
65+
# Create a temporary config file with init-commands
66+
config_file = tmp_path / "pgclirc_test"
67+
config_file.write_text(
68+
"[init-commands]\n"
69+
"first = SELECT foo;\n"
70+
)
71+
72+
runner = CliRunner()
73+
# Use --ping to exit the CLI after init commands
74+
result = runner.invoke(
75+
cli,
76+
["--pgclirc", str(config_file), "--init-command", "SELECT baz;", "--ping", "testdb", "testuser"]
77+
)
78+
assert result.exit_code == 0
79+
# Should print config command followed by CLI option (double ';' between commands)
80+
assert "Running init commands: SELECT foo;; SELECT baz;" in result.output
81+
# DummyExec should record both commands in order
82+
assert dummy_exec == ["SELECT foo;", "SELECT baz;"]

0 commit comments

Comments
 (0)