Newer
Older
import tempfile
import subprocess
import random
import os
import time
import requests
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@pytest.fixture
def temp():
"""Write data to a temporary file and return the handle
This is a fixture instead of a utility function so that
temporary files have a test-scoped lifetime
"""
handles = []
def fun(data):
handle = tempfile.NamedTemporaryFile(delete=False)
if type(data) is str:
data = data.encode("utf8")
handle.write(data)
handle.flush()
handles.append(handle)
return handle.name
yield fun
del handles # Useless but explicit
@pytest.fixture(scope="module")
def app(username, password):
"""Run an isolated application instance and return the URL"""
data = tempfile.TemporaryDirectory()
port = 5000 + random.randint(1, 999) # Port = 5XXX
url = f"http://localhost:{port}"
env = os.environ
env.update(FLASK_APP="hiboo", SQLALCHEMY_DATABASE_URI=f"sqlite:///{data.name}/hiboo.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()
del data
@pytest.fixture(scope="session")
def username():
"""Default username for tests"""
return "admin"
def password():
"""Default password for tests"""
return "admin"