"""The prebuild check shares upload gating and preserves the release dependency."""
import io
from contextlib import redirect_stdout
from pathlib import Path
import unittest
from unittest import mock

import crashlytics_symbols as symbols


class PrebuildTests(unittest.TestCase):
    def test_prepare_requires_no_symbols_but_propagates_bootstrap_failure(self):
        for result in (0, 1):
            with self.subTest(result=result), redirect_stdout(io.StringIO()):
                run = mock.Mock(return_value=result)
                status = symbols.main(["--prepare-only"], {"FIREBASE_APP_ID": "1:123:android:abc"}, run)
                self.assertEqual(status, result)
                run.assert_called_once_with([])

    def test_no_android_app_skips_bootstrap_without_touching_dependencies(self):
        for value in ("", "1:123:ios:abc"):
            with self.subTest(value=value), redirect_stdout(io.StringIO()):
                run = mock.Mock()
                self.assertEqual(symbols.main(["--prepare-only"], {"FIREBASE_APP_ID": value}, run), 0)
                run.assert_not_called()

    def test_bootstrap_precedes_flutter_compilation_and_keeps_upload_after_retention(self):
        action = (Path(__file__).resolve().parents[1] / "action.yml").read_text()
        self.assertLess(action.index("- name: Prepare Crashlytics symbol tools"),
                        action.index("- name: Get Flutter dependencies"))
        self.assertLess(action.index("- name: Retain Dart symbol files"),
                        action.index("- name: Upload Dart symbols to Crashlytics"))
        prepare = action.split("- name: Prepare Crashlytics symbol tools", 1)[1].split("- name:", 1)[0]
        self.assertIn("project_kind == 'flutter'", prepare)
        self.assertIn("FIREBASE_APP_ID: ${{ inputs.firebase-app-id }}", prepare)
        self.assertIn("--prepare-only", prepare)


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