add send cert reporting
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
from datetime import timedelta
|
||||
|
||||
import app.events.cert_reporting.append_issued_cert as app
|
||||
from aws_lambda_powertools.utilities.typing import LambdaContext
|
||||
from layercake.dateutils import now
|
||||
from layercake.dynamodb import (
|
||||
DynamoDBPersistenceLayer,
|
||||
SortKey,
|
||||
TransactKey,
|
||||
)
|
||||
|
||||
|
||||
def test_append_issued_cert(
|
||||
seeds,
|
||||
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
|
||||
lambda_context: LambdaContext,
|
||||
):
|
||||
expires_at = now() + timedelta(days=360)
|
||||
event = {
|
||||
'detail': {
|
||||
'new_image': {
|
||||
'id': 'e45019d8-be7a-4a82-9b37-12a01f0127bb',
|
||||
'sk': '0',
|
||||
'course': {
|
||||
'id': '431',
|
||||
'name': 'How to Sing Better',
|
||||
},
|
||||
'cert': {
|
||||
# 'expires_at': '2026-02-10T20:14:42.880991',
|
||||
'expires_at': expires_at.isoformat(),
|
||||
},
|
||||
'user': {
|
||||
'id': '1234',
|
||||
'name': 'Tobias Summit',
|
||||
},
|
||||
'org_id': '1e2eaf0e-e319-49eb-ab33-1ddec156dc94',
|
||||
'created_at': '2025-01-01T00:00:00-03:06',
|
||||
'completed_at': '2025-01-10T00:00:00-03:06',
|
||||
}
|
||||
}
|
||||
}
|
||||
assert app.lambda_handler(event, lambda_context) # type: ignore
|
||||
|
||||
# The reporting month is the month before the certificate expires
|
||||
month_start = (expires_at.replace(day=1) - timedelta(days=1)).replace(day=1)
|
||||
report_sk = 'MONTH#{}#SCHEDULE#SEND_REPORT_EMAIL'.format(
|
||||
month_start.strftime('%Y-%m')
|
||||
)
|
||||
|
||||
r = dynamodb_persistence_layer.collection.get_items(
|
||||
TransactKey('CERT#REPORTING#ORG#1e2eaf0e-e319-49eb-ab33-1ddec156dc94')
|
||||
+ SortKey(
|
||||
sk=report_sk,
|
||||
rename_key='report_email',
|
||||
)
|
||||
+ SortKey(
|
||||
sk='MONTH#{}#ENROLLMENT#e45019d8-be7a-4a82-9b37-12a01f0127bb'.format(
|
||||
expires_at.strftime('%Y-%m')
|
||||
),
|
||||
rename_key='enrollment',
|
||||
),
|
||||
flatten_top=False,
|
||||
)
|
||||
|
||||
assert 'course' in r['enrollment']
|
||||
assert 'ttl' in r['report_email']
|
||||
@@ -0,0 +1,25 @@
|
||||
import app.events.cert_reporting.send_report_email as app
|
||||
from aws_lambda_powertools.utilities.typing import LambdaContext
|
||||
from layercake.dynamodb import (
|
||||
DynamoDBPersistenceLayer,
|
||||
)
|
||||
|
||||
|
||||
def test_send_report_email(
|
||||
monkeypatch,
|
||||
seeds,
|
||||
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
|
||||
lambda_context: LambdaContext,
|
||||
):
|
||||
event = {
|
||||
'detail': {
|
||||
'old_image': {
|
||||
'id': 'CERT#REPORTING#ORG#00237409-9384-4692-9be5-b4443a41e1c4',
|
||||
'sk': 'MONTH#2025-06#SCHEDULE#SEND_REPORT_EMAIL',
|
||||
'target_month': '2025-07',
|
||||
},
|
||||
}
|
||||
}
|
||||
monkeypatch.setattr(app.sesv2_client, 'send_email', lambda *args, **kwargs: ...)
|
||||
|
||||
assert app.lambda_handler(event, lambda_context) # type: ignore
|
||||
@@ -35,4 +35,4 @@ def test_issue_cert(
|
||||
key=KeyPair('1ee108ae-67d4-4545-bf6d-4e641cdaa4e0', '0')
|
||||
)
|
||||
|
||||
assert 'issued_cert' in r
|
||||
assert 'cert' in r
|
||||
|
||||
@@ -29,7 +29,7 @@ def test_set_cert_expired(
|
||||
)
|
||||
assert r['status'] == 'COMPLETED'
|
||||
assert 'executed' in r
|
||||
assert 'issued_cert' in r
|
||||
assert 'cert' in r
|
||||
|
||||
|
||||
def test_existing_issued_cert(
|
||||
@@ -50,4 +50,4 @@ def test_existing_issued_cert(
|
||||
r = dynamodb_persistence_layer.collection.get_items(
|
||||
TransactKey('1ee108ae-67d4-4545-bf6d-4e641cdaa4e0') + SortKey('0')
|
||||
)
|
||||
assert 's3_uri' in r['issued_cert']
|
||||
assert 's3_uri' in r['cert']
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
{"id": "6437a282-6fe8-4e4d-9eb0-da1007238007", "sk": "0", "status": "IN_PROGRESS", "progress": 10}
|
||||
{"id": "845fe390-e3c3-4514-97f8-c42de0566cf0", "sk": "0", "status": "COMPLETED", "progress": 100}
|
||||
|
||||
{"id": "1ee108ae-67d4-4545-bf6d-4e641cdaa4e0", "sk": "0", "status": "COMPLETED", "score": 100, "course": {"id": "123", "name": "CIPA Grau de Risco 1"}, "user": {"name": "Kurt Cobain"}, "issued_cert": {"s3_uri": "s3://saladeaula.digital/issuedcerts/1ee108ae-67d4-4545-bf6d-4e641cdaa4e0.pdf"}}
|
||||
{"id": "1ee108ae-67d4-4545-bf6d-4e641cdaa4e0", "sk": "0", "status": "COMPLETED", "score": 100, "course": {"id": "123", "name": "CIPA Grau de Risco 1"}, "user": {"name": "Kurt Cobain"}, "cert": {"s3_uri": "s3://saladeaula.digital/issuedcerts/1ee108ae-67d4-4545-bf6d-4e641cdaa4e0.pdf"}}
|
||||
{"id": "1ee108ae-67d4-4545-bf6d-4e641cdaa4e0", "sk": "STARTED", "started_at": "2025-08-24T01:44:42.703012-03:06"}
|
||||
{"id": "1ee108ae-67d4-4545-bf6d-4e641cdaa4e0", "sk": "COMPLETED", "completed_at": "2025-08-31T21:59:10.842467-03:00"}
|
||||
|
||||
@@ -37,3 +37,10 @@
|
||||
{"id": "294e9864-8284-4287-b153-927b15d90900", "sk": "konviva", "class_id": 34, "user_id": 26943, "created_at": "2025-09-09T09:11:29.315247-03:00", "enrollment_id": 244488}
|
||||
{"id": "294e9864-8284-4287-b153-927b15d90900", "sk": "tenant", "org_id": "123", "name": "EDUSEG", "create_date": "2025-09-12T17:11:00.556907-03:00"}
|
||||
|
||||
// Certificate reporting
|
||||
{"id": "CERT#REPORTING#ORG#00237409-9384-4692-9be5-b4443a41e1c4", "sk": "MONTH#2025-07#ENROLLMENT#ba4d48e6-3671-4060-988a-d6cf97dd0ea4", "completed_at": "2025-01-10T00:00:00-03:06", "enrolled_at": "2025-01-01T00:00:00-03:06", "expires_at": "2026-02-10T20:14:42.880991", "course": {"name": "How to Sing Better", "id": "431"}, "created_at": "2025-10-11T23:39:12.194344-03:00", "user": {"name": "Tobias Summit", "id": "1234"}, "enrollment_id": "e45019d8-be7a-4a82-9b37-12a01f0127bb"}
|
||||
|
||||
// Org
|
||||
{"id": "1e2eaf0e-e319-49eb-ab33-1ddec156dc94", "sk": "0", "name": "pytest"}
|
||||
// Org admins
|
||||
{"id": "00237409-9384-4692-9be5-b4443a41e1c4", "sk": "admins#1234", "email": "sergio@somosbeta.com.br", "name": "Sérgio R Siqueira"}
|
||||
|
||||
Reference in New Issue
Block a user