59 lines
2.9 KiB
Python
59 lines
2.9 KiB
Python
import json
|
|
import os
|
|
from pathlib import Path
|
|
import platform
|
|
import subprocess
|
|
import tempfile
|
|
import unittest
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
DEPLOY = ROOT / 'scripts/deploy-site.sh'
|
|
|
|
|
|
class DeploymentTests(unittest.TestCase):
|
|
def test_manifest_only_lists_rendered_photos(self):
|
|
with tempfile.TemporaryDirectory() as folder:
|
|
root = Path(folder)
|
|
(root / '_site/art').mkdir(parents=True)
|
|
(root / '_site/snippets').mkdir(parents=True)
|
|
job = 'a' * 64
|
|
(root / '_site/art/index.html').write_text(f'<div id="photo-{job}"></div>')
|
|
(root / '_site/snippets/index.html').write_text(f'<div id="snippet-{job}"></div>')
|
|
subprocess.run(['python3', str(ROOT / 'scripts/photo-manifest.py')], cwd=root,
|
|
env=dict(os.environ, GITHUB_SHA='b' * 40), check=True)
|
|
self.assertEqual(json.loads((root / '_site/photo-publication.json').read_text()),
|
|
{'commit': 'b' * 40, 'photos': [job], 'snippets': [job], 'posts': []})
|
|
|
|
@unittest.skipUnless(platform.system() == 'Linux', 'Production activation uses GNU mv and flock')
|
|
def test_activation_failure_and_stale_workflow(self):
|
|
activation = DEPLOY.read_text().split("<<'REMOTE'\n", 1)[1].rsplit('\nREMOTE', 1)[0]
|
|
with tempfile.TemporaryDirectory() as folder:
|
|
root = Path(folder)
|
|
(root / 'releases').mkdir()
|
|
|
|
def activate(number, complete=True):
|
|
release = root / 'releases' / str(number)
|
|
(release / 'art').mkdir(parents=True)
|
|
(release / 'art/index.html').write_text(str(number))
|
|
if complete:
|
|
(release / 'photo-publication.json').write_text('{"photos":[]}')
|
|
return subprocess.run(['bash', '-s', '--', str(root), str(release), str(number)],
|
|
input=activation, text=True, capture_output=True)
|
|
|
|
self.assertEqual(activate(2).returncode, 0)
|
|
self.assertEqual((root / 'current/art/index.html').read_text(), '2')
|
|
self.assertNotEqual(activate(3, complete=False).returncode, 0)
|
|
self.assertEqual((root / 'current/art/index.html').read_text(), '2')
|
|
self.assertEqual(activate(1).returncode, 0)
|
|
self.assertEqual((root / 'current/art/index.html').read_text(), '2')
|
|
self.assertEqual(activate(4).returncode, 0)
|
|
self.assertEqual((root / 'current/art/index.html').read_text(), '4')
|
|
self.assertEqual([p.name for p in (root / 'releases').iterdir()], ['4'])
|
|
(root / 'releases/6').mkdir() # A newer upload is still transferring.
|
|
self.assertEqual(activate(5).returncode, 0)
|
|
self.assertEqual(sorted(p.name for p in (root / 'releases').iterdir()), ['5', '6'])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|