add iugu postback
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
import base64
|
||||
import json
|
||||
import os
|
||||
from dataclasses import dataclass
|
||||
from http import HTTPMethod
|
||||
from urllib.parse import urlencode
|
||||
|
||||
import jsonlines
|
||||
import pytest
|
||||
@@ -35,6 +39,87 @@ def lambda_context() -> LambdaContext:
|
||||
return LambdaContext()
|
||||
|
||||
|
||||
class HttpApiProxy:
|
||||
def __call__(
|
||||
self,
|
||||
raw_path: str,
|
||||
method: str = HTTPMethod.GET,
|
||||
body: dict | str | None = None,
|
||||
*,
|
||||
headers: dict = {},
|
||||
cookies: list[str] = [],
|
||||
query_string_parameters: dict = {},
|
||||
is_base64_encoded: bool = True,
|
||||
**kwargs,
|
||||
) -> dict:
|
||||
if isinstance(body, dict):
|
||||
body = json.dumps(body)
|
||||
|
||||
if is_base64_encoded and body:
|
||||
body = _base64_encode(body)
|
||||
|
||||
return {
|
||||
'version': '2.0',
|
||||
'routeKey': '$default',
|
||||
'rawPath': raw_path,
|
||||
'rawQueryString': urlencode(query_string_parameters),
|
||||
'cookies': cookies,
|
||||
'headers': headers,
|
||||
'queryStringParameters': query_string_parameters,
|
||||
'requestContext': {
|
||||
'accountId': '123456789012',
|
||||
'apiId': 'api-id',
|
||||
'authorizer': {
|
||||
'jwt': {
|
||||
'claims': {
|
||||
'aud': '1db63660-063d-4280-b2ea-388aca4a9459',
|
||||
'client_id': '1db63660-063d-4280-b2ea-388aca4a9459',
|
||||
'email': 'sergio@somosbeta.com.br',
|
||||
'email_verified': 'true',
|
||||
'exp': '1765205975',
|
||||
'iat': '1765202375',
|
||||
'iss': 'https://id.saladeaula.digital',
|
||||
'jti': 'Fbbyvwwze3npdEgs',
|
||||
'name': 'Sérgio R Siqueira',
|
||||
'scope': 'openid profile email offline_access apps:admin',
|
||||
'sub': '5OxmMjL-ujoR5IMGegQz',
|
||||
},
|
||||
'scopes': None,
|
||||
}
|
||||
},
|
||||
'domainName': 'id.execute-api.us-east-1.amazonaws.com',
|
||||
'domainPrefix': 'id',
|
||||
'http': {
|
||||
'method': str(method),
|
||||
'path': raw_path,
|
||||
'protocol': 'HTTP/1.1',
|
||||
'sourceIp': '192.168.0.1/32',
|
||||
'userAgent': 'agent',
|
||||
},
|
||||
'requestId': 'id',
|
||||
'routeKey': '$default',
|
||||
'stage': '$default',
|
||||
'time': '12/Mar/2020:19:03:58 +0000',
|
||||
'timeEpoch': 1583348638390,
|
||||
},
|
||||
'body': body,
|
||||
'pathParameters': {'parameter1': 'value1'},
|
||||
'isBase64Encoded': is_base64_encoded,
|
||||
'stageVariables': {'stageVariable1': 'value1', 'stageVariable2': 'value2'},
|
||||
}
|
||||
|
||||
|
||||
def _base64_encode(s: str) -> str | None:
|
||||
if not s:
|
||||
return None
|
||||
return base64.b64encode(s.encode()).decode()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def http_api_proxy():
|
||||
return HttpApiProxy()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def dynamodb_client():
|
||||
from boto3clients import dynamodb_client as client
|
||||
@@ -74,3 +159,10 @@ def dynamodb_seeds(dynamodb_persistence_layer):
|
||||
|
||||
for line in reader.iter(type=dict, skip_invalid=True):
|
||||
dynamodb_persistence_layer.put_item(item=line)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def app():
|
||||
import app
|
||||
|
||||
return app
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
{"id": "2849f1d5-f4f1-411e-8497-ec3a40afc0ab", "sk": "ADDRESS", "city": "São José", "postcode": "88101001", "state": "SC", "created_at": "2026-01-07T19:09:54.193859-03:00", "address1": "Avenida Presidente Kennedy" "address2": "", "neighborhood": "Campinas"}
|
||||
|
||||
// Seeds for Iugu
|
||||
// file: tests/test_app.py
|
||||
// file: tests/events/payments/test_create_invoice.py
|
||||
{"id": "121c1140-779d-4664-8d99-4a006a22f547", "sk": "0", "total": "267.3", "name": "Beta Educação", "payment_method": "BANK_SLIP", "create_date": "2026-01-07T19:07:49.272967-03:00", "due_date": "2026-01-12T00:35:44.897447-03:00", "coupon": "10OFF", "discount": "-29.7", "updated_at": "2026-01-07T19:07:51.512605-03:00", "tenant_id": "cJtK9SsnJhKPyxESe7g3DG", "email": "org+15608435000190@users.noreply.saladeaula.digital", "org_id": "cJtK9SsnJhKPyxESe7g3DG", "cnpj": "15608435000190", "status": "PENDING", "subtotal": 297}
|
||||
{"id": "121c1140-779d-4664-8d99-4a006a22f547", "sk": "ADDRESS", "city": "São José", "neighborhood": "Campinas", "address2": "", "postcode": "88101001", "state": "SC", "address1": "Avenida Presidente Kennedy", "created_at": "2026-01-07T19:07:49.272967-03:00"}
|
||||
|
||||
41
orders-events/tests/test_app.py
Normal file
41
orders-events/tests/test_app.py
Normal file
@@ -0,0 +1,41 @@
|
||||
from http import HTTPMethod, HTTPStatus
|
||||
|
||||
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair
|
||||
|
||||
from .conftest import HttpApiProxy, LambdaContext
|
||||
|
||||
order_id = '121c1140-779d-4664-8d99-4a006a22f547'
|
||||
|
||||
|
||||
def test_postback(
|
||||
app,
|
||||
dynamodb_seeds,
|
||||
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
|
||||
http_api_proxy: HttpApiProxy,
|
||||
lambda_context: LambdaContext,
|
||||
):
|
||||
# This data was added from seeds
|
||||
r = app.lambda_handler(
|
||||
http_api_proxy(
|
||||
raw_path=f'/{order_id}/postback',
|
||||
method=HTTPMethod.POST,
|
||||
body=(
|
||||
'event=invoice.status_changed&'
|
||||
'data[id]=RDBBACE5DE174554BA2C836E96D751AA&'
|
||||
'data[status]=paid&'
|
||||
'data[account_id]=AF01CF1B3451459F92666F10589278EE&'
|
||||
'data[payment_method]=iugu_credit_card&'
|
||||
'data[paid_at]=2022-10-17T18:21:55-03:00&'
|
||||
'data[paid_cents]=10255&'
|
||||
'data[order_id]=cPqkdJUeqqCB6WATsSWnsZ'
|
||||
),
|
||||
is_base64_encoded=True,
|
||||
headers={'content-type': 'application/x-www-form-urlencoded'},
|
||||
),
|
||||
lambda_context,
|
||||
)
|
||||
assert r['statusCode'] == HTTPStatus.NO_CONTENT
|
||||
|
||||
order = dynamodb_persistence_layer.get_item(KeyPair(order_id, '0'))
|
||||
|
||||
assert order['status'] == 'PAID'
|
||||
Reference in New Issue
Block a user