Source code for cli2.test
import copy
import os
import re
import subprocess
REWRITE = os.getenv('FIXTURE_REWRITE') or os.getenv('TEST_REWRITE')
[docs]def autotest(path, cmd, ignore=None, env=None):
"""
The autowriting test pattern, minimal for testing cli2 scripts.
Example::
from cli2.test import autotest
autotest(
'tests/djcli_save_user.txt',
'djcli save auth.User username="test"',
)
"""
environ = copy.copy(os.environ)
if env:
for key, value in env.items():
environ[key] = value
environ['FORCE_TERMSIZE'] = '1'
environ['PATH'] = ':'.join([
environ.get('HOME', '') + '/.local/bin',
environ.get('PATH', '')
])
proc = subprocess.run(
cmd,
shell=True,
capture_output=True,
env=environ,
)
fixture = '\n'.join([
'command: ' + cmd,
'retcode: ' + str(proc.returncode),
'stdout:',
proc.stdout.decode('utf8'),
])
if proc.stderr:
fixture += '\n'.join([
'stderr:',
proc.stderr.decode('utf8'),
])
for r in ignore or []:
fixture = re.compile(r).sub('redacted', fixture)
exists = os.path.exists(path)
if REWRITE and exists:
os.unlink(path)
exists = False
if not exists:
# dirname = '/'.join(path.split('/')[:-1])
dirname = os.path.dirname(path)
if not os.path.exists(dirname):
os.makedirs(dirname)
with open(path, 'w+') as f:
f.write(fixture)
if REWRITE:
return
raise type('FixtureCreated', (Exception,), {})(
f'''
{path} was not in workdir and was created with:
{fixture}
'''.strip(),
)
diff_cmd = 'diff -U 1 - "%s" | sed "1,2 d"' % path
proc = subprocess.Popen(
diff_cmd,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True
)
diff_out, diff_err = proc.communicate(input=fixture.encode('utf8'))
if diff_out:
raise type(f'''
DiffFound
- {cmd}
+ {path}
'''.strip(), (Exception,), {})('\n' + diff_out.decode('utf8'))
class Outfile:
def __init__(self):
self.out = ''
def write(self, content):
self.out += content
def flush(self):
pass
def __contains__(self, value):
return value in self.out
def __repr__(self):
return self.out
def reset(self):
self.__init__()