"""Offline checks for the experimental ChatGPT Desktop dictation probe."""

import importlib.util
import json
import tempfile
import unittest
from pathlib import Path
from unittest.mock import patch


SCRIPT = Path(__file__).resolve().parent / "chatgpt-dictation-file.py"
SPEC = importlib.util.spec_from_file_location("chatgpt_dictation_file", SCRIPT)
PROBE = importlib.util.module_from_spec(SPEC)
SPEC.loader.exec_module(PROBE)


class DictationProbeTests(unittest.TestCase):
    def test_requires_chatgpt_login(self):
        with tempfile.TemporaryDirectory() as directory:
            auth_file = Path(directory) / "auth.json"
            auth_file.write_text(json.dumps({"auth_mode": "apikey", "tokens": {"access_token": "secret"}}))
            with self.assertRaisesRegex(ValueError, "not logged in with ChatGPT"):
                PROBE.read_chatgpt_auth(auth_file)

    def test_request_contains_flac_and_keeps_token_out_of_url(self):
        with tempfile.TemporaryDirectory() as directory:
            audio_file = Path(directory) / "raven.flac"
            audio_file.write_bytes(b"FLAC-TEST")
            with patch.object(PROBE.secrets, "token_hex", return_value="test"):
                request = PROBE.build_request(audio_file, "secret", "account", "ru")
            self.assertEqual(request.full_url, PROBE.ENDPOINT)
            self.assertNotIn("secret", request.full_url)
            self.assertEqual(request.get_header("Authorization"), "Bearer secret")
            self.assertEqual(request.get_header("Chatgpt-account-id"), "account")
            self.assertEqual(request.get_header("User-agent"), PROBE.DESKTOP_USER_AGENT)
            self.assertIn(b"FLAC-TEST", request.data)
            self.assertIn(b"Content-Type: audio/flac", request.data)
            self.assertIn(b'name="language"\r\n\r\nru', request.data)

    def test_redirect_is_never_followed_with_bearer(self):
        self.assertIsNone(PROBE.NoRedirect().redirect_request(None, None, 302, "", {}, "https://other"))


if __name__ == "__main__":
    unittest.main()
