Files
resolutionflow/backend/tests/test_settings_manager.py
chihlasm 064bc0aa48 test: add 113 unit tests for permissions, tree validation, and settings
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>
2026-02-08 17:58:48 -05:00

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