Skip to content

Added unit tests for persistent history file #468

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 12, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions tests/test_cmd2.py
Original file line number Diff line number Diff line change
Expand Up @@ -1825,3 +1825,74 @@ def test_onecmd_raw_str_quit(base_app):
assert stop
assert out == ''


@pytest.fixture(scope="session")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added this fixture to help ensure that the history file always gets deleted no matter what

def hist_file():
fd, filename = tempfile.mkstemp(prefix='hist_file', suffix='.txt')
os.close(fd)
yield filename
# teardown code
try:
os.remove(filename)
except FileNotFoundError:
pass

def test_existing_history_file(hist_file, capsys):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for adding some unit tests of this feature!

import atexit
import readline

# Create the history file before making cmd2 app
with open(hist_file, 'w'):
pass

# Create a new cmd2 app
app = cmd2.Cmd(persistent_history_file=hist_file)
out, err = capsys.readouterr()

# Make sure there were no errors
assert err == ''

# Unregister the call to write_history_file that cmd2 did
atexit.unregister(readline.write_history_file)

# Remove created history file
os.remove(hist_file)


def test_new_history_file(hist_file, capsys):
import atexit
import readline

# Remove any existing history file
try:
os.remove(hist_file)
except OSError:
pass

# Create a new cmd2 app
app = cmd2.Cmd(persistent_history_file=hist_file)
out, err = capsys.readouterr()

# Make sure there were no errors
assert err == ''

# Unregister the call to write_history_file that cmd2 did
atexit.unregister(readline.write_history_file)

# Remove created history file
os.remove(hist_file)

def test_bad_history_file_path(capsys, request):
# Use a directory path as the history file
test_dir = os.path.dirname(request.module.__file__)

# Create a new cmd2 app
app = cmd2.Cmd(persistent_history_file=test_dir)
out, err = capsys.readouterr()

if sys.platform == 'win32':
# pyreadline masks the read exception. Therefore the bad path error occurs when trying to write the file.
assert 'readline cannot write' in err
else:
# GNU readline raises an exception upon trying to read the directory as a file
assert 'readline cannot read' in err