copier/tests/test_prompt.py
2017-03-01 15:50:09 +11:00

128 lines
3.4 KiB
Python

from voodoo import prompt, prompt_bool, prompt_int
def test_prompt(stdin, capsys):
"""Test basic prompt functionality"""
question = 'What is your name?'
name = 'Inigo Montoya'
stdin.append(name + '\n')
response = prompt(question)
stdout, _ = capsys.readouterr()
assert response == name
assert stdout == question + ' '
def test_prompt_no_response(stdin, capsys):
"""Prompts with no response should ask again"""
question = 'What is your name?'
name = 'Inigo Montoya'
stdin.append('\n' + name + '\n')
response = prompt(question)
stdout, _ = capsys.readouterr()
assert response == name
assert stdout == (question + ' ') * 2
def test_prompt_default_no_input(stdin, capsys):
question = 'What is your name?'
default = 'The Nameless One'
stdin.append('\n')
response = prompt(question, default=default)
out, _ = capsys.readouterr()
assert response == default
assert out == '{} [{}] '.format(question, default)
def test_prompt_default_overridden(stdin, capsys):
question = 'What is your name?'
default = 'The Nameless One'
name = 'Buttercup'
stdin.append(name + '\n')
response = prompt(question, default=default)
out, _ = capsys.readouterr()
assert response == name
assert out == '{} [{}] '.format(question, default)
def test_prompt_error_message(stdin, capsys):
question = 'Is this awesome?'
error = 'You know that is not correct'
def validator(value):
if value != 'yes':
raise ValueError(error)
return True
stdin.append('no\n')
stdin.append('yes\n')
response = prompt(question, validator=validator)
out, _ = capsys.readouterr()
print(out)
assert response is True
assert out == '{0} {1}\n{0} '.format(question, error)
def test_prompt_bool(stdin, capsys):
question = 'Are you sure?'
stdin.append('yes\n')
response = prompt_bool(question)
stdout, _ = capsys.readouterr()
assert response is True
assert stdout == '{} [n] '.format(question)
def test_prompt_bool_false(stdin, capsys):
question = 'Are you sure?'
stdin.append('n\n')
response = prompt_bool(question)
stdout, _ = capsys.readouterr()
assert response is False
assert stdout == '{} [n] '.format(question)
def test_prompt_bool_default(stdin, capsys):
question = 'Are you sure?'
stdin.append('\n')
response = prompt_bool(question)
stdout, _ = capsys.readouterr()
assert response is False
assert stdout == '{} [n] '.format(question)
def test_prompt_int(stdin, capsys):
question = 'Give me a number'
stdin.append('10\n')
response = prompt_int(question)
stdout, _ = capsys.readouterr()
assert response is 10
assert stdout == '{} '.format(question)
def test_prompt_int_range(stdin, capsys):
question = 'Give me a number'
stdin.append('1\n100\n10\n')
response = prompt_int(question, min_value=5, max_value=50)
stdout, _ = capsys.readouterr()
assert response is 10
assert stdout == '{0} {1}\n{0} {2}\n{0} '.format(
question,
'Value must be equal to or greater than 5',
'Value must be equal to or lower than 50')
def test_prompt_int_invalid(stdin, capsys):
question = 'Give me a number'
stdin.append('abc\n10\n')
response = prompt_int(question)
stdout, _ = capsys.readouterr()
assert response is 10
assert stdout == '{0} {1}\n{0} '.format(question, 'Enter a whole number')