Newer
Older
import pytest
import psutil
import requests
import subprocess
from xprocess import ProcessStarter
OUTPUT_PATH = os.path.join("../website", pelicanconf.OUTPUT_PATH)
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
57
58
59
60
def fetch(url, just_contents=True):
res = requests.get(f'http://localhost:{PORT}/{url}')
if just_contents:
return res.content.decode('utf-8')
return res
@pytest.fixture
def pelican_server(xprocess):
class Starter(ProcessStarter):
# startup pattern
pattern = f"^Done: Processed "
# command to start process
args = ['serve']
# ensure process is running and return its logfile
logfile = xprocess.ensure("pelican_server", Starter)
conn = PORT
yield conn
# clean up whole process tree afterwards
xprocess.getinfo("pelican_server").terminate()
site_rebuilt = False
@pytest.fixture
def rebuild_site():
"""We only want to rebuid the site once and only if bin/serve isn't already
automaritcally rebuilding it."""
# Use a global to keep state between runs because I couldn't figure out how
# to decorate a closure as a pytest.fixture.
global site_rebuilt
if not site_rebuilt:
# Check if automatic rebuilder already running
for pid in psutil.pids():
p = psutil.Process(pid)
if p.name() == "pelican" and p.cmdline()[-1] == "PELICAN_BINSERVE=true":
site_rebuilt = True
return True
# Do the rebuild by running our build script
out = subprocess.check_output("build").decode("utf-8")
print(out)
site_rebuilt = True