1
0
mirror of https://github.com/nvbn/thefuck.git synced 2025-01-18 12:06:04 +00:00

#N/A Add docker-based functional tests

This commit is contained in:
nvbn 2015-07-24 03:56:21 +03:00
parent b15bc8c423
commit 7906025cc6
6 changed files with 164 additions and 1 deletions

View File

@ -292,11 +292,17 @@ pip install -r requirements.txt
python setup.py develop
```
Run tests:
Run unit tests:
```bash
py.test
```
Run unit and functional tests (requires docker):
```bash
FUNCTIONAL=true py.test
```
## License MIT
Project License can be found [here](LICENSE.md).

View File

@ -3,3 +3,4 @@ mock
pytest-mock
wheel
setuptools>=17.1
pexpect

View File

View File

@ -0,0 +1,49 @@
import pytest
from tests.functional.utils import build_container, spawn, run, read_until, \
root, functional
containers = [('thefuck/ubuntu-python3-bash', '''
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -yy python3 python3-pip python3-dev
RUN pip3 install -U setuptools
RUN ln -s /usr/bin/pip3 /usr/bin/pip
RUN echo "PS1='$ '" > /root/.bashrc
CMD ["/bin/bash"]
'''),
('thefuck/ubuntu-python2-bash', '''
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -yy python python-pip python-dev
RUN pip2 install -U pip setuptools
RUN echo "PS1='$ '" > /root/.bashrc
CMD ["/bin/bash"]
''')]
@functional
@pytest.mark.parametrize('tag, dockerfile', containers)
def test_with_confirmation(tag, dockerfile):
build_container(tag, dockerfile)
with spawn(tag, '{}:/src'.format(root),
['cd /src', 'pip install .', 'eval $(thefuck-alias)']) as proc:
run(proc, 'ehco test')
proc.sendline('fuck')
read_until(proc, '[')
proc.send('\n')
out = read_until(proc)
assert out.split('\n')[-2] == 'test\r\r'
@functional
@pytest.mark.parametrize('tag, dockerfile', containers)
def test_without_confirmation(tag, dockerfile):
build_container(tag, dockerfile)
with spawn(tag, '{}:/src'.format(root),
['cd /src', 'pip install .',
'export THEFUCK_REQUIRE_CONFIRMATION=false',
'eval $(thefuck-alias)']) as proc:
run(proc, 'ehco test')
run(proc, 'fuck')
out = read_until(proc)
assert out.split('\n')[-2] == 'test\r\r'

View File

@ -0,0 +1,50 @@
import pytest
from tests.functional.utils import build_container, spawn, run, read_until, \
root, functional
containers = [('thefuck/ubuntu-python3-zsh', '''
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -yy python3 python3-pip python3-dev zsh
RUN pip3 install -U setuptools
RUN ln -s /usr/bin/pip3 /usr/bin/pip
RUN echo "PS1='\\n$ '" > /root/.zshrc
CMD ["/bin/zsh"]
'''),
('thefuck/ubuntu-python2-zsh', '''
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -yy python python-pip python-dev zsh
RUN pip2 install -U pip setuptools
RUN echo "PS1='\\n$ '" > /root/.zshrc
CMD ["/bin/zsh"]
''')]
@functional
@pytest.mark.parametrize('tag, dockerfile', containers)
def test_with_confirmation(tag, dockerfile):
build_container(tag, dockerfile)
with spawn(tag, '{}:/src'.format(root),
['cd /src', 'pip install .', 'eval $(thefuck-alias)']) as proc:
run(proc, 'ehco "\ntest"')
proc.sendline('fuck')
read_until(proc, '[')
proc.send('\n')
read_until(proc)
out = read_until(proc)
assert out.split('\n')[-3] == 'test\r\r'
@functional
@pytest.mark.parametrize('tag, dockerfile', containers)
def test_without_confirmation(tag, dockerfile):
build_container(tag, dockerfile)
with spawn(tag, '{}:/src'.format(root),
['cd /src', 'pip install .',
'export THEFUCK_REQUIRE_CONFIRMATION=false',
'eval $(thefuck-alias)']) as proc:
run(proc, 'ehco "\ntest"')
run(proc, 'fuck')
out = read_until(proc)
assert out.split('\n')[-3] == 'test\r\r'

57
tests/functional/utils.py Normal file
View File

@ -0,0 +1,57 @@
import sys
import os
import pytest
from contextlib import contextmanager
import pexpect
import subprocess
import shutil
from tempfile import mkdtemp
from pathlib import Path
root = str(Path(__file__).parent.parent.parent.resolve())
def build_container(tag, dockerfile):
tmpdir = mkdtemp()
with Path(tmpdir).joinpath('Dockerfile').open('w') as file:
file.write(dockerfile)
if subprocess.call(['docker', 'build', '--tag={}'.format(tag), tmpdir]) != 0:
raise Exception("Can't build container")
shutil.rmtree(tmpdir)
def read_until(proc, string='\n$ '):
text = ''
while True:
text += proc.read(1)
sys.stdout.write(text[-1])
sys.stdout.flush()
if text.endswith(string):
return text
def run(proc, cmd):
proc.sendline(cmd)
return read_until(proc)
@contextmanager
def spawn(tag, volume, prepare=None):
if prepare is None:
prepare = []
proc = pexpect.spawnu(
'docker run --volume {} --tty=true --interactive=true {}'.format(
volume, tag))
try:
for line in prepare:
run(proc, line)
yield proc
finally:
proc.terminate()
functional = pytest.mark.skipif(
not os.environ.get('FUNCTIONAL'),
reason='Functional tests are disabled by default.')