Cover all permission functions (59 tests), tree validation logic (25 tests), settings manager parse/infer helpers (21 tests), and Stripe webhook stubs (8 tests). Key modules now at 100% coverage: permissions.py, tree_validation.py, stripe_handlers.py. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
106 lines
3.6 KiB
Python
106 lines
3.6 KiB
Python
"""Unit tests for SettingsManager parse/infer helpers and Stripe webhook stubs.
|
|
|
|
Tests the pure logic in SettingsManager._parse_value and _infer_type without DB.
|
|
Also covers the Stripe webhook handler stubs for completeness.
|
|
"""
|
|
|
|
import pytest
|
|
from unittest.mock import AsyncMock
|
|
|
|
from app.core.settings_manager import SettingsManager
|
|
from app.core.stripe_handlers import (
|
|
WEBHOOK_HANDLERS,
|
|
handle_checkout_completed,
|
|
handle_invoice_paid,
|
|
handle_invoice_payment_failed,
|
|
handle_subscription_deleted,
|
|
handle_subscription_updated,
|
|
)
|
|
|
|
|
|
class TestSettingsManagerParseValue:
|
|
|
|
def test_parse_string(self):
|
|
assert SettingsManager._parse_value("hello", "string") == "hello"
|
|
|
|
def test_parse_boolean_true(self):
|
|
assert SettingsManager._parse_value("true", "boolean") is True
|
|
|
|
def test_parse_boolean_True_capitalized(self):
|
|
assert SettingsManager._parse_value("True", "boolean") is True
|
|
|
|
def test_parse_boolean_false(self):
|
|
assert SettingsManager._parse_value("false", "boolean") is False
|
|
|
|
def test_parse_integer(self):
|
|
assert SettingsManager._parse_value("42", "integer") == 42
|
|
|
|
def test_parse_json_dict(self):
|
|
result = SettingsManager._parse_value('{"key": "val"}', "json")
|
|
assert result == {"key": "val"}
|
|
|
|
def test_parse_json_list(self):
|
|
result = SettingsManager._parse_value('[1, 2, 3]', "json")
|
|
assert result == [1, 2, 3]
|
|
|
|
def test_parse_none_returns_none(self):
|
|
assert SettingsManager._parse_value(None, "string") is None
|
|
|
|
def test_parse_unknown_type_returns_string(self):
|
|
assert SettingsManager._parse_value("val", "unknown") == "val"
|
|
|
|
|
|
class TestSettingsManagerInferType:
|
|
|
|
def test_infer_boolean(self):
|
|
assert SettingsManager._infer_type(True) == "boolean"
|
|
assert SettingsManager._infer_type(False) == "boolean"
|
|
|
|
def test_infer_integer(self):
|
|
assert SettingsManager._infer_type(42) == "integer"
|
|
|
|
def test_infer_dict_as_json(self):
|
|
assert SettingsManager._infer_type({"k": "v"}) == "json"
|
|
|
|
def test_infer_list_as_json(self):
|
|
assert SettingsManager._infer_type([1, 2]) == "json"
|
|
|
|
def test_infer_string(self):
|
|
assert SettingsManager._infer_type("hello") == "string"
|
|
|
|
def test_infer_none_as_string(self):
|
|
# None is not bool/int/dict/list, falls to string
|
|
assert SettingsManager._infer_type(None) == "string"
|
|
|
|
|
|
class TestStripeWebhookHandlers:
|
|
"""Test that stub handlers run without error and are registered."""
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_checkout_completed(self):
|
|
await handle_checkout_completed({"id": "evt_123"}, AsyncMock())
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_invoice_paid(self):
|
|
await handle_invoice_paid({"id": "evt_456"}, AsyncMock())
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_invoice_payment_failed(self):
|
|
await handle_invoice_payment_failed({"id": "evt_789"}, AsyncMock())
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_subscription_updated(self):
|
|
await handle_subscription_updated({"id": "evt_abc"}, AsyncMock())
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_subscription_deleted(self):
|
|
await handle_subscription_deleted({"id": "evt_def"}, AsyncMock())
|
|
|
|
def test_webhook_handlers_registry(self):
|
|
assert "checkout.session.completed" in WEBHOOK_HANDLERS
|
|
assert "invoice.paid" in WEBHOOK_HANDLERS
|
|
assert "invoice.payment_failed" in WEBHOOK_HANDLERS
|
|
assert "customer.subscription.updated" in WEBHOOK_HANDLERS
|
|
assert "customer.subscription.deleted" in WEBHOOK_HANDLERS
|
|
assert len(WEBHOOK_HANDLERS) == 5
|