"""
Tests for Stripe live-mode safety checks.

Covers the helpers added in `services/pricing_config.py`:
  - stripe_mode()           : detect 'live' / 'test' / 'unknown'
  - is_test_mode_in_production() : True if ENV=production but sk_test_…

These are pure functions on env vars, so they don't need any
database or HTTP setup.
"""
import os
import importlib


def _reload_pricing_config():
    """Reload pricing_config with the current os.environ (no cache)."""
    import services.pricing_config as pc
    importlib.reload(pc)
    return pc


class TestStripeMode:
    """stripe_mode() must return the correct value based on key prefix."""

    def setup_method(self):
        self._saved_env = os.environ.copy()

    def teardown_method(self):
        os.environ.clear()
        os.environ.update(self._saved_env)

    def test_live_key_returns_live(self):
        os.environ["STRIPE_SECRET_KEY"] = "sk_live_abc123XYZ"
        pc = _reload_pricing_config()
        assert pc.stripe_mode() == "live"

    def test_test_key_returns_test(self):
        os.environ["STRIPE_SECRET_KEY"] = "sk_test_abc123XYZ"
        pc = _reload_pricing_config()
        assert pc.stripe_mode() == "test"

    def test_missing_key_returns_unknown(self):
        os.environ.pop("STRIPE_SECRET_KEY", None)
        pc = _reload_pricing_config()
        assert pc.stripe_mode() == "unknown"

    def test_empty_key_returns_unknown(self):
        os.environ["STRIPE_SECRET_KEY"] = ""
        pc = _reload_pricing_config()
        assert pc.stripe_mode() == "unknown"

    def test_garbage_key_returns_unknown(self):
        os.environ["STRIPE_SECRET_KEY"] = "totally-not-a-stripe-key"
        pc = _reload_pricing_config()
        assert pc.stripe_mode() == "unknown"

    def test_key_with_whitespace_is_trimmed(self):
        os.environ["STRIPE_SECRET_KEY"] = "  sk_live_abc123XYZ  "
        pc = _reload_pricing_config()
        assert pc.stripe_mode() == "live"


class TestIsTestModeInProduction:
    """is_test_mode_in_production() must catch the dangerous misconfig."""

    def setup_method(self):
        self._saved_env = os.environ.copy()

    def teardown_method(self):
        os.environ.clear()
        os.environ.update(self._saved_env)

    def test_test_key_in_prod_returns_true(self):
        os.environ["ENV"] = "production"
        os.environ["STRIPE_SECRET_KEY"] = "sk_test_xxx"
        pc = _reload_pricing_config()
        assert pc.is_test_mode_in_production() is True

    def test_live_key_in_prod_returns_false(self):
        os.environ["ENV"] = "production"
        os.environ["STRIPE_SECRET_KEY"] = "sk_live_xxx"
        pc = _reload_pricing_config()
        assert pc.is_test_mode_in_production() is False

    def test_test_key_in_dev_returns_false(self):
        os.environ["ENV"] = "development"
        os.environ["STRIPE_SECRET_KEY"] = "sk_test_xxx"
        pc = _reload_pricing_config()
        assert pc.is_test_mode_in_production() is False

    def test_no_key_in_prod_returns_false(self):
        os.environ["ENV"] = "production"
        os.environ.pop("STRIPE_SECRET_KEY", None)
        pc = _reload_pricing_config()
        assert pc.is_test_mode_in_production() is False

    def test_environment_alias_works(self):
        """ENVIRONMENT env var should also work (not just ENV)."""
        os.environ.pop("ENV", None)
        os.environ["ENVIRONMENT"] = "production"
        os.environ["STRIPE_SECRET_KEY"] = "sk_test_xxx"
        pc = _reload_pricing_config()
        assert pc.is_test_mode_in_production() is True
