import os
import pytest
import tarfile
import py.path
from faker import Faker
from saltcontainers.factories import ContainerFactory


def pytest_addoption(parser):
    parser.addoption('--salt-repo')


def upload(container, source, destination, tmpdir_factory):
    arch = tmpdir_factory.mktemp("archive") / 'arch.tar'
    with tarfile.open(arch.strpath, mode='w') as archive:
        for item in py.path.local(source).listdir():
            archive.add(
                item.strpath,
                arcname=item.strpath.replace(source, '.'))

    container.run('mkdir -p {0}'.format(destination))
    with arch.open('rb') as f:
        container['config']['docker_client'].put_archive(
            container['config']['name'], destination, f.read())


@pytest.fixture(scope="module")
def container(request, docker_client, tmpdir_factory):
    fake = Faker()
    obj = ContainerFactory(
        config__name='proxy_container_{0}_{1}_{2}'.format(fake.word(), fake.word(), os.environ.get('ST_JOB_ID', '')),  # pylint: disable=no-member
        config__docker_client=docker_client,
        config__image=request.config.getini('IMAGE'),
        config__environment={
            'ROOT_MOUNTPOINT': '/salt/src',
            'TOASTER_MOUNTPOINT': '/salt-toaster',
            'SALT_TESTS': '/salt/src/salt-2015.8.7/tests',
            'VERSION': 'sles12sp1',
        },
        config__salt_config=None,
        config__host_config=None
    )
    upload(obj, request.config.rootdir.parts()[-2].strpath, '/salt-toaster', tmpdir_factory)
    request.addfinalizer(obj.remove)
    return obj


def test_unit(container):
    stream = container.run(
        'make -f /root/Makefile -C /salt-toaster run_salt_unit_tests',
        stream=True)
    for item in stream:
        print(item),


def test_integration(container):
    stream = container.run(
        'make -f /root/Makefile -C /salt-toaster run_salt_integration_tests',
        stream=True)
    for item in stream:
        print(item),