from pathlib import Path
import subprocess
import unittest


ROOT = Path(__file__).resolve().parents[1]


class UpdateRequestGuardTests(unittest.TestCase):
    def test_duplicate_and_concurrent_update_requests_are_serialized(self) -> None:
        completed = subprocess.run(
            [
                "php",
                str(ROOT / "tests" / "php" / "update_request_guard_test.php"),
            ],
            cwd=ROOT,
            check=False,
            capture_output=True,
            text=True,
        )
        self.assertEqual(
            0,
            completed.returncode,
            msg=completed.stdout + completed.stderr,
        )

    def test_update_endpoint_caches_every_terminal_response(self) -> None:
        endpoint = (ROOT / "api" / "private" / "update.php").read_text(
            encoding="utf-8"
        )
        self.assertIn("'result' => 'continue'", endpoint)
        self.assertIn("'result' => 'done'", endpoint)
        self.assertIn("'result' => 'stopped'", endpoint)
        self.assertGreaterEqual(endpoint.count("$request_guard->store("), 3)
        self.assertIn(
            'ErrorHandlerBee::isTrue(false, 11049, "Test Not Running"',
            endpoint,
        )


if __name__ == "__main__":
    unittest.main()
