Fix Pro payment recovery and wallet provider selection
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
from src.database.db_manager import DBManager
|
||||
from src.payments.contract_checkout import PaymentContractCheckoutService
|
||||
from src.payments.contract_checkout import (
|
||||
PaymentContractCheckoutService,
|
||||
PaymentIntentRecord,
|
||||
)
|
||||
|
||||
|
||||
def test_payment_runtime_state_and_audit_event_roundtrip(tmp_path):
|
||||
@@ -38,3 +41,101 @@ def test_payment_checkout_parses_multiple_rpc_urls(monkeypatch, tmp_path):
|
||||
assert service.rpc_urls == ["https://rpc-1.example", "https://rpc-2.example"]
|
||||
assert status["configured_rpc_count"] == 2
|
||||
assert status["all_rpc_urls"][0] == "https://rpc-1.example"
|
||||
|
||||
|
||||
def test_confirm_intent_tx_repairs_confirmed_intent(monkeypatch, tmp_path):
|
||||
monkeypatch.setenv("POLYWEATHER_PAYMENT_ENABLED", "true")
|
||||
monkeypatch.setenv("SUPABASE_URL", "https://example.supabase.co")
|
||||
monkeypatch.setenv("SUPABASE_SERVICE_ROLE_KEY", "service-role")
|
||||
monkeypatch.setenv("POLYWEATHER_PAYMENT_RPC_URL", "https://rpc-1.example")
|
||||
monkeypatch.setenv(
|
||||
"POLYWEATHER_PAYMENT_ACCEPTED_TOKENS_JSON",
|
||||
'[{"code":"usdc_e","address":"0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174","decimals":6,"receiver_contract":"0xeD2f13Aa5fF033c58FB436E178451Cd07f693f32","is_default":true}]',
|
||||
)
|
||||
monkeypatch.setenv("POLYWEATHER_DB_PATH", str(tmp_path / "payments.db"))
|
||||
|
||||
service = PaymentContractCheckoutService()
|
||||
intent = PaymentIntentRecord(
|
||||
intent_id="intent-1",
|
||||
order_id_hex="0x" + "1" * 64,
|
||||
plan_code="pro_monthly",
|
||||
plan_id=101,
|
||||
chain_id=137,
|
||||
amount_units=5000000,
|
||||
amount_usdc="5",
|
||||
token_address="0x2791bca1f2de4661ed88a30c99a7a9449aa84174",
|
||||
token_decimals=6,
|
||||
token_symbol="USDC.e",
|
||||
receiver_address="0xed2f13aa5ff033c58fb436e178451cd07f693f32",
|
||||
status="confirmed",
|
||||
payment_mode="strict",
|
||||
allowed_wallet="0x1111111111111111111111111111111111111111",
|
||||
expires_at="2099-01-01T00:00:00+00:00",
|
||||
tx_hash="0x" + "2" * 64,
|
||||
metadata={},
|
||||
)
|
||||
|
||||
monkeypatch.setattr(service, "get_intent", lambda user_id, intent_id: intent)
|
||||
monkeypatch.setattr(
|
||||
service,
|
||||
"_ensure_confirm_side_effects",
|
||||
lambda user_id, local_intent, tx_hash: {
|
||||
"payment": {"tx_hash": tx_hash},
|
||||
"subscription": {"plan_code": local_intent.plan_code},
|
||||
},
|
||||
)
|
||||
|
||||
result = service.confirm_intent_tx("user-1", "intent-1")
|
||||
|
||||
assert result["already_confirmed"] is True
|
||||
assert result["payment"]["tx_hash"] == intent.tx_hash
|
||||
assert result["subscription"]["plan_code"] == "pro_monthly"
|
||||
|
||||
|
||||
def test_reconcile_latest_intent_confirms_submitted_first(monkeypatch, tmp_path):
|
||||
monkeypatch.setenv("POLYWEATHER_PAYMENT_ENABLED", "true")
|
||||
monkeypatch.setenv("SUPABASE_URL", "https://example.supabase.co")
|
||||
monkeypatch.setenv("SUPABASE_SERVICE_ROLE_KEY", "service-role")
|
||||
monkeypatch.setenv("POLYWEATHER_PAYMENT_RPC_URL", "https://rpc-1.example")
|
||||
monkeypatch.setenv(
|
||||
"POLYWEATHER_PAYMENT_ACCEPTED_TOKENS_JSON",
|
||||
'[{"code":"usdc_e","address":"0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174","decimals":6,"receiver_contract":"0xeD2f13Aa5fF033c58FB436E178451Cd07f693f32","is_default":true}]',
|
||||
)
|
||||
monkeypatch.setenv("POLYWEATHER_DB_PATH", str(tmp_path / "payments.db"))
|
||||
|
||||
service = PaymentContractCheckoutService()
|
||||
monkeypatch.setattr(
|
||||
service,
|
||||
"_rest",
|
||||
lambda method, table, **kwargs: [
|
||||
{
|
||||
"id": "intent-1",
|
||||
"plan_code": "pro_monthly",
|
||||
"plan_id": 101,
|
||||
"chain_id": 137,
|
||||
"token_address": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
|
||||
"receiver_address": "0xeD2f13Aa5fF033c58FB436E178451Cd07f693f32",
|
||||
"amount_units": "5000000",
|
||||
"payment_mode": "strict",
|
||||
"allowed_wallet": "0x1111111111111111111111111111111111111111",
|
||||
"order_id_hex": "0x" + "1" * 64,
|
||||
"status": "submitted",
|
||||
"expires_at": "2099-01-01T00:00:00+00:00",
|
||||
"tx_hash": "0x" + "2" * 64,
|
||||
"metadata": {},
|
||||
}
|
||||
],
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
service,
|
||||
"confirm_intent_tx",
|
||||
lambda user_id, intent_id, tx_hash=None: {
|
||||
"intent": {"intent_id": intent_id},
|
||||
"already_confirmed": False,
|
||||
},
|
||||
)
|
||||
|
||||
result = service.reconcile_latest_intent("user-1")
|
||||
|
||||
assert result["ok"] is True
|
||||
assert result["action"] == "confirmed_submitted_intent"
|
||||
|
||||
Reference in New Issue
Block a user