| import os |
| import pytest |
| from unittest.mock import patch, MagicMock |
| from fastapi.testclient import TestClient |
| from app.main import app |
|
|
| client = TestClient(app) |
|
|
| |
| STRIPE_SECRET_KEY = os.getenv("STRIPE_SECRET_KEY") |
| if not STRIPE_SECRET_KEY: |
| pytest.skip( |
| "Stripe not configured – skipping payment tests", |
| allow_module_level=True) |
|
|
|
|
| @pytest.fixture |
| def mock_stripe(): |
| with patch("stripe.checkout.Session.create") as mock: |
| yield mock |
|
|
|
|
| def test_create_checkout_session_missing_stripe_key(monkeypatch): |
| monkeypatch.setenv("STRIPE_SECRET_KEY", "") |
| response = client.post( |
| "/api/v1/payments/create-checkout-session", |
| json={ |
| "api_key": "test_key", |
| "success_url": "https://example.com/success", |
| "cancel_url": "https://example.com/cancel"}) |
| assert response.status_code == 500 |
| assert "Stripe not configured" in response.json()["detail"] |
|
|
|
|
| def test_create_checkout_session_free_key(mock_stripe): |
| |
| with patch("app.core.usage_tracker.tracker") as mock_tracker: |
| mock_tracker.get_tier.return_value = "free" |
| mock_stripe.return_value = MagicMock( |
| id="cs_test_123", url="https://checkout.stripe.com/pay") |
| response = client.post( |
| "/api/v1/payments/create-checkout-session", |
| json={ |
| "api_key": "test_key", |
| "success_url": "https://example.com/success", |
| "cancel_url": "https://example.com/cancel"}) |
| assert response.status_code == 200 |
| data = response.json() |
| assert "sessionId" in data |
| assert "url" in data |
|
|
|
|
| def test_create_checkout_session_pro_key(): |
| with patch("app.core.usage_tracker.tracker") as mock_tracker: |
| mock_tracker.get_tier.return_value = "pro" |
| response = client.post( |
| "/api/v1/payments/create-checkout-session", |
| json={ |
| "api_key": "test_key", |
| "success_url": "https://example.com/success", |
| "cancel_url": "https://example.com/cancel"}) |
| assert response.status_code == 400 |
| assert "Only free tier keys can be upgraded" in response.json()[ |
| "detail"] |
|
|