2018-11-24 01:58:57 +00:00
|
|
|
import sys
|
|
|
|
from contextlib import contextmanager
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
from io import StringIO
|
|
|
|
|
2019-07-23 05:54:24 +00:00
|
|
|
from nucypher.characters.control.emitters import StdoutEmitter
|
2019-02-12 00:18:26 +00:00
|
|
|
from nucypher.cli.config import NucypherClickConfig
|
2019-01-21 21:16:10 +00:00
|
|
|
from nucypher.cli.processes import UrsulaCommandProtocol
|
2018-11-24 01:58:57 +00:00
|
|
|
|
2019-07-23 05:48:09 +00:00
|
|
|
# Override environment variables
|
2018-11-24 01:58:57 +00:00
|
|
|
NucypherClickConfig.log_to_sentry = False
|
|
|
|
NucypherClickConfig.log_to_file = False
|
|
|
|
|
|
|
|
|
|
|
|
@contextmanager
|
|
|
|
def capture_output():
|
|
|
|
new_out, new_err = StringIO(), StringIO()
|
|
|
|
old_out, old_err = sys.stdout, sys.stderr
|
|
|
|
try:
|
|
|
|
sys.stdout, sys.stderr = new_out, new_err
|
|
|
|
yield sys.stdout, sys.stderr
|
|
|
|
finally:
|
|
|
|
sys.stdout, sys.stderr = old_out, old_err
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope='module')
|
|
|
|
def ursula(federated_ursulas):
|
|
|
|
ursula = federated_ursulas.pop()
|
|
|
|
return ursula
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture(scope='module')
|
|
|
|
def protocol(ursula):
|
2019-07-23 05:54:24 +00:00
|
|
|
emitter = StdoutEmitter()
|
|
|
|
protocol = UrsulaCommandProtocol(ursula=ursula, emitter=emitter)
|
2018-11-24 01:58:57 +00:00
|
|
|
return protocol
|
|
|
|
|
|
|
|
|
|
|
|
def test_ursula_command_protocol_creation(ursula):
|
|
|
|
|
2019-07-23 05:54:24 +00:00
|
|
|
emitter = StdoutEmitter()
|
|
|
|
protocol = UrsulaCommandProtocol(ursula=ursula, emitter=emitter)
|
2018-11-24 01:58:57 +00:00
|
|
|
|
|
|
|
assert protocol.ursula == ursula
|
|
|
|
assert b'Ursula' in protocol.prompt
|
|
|
|
|
|
|
|
|
|
|
|
def test_ursula_command_help(protocol, ursula):
|
|
|
|
|
2018-11-24 05:11:14 +00:00
|
|
|
class FakeTransport:
|
|
|
|
"""This is a transport"""
|
|
|
|
|
|
|
|
mock_output = b''
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def write(data: bytes):
|
|
|
|
FakeTransport.mock_output += data
|
|
|
|
|
|
|
|
protocol.transport = FakeTransport
|
|
|
|
|
2018-11-24 01:58:57 +00:00
|
|
|
with capture_output() as (out, err):
|
2018-11-24 05:11:14 +00:00
|
|
|
protocol.lineReceived(line=b'bananas')
|
|
|
|
|
|
|
|
# Ensure all commands are in the help text
|
2018-11-24 01:58:57 +00:00
|
|
|
result = out.getvalue()
|
2018-11-24 05:11:14 +00:00
|
|
|
for command in protocol.commands:
|
|
|
|
assert command in result, '{} is missing from help text'.format(command)
|
|
|
|
|
|
|
|
# Blank lines are OK!
|
|
|
|
with capture_output() as (out, err):
|
|
|
|
protocol.lineReceived(line=b'')
|
|
|
|
assert protocol.prompt in FakeTransport.mock_output
|
2018-11-24 01:58:57 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_ursula_command_status(protocol, ursula):
|
|
|
|
|
|
|
|
with capture_output() as (out, err):
|
|
|
|
protocol.paintStatus()
|
|
|
|
result = out.getvalue()
|
2019-06-04 15:46:26 +00:00
|
|
|
assert ursula.checksum_address in result
|
2018-11-24 01:58:57 +00:00
|
|
|
assert '...' in result
|
|
|
|
assert 'Known Nodes' in result
|
|
|
|
|
|
|
|
|
|
|
|
def test_ursula_command_known_nodes(protocol, ursula):
|
|
|
|
|
|
|
|
with capture_output() as (out, err):
|
|
|
|
protocol.paintKnownNodes()
|
|
|
|
result = out.getvalue()
|
|
|
|
assert 'Known Nodes' in result
|
2019-06-04 15:46:26 +00:00
|
|
|
assert ursula.checksum_address not in result
|