#!/usr/bin/env python3
import importlib.util
import tempfile
import unittest
import zipfile
from pathlib import Path
from unittest.mock import patch
SCRIPT = Path(__file__).resolve().parents[1] / "scripts" / "export_pptx.py"
SPEC = importlib.util.spec_from_file_location("export_pptx", SCRIPT)
MODULE = importlib.util.module_from_spec(SPEC)
assert SPEC and SPEC.loader
SPEC.loader.exec_module(MODULE)
class ExportPptxTests(unittest.TestCase):
def test_parse_agent_browser_version(self):
self.assertEqual(MODULE.parse_version("agent-browser 0.33.2"), (0, 33, 2))
self.assertEqual(MODULE.parse_version("v1.4.0-beta.1"), (1, 4, 0))
@patch.object(MODULE.subprocess, "run")
@patch.object(MODULE.shutil, "which")
def test_old_agent_browser_is_upgraded(self, which, run):
which.side_effect = ["/bin/agent-browser", "/bin/npm", "/bin/agent-browser"]
run.side_effect = [
MODULE.subprocess.CompletedProcess([], 0, "agent-browser 0.17.1\n"),
MODULE.subprocess.CompletedProcess([], 0, "changed 1 package\n"),
MODULE.subprocess.CompletedProcess([], 0, "agent-browser 0.33.2\n"),
]
self.assertEqual(MODULE.ensure_agent_browser(), "/bin/agent-browser")
self.assertEqual(run.call_args_list[1].args[0], [
"/bin/npm", "install", "-g", "agent-browser@latest"
])
def test_fade_is_inserted_before_timing(self):
source = (
b''
b''
b''
)
result_bytes = MODULE.replace_transition(source, "fade")
result = result_bytes.decode("utf-8")
self.assertIn("", result)
self.assertGreater(result.index("'
b''
)
faded = MODULE.replace_transition(source, "fade").decode("utf-8")
self.assertNotIn("p:wipe", faded)
self.assertEqual(faded.count("'
b''
b''
)
result = MODULE.replace_transition(source, "fade")
MODULE.validate_transition_order(result, "fade")
self.assertEqual(MODULE.root_child_names(result), [
"cSld", "clrMapOvr", "transition", "extLst"
])
def test_patch_transitions_preserves_a_valid_zip(self):
with tempfile.TemporaryDirectory() as name:
deck = Path(name) / "test.pptx"
with zipfile.ZipFile(deck, "w", zipfile.ZIP_DEFLATED) as archive:
archive.writestr(
"[Content_Types].xml",
''
'',
)
archive.writestr("ppt/presentation.xml", "")
archive.writestr(
"ppt/slides/slide1.xml",
'',
)
self.assertEqual(MODULE.patch_transitions(deck, "fade"), 1)
with zipfile.ZipFile(deck) as archive:
self.assertIsNone(archive.testzip())
slide = archive.read("ppt/slides/slide1.xml")
self.assertIn(b"", slide)
if __name__ == "__main__":
unittest.main()