"""Test enter""" import os import pytest @pytest.mark.parametrize( 'shell, success', [ ('delete', True), # if there is no shell variable, bash creates it ('', False), ('/usr/bin/env', True), ('noexec', False), ], ids=[ 'shell-missing', 'shell-empty', 'shell-env', 'shell-noexec', ]) @pytest.mark.usefixtures('ds1_copy') def test_enter(runner, yadm_cmd, paths, shell, success): """Enter tests""" env = os.environ.copy() if shell == 'delete': # remove shell if 'SHELL' in env: del env['SHELL'] elif shell == 'noexec': # specify a non-executable path noexec = paths.root.join('noexec') noexec.write('') noexec.chmod(0o664) env['SHELL'] = str(noexec) else: env['SHELL'] = shell run = runner(command=yadm_cmd('enter'), env=env) assert run.success == success prompt = f'yadm shell ({paths.repo})' if success: assert run.out.startswith('Entering yadm repo') assert run.out.rstrip().endswith('Leaving yadm repo') assert run.err == '' else: assert 'does not refer to an executable' in run.err if 'env' in shell: assert f'GIT_DIR={paths.repo}' in run.out assert f'GIT_WORK_TREE={paths.work}' in run.out assert f'PROMPT={prompt}' in run.out assert f'PS1={prompt}' in run.out @pytest.mark.parametrize( 'shell, opts, path', [ ('bash', '--norc', '\\w'), ('csh', '-f', '%~'), ('zsh', '-f', '%~'), ], ids=[ 'bash', 'csh', 'zsh', ]) @pytest.mark.parametrize( 'cmd', [False, 'cmd', 'cmd-bad-exit'], ids=['no-cmd', 'cmd', 'cmd-bad-exit']) @pytest.mark.parametrize( 'term', ['', 'dumb'], ids=['term-empty', 'term-dumb']) @pytest.mark.usefixtures('ds1_copy') def test_enter_shell_ops(runner, yadm_cmd, paths, shell, opts, path, cmd, term): """Enter tests for specific shell options""" change_exit = '\nfalse' if cmd == 'cmd-bad-exit' else '' # Create custom shell to detect options passed custom_shell = paths.root.join(shell) custom_shell.write( f'#!/bin/sh\necho OPTS=$*\necho PROMPT=$PROMPT{change_exit}' ) custom_shell.chmod(0o775) test_cmd = ['test1', 'test2', 'test3'] enter_cmd = ['enter'] if cmd: enter_cmd += test_cmd env = os.environ.copy() env['TERM'] = term env['SHELL'] = custom_shell if shell == 'zsh' and term == 'dumb': opts += ' --no-zle' run = runner(command=yadm_cmd(*enter_cmd), env=env) if cmd == 'cmd-bad-exit': assert run.failure else: assert run.success assert run.err == '' assert f'OPTS={opts}' in run.out assert f'PROMPT=yadm shell ({paths.repo}) {path} >' in run.out if cmd: assert '-c ' + ' '.join(test_cmd) in run.out assert 'Entering yadm repo' not in run.out assert 'Leaving yadm repo' not in run.out else: assert 'Entering yadm repo' in run.out assert 'Leaving yadm repo' in run.out