def test_save_results(vcs): with vcs.temp_copy() as copy: with contextmanagers.chdir(copy.path): os.mkdir('dir') assert not os.system('touch a b c dir/a dir/b dir/c') save_results(vcs, 'signature1', copy.path, ['dir/***', 'a']) with contextmanagers.chdir(_get_results_directory(vcs, 'signature1')): assert os.path.exists('results/dir/a') assert os.path.exists('results/dir/b') assert os.path.exists('results/dir/c') assert os.path.exists('results/a') assert not os.path.exists('results/b') assert not os.path.exists('results/c') with open('patterns', 'r') as f: assert set(f.read().strip().split()) == set(['dir/***', 'a'])
def test_get_ignored_files(git, repo_path): with contextmanagers.chdir(repo_path): with open('.gitignore', 'w') as f: f.write('a\n') assert not os.system('mkdir a && touch a/1.txt a/2.txt') assert set(git.get_ignored_files()) == set( [os.path.join(repo_path, 'a/1.txt'), os.path.join(repo_path, 'a/2.txt')])
def test_sync_results(vcs): results_dir = _get_results_directory(vcs, 'signature1') os.makedirs(results_dir) with contextmanagers.chdir(results_dir): with open('patterns', 'w') as f: f.write('\n'.join(['dir/***', 'a'])) os.mkdir('results') with contextmanagers.chdir('results'): os.mkdir('dir') assert not os.system('touch a dir/a dir/b dir/c') with contextmanagers.chdir(vcs.path): assert not os.system('touch b c') with open('a', 'w') as f: f.write('testing') sync_results(vcs, 'signature1') with contextmanagers.chdir(vcs.path): assert os.path.exists('dir/a') assert os.path.exists('dir/b') assert os.path.exists('dir/c') assert os.path.exists('a') assert os.path.exists('b') assert os.path.exists('c') with open('a', 'r') as f: assert f.read() == ''
def test(ctx, staged_only, head_only): """Run tests. If a passing test run is found in the tests run history, then this does not run any tests. """ git = ctx.obj['vcs'] click.echo('Making a temporary copy of your project...', nl=False) with git.temp_copy() as copy: click.echo('Done.') if head_only: click.echo('Resetting to HEAD...', nl=False) copy.clear('HEAD') click.echo('Done.') elif staged_only: click.echo('Resetting to staged files...', nl=False) copy.remove_unstaged_files() click.echo('Done.') click.echo('Loading config file...', nl=False) try: config = load_user_config(copy) click.echo('Done.') except ConfigFormatError: click.echo("Invalid config") ctx.abort() except ConfigNotFoundError: click.echo("No config file") config = _default_config click.echo('Checking if tests were already run...', nl=False) new_signature = copy.get_signature() with locking.lock(git, locking.Lock.tests_history): in_committed = new_signature in get_committed_signatures(git) in_staged = new_signature in get_staged_signatures(git) if not in_committed and not in_staged: stage_signature(git, new_signature) if in_committed: click.echo('') click.echo(click.style('OK', bg='green', fg='black') + ' Tests already ran.') try: click.echo('Syncing test results...', nl=False) sync_results(git, new_signature) click.echo('Done') except ResultsNotFoundError: click.echo('No results to sync.') ctx.exit(exit_codes.SUCCESS) if in_staged: click.echo('') click.echo(click.style('In Progress', bg='yellow', fg='black') + ' Tests already running.') ctx.exit(exit_codes.ALREADY_RUNNING) click.echo('Done.') with contextmanagers.chdir(copy.path): all_passed = True for test in config['tests']: click.echo('Running test: {}'.format(test)) # ok to use shell=True, as the whole point of EasyCI is to run # arbitrary code ret = subprocess.call(test, shell=True) if ret == 0: click.secho('Passed', bg='green', fg='black') else: click.secho('Failed', bg='red', fg='black') all_passed = False with locking.lock(git, locking.Lock.tests_history): # collect results if len(config['collect_results']) > 0: click.echo('Collecting results...', nl=False) save_results(git, new_signature, copy.path, config['collect_results']) click.echo('Done') click.echo('Syncing test results...', nl=False) sync_results(git, new_signature) click.echo('Done') # save signature if not all_passed: unstage_signature(git, new_signature) ctx.exit(exit_codes.FAILURE) else: commit_signature(git, config, new_signature) ctx.exit(exit_codes.SUCCESS)
def temp_path(): with contextmanagers.temp_dir() as temp: with contextmanagers.chdir(temp): yield temp
def test_chdir(temp_dir): current = os.getcwd() with contextmanagers.chdir(temp_dir): assert os.path.realpath(os.getcwd()) == os.path.realpath(temp_dir) assert os.getcwd() == current
def test_path_is_ignored(git, repo_path): with contextmanagers.chdir(repo_path): with open('.gitignore', 'w') as f: f.write('a\n') assert git.path_is_ignored('a') assert not git.path_is_ignored('b')