This commit is contained in:
2025-07-30 12:31:53 -03:00
parent f99ca23a79
commit 80afcb9da3
12 changed files with 873 additions and 211 deletions

View File

@@ -1,5 +1,5 @@
from aws_lambda_powertools.utilities.typing import LambdaContext
from layercake.dynamodb import DynamoDBPersistenceLayer, PartitionKey
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair
import events.billing.append_enrollment as app
@@ -14,9 +14,9 @@ def test_append_enrollment(
'new_image': {
'id': '945e8672-1d72-45c6-b76c-ac06aa8b52ab',
'sk': 'METADATA#SUBSCRIPTION_COVERED',
'billing_day': 5,
'billing_day': 6,
'created_at': '2025-07-23T18:09:22.785678-03:00',
'org_id': 'edp8njvgQuzNkLx2ySNfAD',
'org_id': 'cJtK9SsnJhKPyxESe7g3DG',
}
}
}
@@ -24,13 +24,13 @@ def test_append_enrollment(
assert app.lambda_handler(event, lambda_context) # type: ignore
r = dynamodb_persistence_layer.collection.query(
PartitionKey('BILLING#ORG#edp8njvgQuzNkLx2ySNfAD')
KeyPair('BILLING#ORG#cJtK9SsnJhKPyxESe7g3DG', 'START#2025-06-06#END#2025-07-05')
)
items = r['items']
assert items[0]['sk'] == 'START#2025-06-05#END#2025-07-04#SCHEDULE#AUTO_CLOSE'
assert items[0]['sk'] == 'START#2025-06-06#END#2025-07-05#SCHEDULE#AUTO_CLOSE'
assert (
items[1]['sk']
== 'START#2025-06-05#END#2025-07-04#ENROLLMENT#945e8672-1d72-45c6-b76c-ac06aa8b52ab'
== 'START#2025-06-06#END#2025-07-05#ENROLLMENT#945e8672-1d72-45c6-b76c-ac06aa8b52ab'
)
assert items[2]['sk'] == 'START#2025-06-05#END#2025-07-04'
assert items[2]['sk'] == 'START#2025-06-06#END#2025-07-05'

View File

@@ -15,26 +15,24 @@ def test_close_window(
):
event = {
'detail': {
'new_image': {
'id': 'BILLING#ORG#BES6dmWgTMXRYmfDyYYXUF',
'keys': {
'id': 'BILLING#ORG#cJtK9SsnJhKPyxESe7g3DG',
'sk': 'START#2025-07-01#END#2025-07-31#SCHEDULE#AUTO_CLOSE',
'created_at': '2025-07-24T15:20:52.464244-03:00',
'ttl': 1754017200,
}
},
}
}
assert app.lambda_handler(event, lambda_context) # type: ignore
# r = dynamodb_persistence_layer.collection.get_items(
# TransactKey('BILLING#ORG#BES6dmWgTMXRYmfDyYYXUF')
# + SortKey('START#2025-07-01#END#2025-07-31')
# + SortKey('START#2025-07-01#END#2025-07-31#SCHEDULE#AUTO_CLOSE#EXECUTED'),
# flatten_top=False,
# )
r = dynamodb_persistence_layer.collection.get_items(
TransactKey('BILLING#ORG#cJtK9SsnJhKPyxESe7g3DG')
+ SortKey('START#2025-07-01#END#2025-07-31')
+ SortKey('START#2025-07-01#END#2025-07-31#SCHEDULE#AUTO_CLOSE#EXECUTED'),
flatten_top=False,
)
# assert 's3_uri' in r['START#2025-07-01#END#2025-07-31']
# assert 'created_at' in r['START#2025-07-01#END#2025-07-31']
# assert 'updated_at' in r['START#2025-07-01#END#2025-07-31']
# assert r['START#2025-07-01#END#2025-07-31']['status'] == 'CLOSED'
# assert 'START#2025-07-01#END#2025-07-31#SCHEDULE#AUTO_CLOSE#EXECUTED' in r
assert 's3_uri' in r['START#2025-07-01#END#2025-07-31']
assert 'created_at' in r['START#2025-07-01#END#2025-07-31']
assert 'updated_at' in r['START#2025-07-01#END#2025-07-31']
assert r['START#2025-07-01#END#2025-07-31']['status'] == 'CLOSED'
assert 'START#2025-07-01#END#2025-07-31#SCHEDULE#AUTO_CLOSE#EXECUTED' in r

View File

@@ -0,0 +1,25 @@
from aws_lambda_powertools.utilities.typing import LambdaContext
from layercake.dynamodb import DynamoDBPersistenceLayer
import events.billing.send_email_on_closing as app
def test_send_email_on_closing(
monkeypatch,
dynamodb_seeds,
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
lambda_context: LambdaContext,
):
event = {
'detail': {
'new_image': {
'id': 'BILLING#ORG#cJtK9SsnJhKPyxESe7g3DG',
'sk': 'START#2025-07-01#END#2025-07-31',
'status': 'CLOSED',
's3_uri': 's3://saladeaula.digital/billing/sample.pdf',
},
}
}
monkeypatch.setattr(app.sesv2_client, 'send_email', lambda *args, **kwargs: ...)
assert app.lambda_handler(event, lambda_context) # type: ignore

View File

@@ -13,8 +13,9 @@
{"id": {"S": "a810dd22-56c0-4d9b-8cd2-7e2ee9c45839"}, "sk": {"S": "metadata#betaeducacao"},"course_id": {"S": "dc1a0428-47bf-4db1-a5da-24be49c9fda6"},"create_date": {"S": "2025-06-05T12:13:54.371416+00:00"}}
{"id": {"S": "945e8672-1d72-45c6-b76c-ac06aa8b52ab"}, "sk": {"S": "0"}, "course": {"M": {"id": {"S": "123"}, "name": {"S": "pytest"}}}, "user": {"M": {"id": {"S": "5OxmMjL-ujoR5IMGegQz"}, "name": {"S": "Sérgio R Siqueira"}}}, "create_date": {"S": "2025-06-05T12:13:54.371416+00:00"}}
{"id": {"S": "945e8672-1d72-45c6-b76c-ac06aa8b52ab"}, "sk": {"S": "author"}, "name": {"S": "Carolina Brand"}, "user_id": {"S": "SMEXYk5MQkKCzknJpxqr8n"}}
{"id": {"S": "CUSTOM_PRICING#ORG#edp8njvgQuzNkLx2ySNfAD"},"sk": {"S": "COURSE#123"},"created_at": {"S": "2025-07-24T16:10:09.304073-03:00"},"unit_price": {"N": "79.2"}}
{"id": {"S": "CUSTOM_PRICING#ORG#cJtK9SsnJhKPyxESe7g3DG"},"sk": {"S": "COURSE#123"},"created_at": {"S": "2025-07-24T16:10:09.304073-03:00"},"unit_price": {"N": "79.2"}}
{"id": {"S": "123"},"sk": {"S": "0"},"access_period": {"N": "360"},"cert": {"M": {"exp_interval": {"N": "360"}}},"created_at": {"S": "2024-12-30T00:33:33.088916-03:00"},"metadata__konviva_class_id": {"N": "194"},"metadata__unit_price": {"N": "99"},"name": {"S": "Direção Defensiva (08 horas)"},"tenant_id": {"S": "*"},"updated_at": {"S": "2025-07-24T00:00:24.639003-03:00"}}
{"id": {"S": "BILLING#ORG#BES6dmWgTMXRYmfDyYYXUF"},"sk": {"S": "START#2025-07-01#END#2025-07-31"},"created_at": {"S": "2025-07-24T15:20:52.464244-03:00"},"status": {"S": "PENDING"}}
{"id": {"S": "BILLING#ORG#BES6dmWgTMXRYmfDyYYXUF"},"sk": {"S": "START#2025-07-01#END#2025-07-31#ENROLLMENT#a08c94a2-7ee4-45fd-bfe7-73568c738b8b"},"author": {"M": {"id": {"S": "SMEXYk5MQkKCzknJpxqr8n"},"name": {"S": "Carolina Brand"}}},"course": {"M": {"id": {"S": "7f7905aa-ec6d-4189-b884-50fa9b1bd0b8"},"name": {"S": "NR-10 Reciclagem: 08 horas"}}},"created_at": {"S": "2025-07-24T16:38:33.095216-03:00"},"enrolled_at": {"S": "2025-07-24T11:26:56.975207-03:00"},"unit_price": {"N": "169"},"user": {"M": {"id": {"S": "iPWidwn4HsYtikiZD33smV"},"name": {"S": "William da Silva Nascimento"}}}}
{"id": {"S": "BILLING#ORG#BES6dmWgTMXRYmfDyYYXUF"},"sk": {"S": "START#2025-07-01#END#2025-07-31#ENROLLMENT#ac09e8da-6cb2-4e31-84e7-238df2647a7a"},"author": {"M": {"id": {"S": "SMEXYk5MQkKCzknJpxqr8n"},"name": {"S": "Carolina Brand"}}},"course": {"M": {"id": {"S": "7f7905aa-ec6d-4189-b884-50fa9b1bd0b8"},"name": {"S": "NR-10 Reciclagem: 08 horas"}}},"created_at": {"S": "2025-07-24T16:38:58.694031-03:00"},"enrolled_at": {"S": "2025-07-24T11:26:56.913746-03:00"},"unit_price": {"N": "169"},"user": {"M": {"id": {"S": "ca8c9fca-b508-4842-8a48-fd5cc5632ac0"},"name": {"S": "Geovane Soares De Lima"}}}}
{"id": {"S": "BILLING#ORG#cJtK9SsnJhKPyxESe7g3DG"},"sk": {"S": "START#2025-07-01#END#2025-07-31"},"created_at": {"S": "2025-07-24T15:20:52.464244-03:00"},"status": {"S": "PENDING"}}
{"id": {"S": "BILLING#ORG#cJtK9SsnJhKPyxESe7g3DG"},"sk": {"S": "START#2025-07-01#END#2025-07-31#ENROLLMENT#a08c94a2-7ee4-45fd-bfe7-73568c738b8b"},"author": {"M": {"id": {"S": "SMEXYk5MQkKCzknJpxqr8n"},"name": {"S": "Carolina Brand"}}},"course": {"M": {"id": {"S": "7f7905aa-ec6d-4189-b884-50fa9b1bd0b8"},"name": {"S": "NR-10 Reciclagem: 08 horas"}}},"created_at": {"S": "2025-07-24T16:38:33.095216-03:00"},"enrolled_at": {"S": "2025-07-24T11:26:56.975207-03:00"},"unit_price": {"N": "169"},"user": {"M": {"id": {"S": "iPWidwn4HsYtikiZD33smV"},"name": {"S": "William da Silva Nascimento"}}}}
{"id": {"S": "BILLING#ORG#cJtK9SsnJhKPyxESe7g3DG"},"sk": {"S": "START#2025-07-01#END#2025-07-31#ENROLLMENT#ac09e8da-6cb2-4e31-84e7-238df2647a7a"},"author": {"M": {"id": {"S": "SMEXYk5MQkKCzknJpxqr8n"},"name": {"S": "Carolina Brand"}}},"course": {"M": {"id": {"S": "7f7905aa-ec6d-4189-b884-50fa9b1bd0b8"},"name": {"S": "NR-10 Reciclagem: 08 horas"}}},"created_at": {"S": "2025-07-21T16:38:58.694031-03:00"},"enrolled_at": {"S": "2025-07-21T11:26:56.913746-03:00"},"unit_price": {"N": "169"},"user": {"M": {"id": {"S": "ca8c9fca-b508-4842-8a48-fd5cc5632ac0"},"name": {"S": "Geovane Soares De Lima"}}}}
{"id": {"S": "cJtK9SsnJhKPyxESe7g3DG"},"sk": {"S": "admins#1234"},"create_date": {"S": "2025-03-12T16:51:52.632897-03:00"},"email": {"S": "sergio@somosbeta.com.br"},"name": {"S": "Sérgio R Siqueira"}}