Skip to content
Snippets Groups Projects
conftest.py 2.02 KiB
Newer Older
kaiyou's avatar
kaiyou committed
import pytest
import tempfile
import subprocess
import random
import os
import time
import requests
@pytest.fixture(scope="module")
def temp():
    """Write a temporary directory with module scope and offer
    to write files in it, with optional subpath
    #directory = tempfile.TemporaryDirectory()
    directory = tempfile.mkdtemp()
    def write_and_get_filename(data, path=None):
        if type(data) is str:
            data = data.encode("utf8")
        if path is None:
            path = str(random.randbytes(3).hex())
        filepath = os.path.join(directory, path)
        os.makedirs(os.path.dirname(filepath), 0o755, True)
        with open(filepath, "wb") as handle:
            handle.write(data)
        return filepath 
    return write_and_get_filename


@pytest.fixture(scope="module")
def app(username, password, temp):
    """Run an isolated application instance and return the URL"""
    port = 5000 + random.randint(1, 999)  # Port = 5XXX
    url = f"http://localhost:{port}"
    db = temp(b"", "hiboo.db")
    env = os.environ
    env.update(FLASK_APP="hiboo", SQLALCHEMY_DATABASE_URI=f"sqlite:///{db}")
    subprocess.run(["flask", "db", "upgrade"], env=env)
    subprocess.run(["flask", "user", "create", username, password], env=env)
    subprocess.run(["flask", "user", "promote", username], env=env)
    proc = subprocess.Popen(["flask", "run", "-p", str(port)], env=env)
    # Wait for the server to be ready
    for _ in range(30):
        try:
            assert requests.get(url).status_code == 200
        except Exception as e:
            print(e)
            time.sleep(1)
        else:
            yield url
            break
    proc.terminate()
    proc.wait()


@pytest.fixture(scope="session")
kaiyou's avatar
kaiyou committed
def username():
    """Default username for tests"""
    return "admin"


@pytest.fixture(scope="session")
kaiyou's avatar
kaiyou committed
def password():
    """Default password for tests"""
    return "admin"


@pytest.fixture
def service_name():
    """A randomly generated service name"""
    return "Test service " + random.randbytes(3).hex()