remove archived and expired

This commit is contained in:
2025-09-18 12:24:21 -03:00
parent 0ebf108a94
commit db63dfa64d
8 changed files with 134 additions and 232 deletions

View File

@@ -26,7 +26,7 @@ dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
def postback(): def postback():
json_body = app.current_event.json_body json_body = app.current_event.json_body
status = json_body['status'] event_name = json_body['event_name']
score = round(Decimal(json_body['APROVEITAMENTO']), 2) score = round(Decimal(json_body['APROVEITAMENTO']), 2)
progress = round(Decimal(json_body['ANDAMENTO']), 2) progress = round(Decimal(json_body['ANDAMENTO']), 2)
enrollment_id = dyn.collection.get_item( enrollment_id = dyn.collection.get_item(
@@ -34,16 +34,29 @@ def postback():
# Post-migration: uncomment the following line # Post-migration: uncomment the following line
# pk='KONVIVA', # pk='KONVIVA',
pk='konviva', pk='konviva',
sk=SortKey(json_body['ID_MATRICULA'], path_spec='enrollment_id'), sk=SortKey(
json_body['ID_MATRICULA'],
path_spec='enrollment_id',
),
), ),
exc_cls=EnrollmentNotFoundError, exc_cls=EnrollmentNotFoundError,
) )
if status == 'IN_PROGRESS': # Make sure webhooks send the correct event names
update_progress(enrollment_id, progress, dynamodb_persistence_layer=dyn) match event_name:
case 'UPDATING':
if status == 'COMPLETED': update_progress(
set_score(enrollment_id, score, progress, dynamodb_persistence_layer=dyn) enrollment_id,
progress,
dynamodb_persistence_layer=dyn,
)
case 'COMPLETED':
set_score(
enrollment_id,
score,
progress,
dynamodb_persistence_layer=dyn,
)
return Response(status_code=HTTPStatus.NO_CONTENT) return Response(status_code=HTTPStatus.NO_CONTENT)

View File

@@ -1,4 +1,3 @@
from datetime import datetime, timedelta
from decimal import Decimal from decimal import Decimal
from aws_lambda_powertools.event_handler.exceptions import ( from aws_lambda_powertools.event_handler.exceptions import (
@@ -7,7 +6,7 @@ from aws_lambda_powertools.event_handler.exceptions import (
) )
from botocore.args import logger from botocore.args import logger
from glom import glom from glom import glom
from layercake.dateutils import fromisoformat, now, ttl from layercake.dateutils import now, ttl
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair, SortKey, TransactKey from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair, SortKey, TransactKey
from layercake.strutils import md5_hash from layercake.strutils import md5_hash
@@ -124,56 +123,34 @@ def set_score(
rename_key='dedup_window_offset_days', rename_key='dedup_window_offset_days',
), ),
) )
now_ = now()
user_id = enrollment['user']['id'] user_id = enrollment['user']['id']
course_id = glom(enrollment, 'course.id') course_id = glom(enrollment, 'course.id')
created_at: datetime = fromisoformat(enrollment['created_at']) # type: ignore
access_period = created_at + timedelta(
days=int(glom(enrollment, 'metadata__course.access_period'))
)
try: try:
match score >= 70, now_ > access_period: if score >= 70:
case True, True: # Got a score of 70 or higher
# Got a score of 70 or higher, but the access period has expired return _set_status_as_completed(
return _set_status_as_archived( id,
id, score,
dynamodb_persistence_layer=dynamodb_persistence_layer, progress=progress,
) user_id=user_id,
case True, False: course_id=course_id,
# Got a score of 70 or higher, and still within the access period cert_exp_interval=int(
return _set_status_as_completed( glom(enrollment, 'metadata__course.cert.exp_interval', default=0)
id, ),
score, dedup_window_offset_days=int(enrollment['dedup_window_offset_days']),
progress=progress, dynamodb_persistence_layer=dynamodb_persistence_layer,
user_id=user_id, )
course_id=course_id,
cert_exp_interval=int( # Got a score below 70
glom( return _set_status_as_failed(
enrollment, 'metadata__course.cert.exp_interval', default=0 id,
) score,
), progress=progress,
dedup_window_offset_days=int( user_id=user_id,
enrollment['dedup_window_offset_days'] course_id=course_id,
), dynamodb_persistence_layer=dynamodb_persistence_layer,
dynamodb_persistence_layer=dynamodb_persistence_layer, )
)
case False, True:
# Got a score below 70, and the access period has expired
return _set_status_as_expired(
id,
dynamodb_persistence_layer=dynamodb_persistence_layer,
)
case _:
# Got a score below 70, and still within the access period
return _set_status_as_failed(
id,
score,
progress=progress,
user_id=user_id,
course_id=course_id,
dynamodb_persistence_layer=dynamodb_persistence_layer,
)
except EnrollmentConflictError as err: except EnrollmentConflictError as err:
logger.exception(err) logger.exception(err)
raise raise
@@ -193,15 +170,15 @@ def _set_status_as_completed(
) -> bool: ) -> bool:
now_ = now() now_ = now()
lock_hash = md5_hash(f'{user_id}{course_id}') lock_hash = md5_hash(f'{user_id}{course_id}')
archive_ttl = ttl( cert_exp_ttl = ttl(
start_dt=now_, start_dt=now_,
days=cert_exp_interval, days=cert_exp_interval,
) )
cert_expiration_reminder_ttl = ttl( cert_exp_reminder_ttl = ttl(
start_dt=now_, start_dt=now_,
days=cert_exp_interval - 30, days=cert_exp_interval - 30,
) )
deduplication_lock_ttl = ttl( dedup_lock_ttl = ttl(
start_dt=now_, start_dt=now_,
days=cert_exp_interval - dedup_window_offset_days, days=cert_exp_interval - dedup_window_offset_days,
) )
@@ -209,8 +186,10 @@ def _set_status_as_completed(
with dynamodb_persistence_layer.transact_writer() as transact: with dynamodb_persistence_layer.transact_writer() as transact:
transact.update( transact.update(
key=KeyPair(pk=id, sk='0'), key=KeyPair(pk=id, sk='0'),
update_expr='SET #status = :completed, progress = :progress, \ update_expr='SET #status = :completed, \
score = :score, updated_at = :updated_at', progress = :progress, \
score = :score, \
updated_at = :updated_at',
cond_expr='#status = :in_progress', cond_expr='#status = :in_progress',
expr_attr_names={'#status': 'status'}, expr_attr_names={'#status': 'status'},
expr_attr_values={ expr_attr_values={
@@ -236,15 +215,15 @@ def _set_status_as_completed(
item={ item={
'id': id, 'id': id,
'sk': 'SCHEDULE#REMINDER_CERT_EXPIRATION_BEFORE_30_DAYS', 'sk': 'SCHEDULE#REMINDER_CERT_EXPIRATION_BEFORE_30_DAYS',
'ttl': cert_expiration_reminder_ttl, 'ttl': cert_exp_ttl,
'created_at': now_, 'created_at': now_,
} }
) )
transact.put( transact.put(
item={ item={
'id': id, 'id': id,
'sk': 'SCHEDULE#SET_AS_ARCHIVED', 'sk': 'SCHEDULE#SET_CERT_EXPIRED',
'ttl': archive_ttl, 'ttl': cert_exp_reminder_ttl,
'created_at': now_, 'created_at': now_,
} }
) )
@@ -252,7 +231,7 @@ def _set_status_as_completed(
item={ item={
'id': id, 'id': id,
'sk': 'LOCK', 'sk': 'LOCK',
'ttl': deduplication_lock_ttl, 'ttl': dedup_lock_ttl,
'hash': lock_hash, 'hash': lock_hash,
'created_at': now_, 'created_at': now_,
} }
@@ -262,7 +241,7 @@ def _set_status_as_completed(
'id': 'LOCK', 'id': 'LOCK',
'sk': lock_hash, 'sk': lock_hash,
'enrollment_id': id, 'enrollment_id': id,
'ttl': deduplication_lock_ttl, 'ttl': dedup_lock_ttl,
'created_at': now_, 'created_at': now_,
} }
) )
@@ -274,12 +253,6 @@ def _set_status_as_completed(
sk='CANCEL_POLICY', sk='CANCEL_POLICY',
) )
) )
transact.delete(
key=KeyPair(
pk=id,
sk='SCHEDULE#SET_AS_EXPIRED',
)
)
transact.delete( transact.delete(
key=KeyPair( key=KeyPair(
pk=id, pk=id,
@@ -312,8 +285,11 @@ def _set_status_as_failed(
with dynamodb_persistence_layer.transact_writer() as transact: with dynamodb_persistence_layer.transact_writer() as transact:
transact.update( transact.update(
key=KeyPair(pk=id, sk='0'), key=KeyPair(pk=id, sk='0'),
update_expr='SET #status = :failed, progress = :progress, \ update_expr='SET #status = :failed, \
score = :score, updated_at = :updated_at', progress = :progress, \
score = :score, \
access_expired = :access_expired, \
updated_at = :updated_at',
cond_expr='#status = :in_progress', cond_expr='#status = :in_progress',
expr_attr_names={'#status': 'status'}, expr_attr_names={'#status': 'status'},
expr_attr_values={ expr_attr_values={
@@ -321,6 +297,7 @@ def _set_status_as_failed(
':in_progress': 'IN_PROGRESS', ':in_progress': 'IN_PROGRESS',
':score': score, ':score': score,
':progress': progress, ':progress': progress,
':access_expired': True,
':updated_at': now_, ':updated_at': now_,
}, },
exc_cls=EnrollmentConflictError, exc_cls=EnrollmentConflictError,
@@ -343,7 +320,7 @@ def _set_status_as_failed(
transact.delete( transact.delete(
key=KeyPair( key=KeyPair(
pk=id, pk=id,
sk='SCHEDULE#SET_AS_EXPIRED', sk='SCHEDULE#SET_ACCESS_EXPIRED',
) )
) )
transact.delete( transact.delete(
@@ -369,90 +346,6 @@ def _set_status_as_failed(
return True return True
def _set_status_as_archived(
id: str,
*,
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
):
now_ = now()
with dynamodb_persistence_layer.transact_writer() as transact:
transact.update(
key=KeyPair(pk=id, sk='0'),
update_expr='SET #status = :archived, updated_at = :updated_at',
cond_expr='#status = :completed',
expr_attr_names={'#status': 'status'},
expr_attr_values={
':archived': 'ARCHIVED',
':completed': 'COMPLETED',
':updated_at': now_,
},
exc_cls=EnrollmentConflictError,
)
transact.put(
item={
'id': id,
'sk': 'ARCHIVED',
'archived_at': now_,
},
cond_expr='attribute_not_exists(sk)',
)
# Remove events that no longer apply
transact.delete(
key=KeyPair(
pk=id,
sk='SCHEDULE#SET_AS_ARCHIVED',
)
)
return True
def _set_status_as_expired(
id: str,
*,
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
):
now_ = now()
with dynamodb_persistence_layer.transact_writer() as transact:
transact.update(
key=KeyPair(pk=id, sk='0'),
update_expr='SET #status = :expired, updated_at = :updated_at',
cond_expr='#status = :in_progress OR #status = :pending',
expr_attr_names={
'#status': 'status',
},
expr_attr_values={
':pending': 'PENDING',
':in_progress': 'IN_PROGRESS',
':expired': 'EXPIRED',
':updated_at': now_,
},
exc_cls=EnrollmentConflictError,
)
transact.put(
item={
'id': id,
'sk': 'EXPIRED',
'expired_at': now_,
},
cond_expr='attribute_not_exists(sk)',
)
# Remove events and policies that no longer apply
transact.delete(
key=KeyPair(
pk=id,
sk='CANCEL_POLICY',
),
)
transact.delete(
key=KeyPair(
pk=id,
sk='SCHEDULE#SET_AS_EXPIRED',
)
)
class EnrollmentNotFoundError(NotFoundError): class EnrollmentNotFoundError(NotFoundError):
def __init__(self, *_): def __init__(self, *_):
super().__init__('Enrollment not found') super().__init__('Enrollment not found')

View File

@@ -11,14 +11,14 @@ from boto3clients import dynamodb_client
from config import ENROLLMENT_TABLE from config import ENROLLMENT_TABLE
logger = Logger(__name__) logger = Logger(__name__)
enrollment_layer = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client) dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
@event_source(data_class=EventBridgeEvent) @event_source(data_class=EventBridgeEvent)
@logger.inject_lambda_context @logger.inject_lambda_context
def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
new_image = event.detail['new_image'] new_image = event.detail['new_image']
data = enrollment_layer.get_item(KeyPair(new_image['id'], 'konviva')) data = dyn.get_item(KeyPair(new_image['id'], 'konviva'))
try: try:
result = konviva.cancel_enrollment(data['enrollment_id']) result = konviva.cancel_enrollment(data['enrollment_id'])

View File

@@ -13,7 +13,7 @@ from boto3clients import dynamodb_client
from config import USER_TABLE from config import USER_TABLE
logger = Logger(__name__) logger = Logger(__name__)
user_layer = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client) dyn = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
class UserNotFoundError(Exception): ... class UserNotFoundError(Exception): ...
@@ -43,7 +43,7 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
except Exception: except Exception:
raise raise
with user_layer.transact_writer() as transact: with dyn.transact_writer() as transact:
transact.update( transact.update(
key=KeyPair(new_image['id'], '0'), key=KeyPair(new_image['id'], '0'),
update_expr='SET metadata__konviva_user_id = :user_id, \ update_expr='SET metadata__konviva_user_id = :user_id, \

View File

@@ -12,7 +12,7 @@ from boto3clients import dynamodb_client
from config import ENROLLMENT_TABLE from config import ENROLLMENT_TABLE
logger = Logger(__name__) logger = Logger(__name__)
enrollment_layer = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client) dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
@event_source(data_class=EventBridgeEvent) @event_source(data_class=EventBridgeEvent)
@@ -32,7 +32,7 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
logger.exception(err) logger.exception(err)
return False return False
with enrollment_layer.transact_writer() as transact: with dyn.transact_writer() as transact:
transact.update( transact.update(
key=KeyPair(new_image['id'], 'konviva'), key=KeyPair(new_image['id'], 'konviva'),
update_expr='SET enrollment_id = :enrollment_id', update_expr='SET enrollment_id = :enrollment_id',

View File

@@ -4,14 +4,10 @@ from aws_lambda_powertools.utilities.data_classes import (
event_source, event_source,
) )
from aws_lambda_powertools.utilities.typing import LambdaContext from aws_lambda_powertools.utilities.typing import LambdaContext
from layercake.dynamodb import DynamoDBPersistenceLayer
import konviva import konviva
from boto3clients import dynamodb_client
from config import ENROLLMENT_TABLE
logger = Logger(__name__) logger = Logger(__name__)
enrollment_layer = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
@event_source(data_class=EventBridgeEvent) @event_source(data_class=EventBridgeEvent)

View File

@@ -14,7 +14,7 @@
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "METADATA#COURSE", "access_period": 360, "cert": {"exp_interval": 365}, "created_at": "2025-04-06T11:07:32.762178-03:00"} {"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "METADATA#COURSE", "access_period": 360, "cert": {"exp_interval": 365}, "created_at": "2025-04-06T11:07:32.762178-03:00"}
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "METADATA#DEDUPLICATION_WINDOW", "offset_days": 90, "created_at": "2025-04-06T11:07:32.762178-03:00"} {"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "METADATA#DEDUPLICATION_WINDOW", "offset_days": 90, "created_at": "2025-04-06T11:07:32.762178-03:00"}
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "SCHEDULE#REMINDER_ACCESS_PERIOD_BEFORE_30_DAYS"} {"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "SCHEDULE#REMINDER_ACCESS_PERIOD_BEFORE_30_DAYS"}
{"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "SCHEDULE#SET_AS_EXPIRED"} {"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "SCHEDULE#SET_ACCESS_EXPIRED"}
{"id": "cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae", "sk": "0", "progress": 109, "status": "COMPLETED", "user": {"id": "321", "name": "Chester Bennington"}, "course": {"id": "432", "name": "pytest"}, "created_at": "2022-04-06T11:07:32.762178-03:00"} {"id": "cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae", "sk": "0", "progress": 109, "status": "COMPLETED", "user": {"id": "321", "name": "Chester Bennington"}, "course": {"id": "432", "name": "pytest"}, "created_at": "2022-04-06T11:07:32.762178-03:00"}
{"id": "cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae", "sk": "METADATA#COURSE", "access_period": 360, "cert": {"exp_interval": 365}, "created_at": "2025-04-06T11:07:32.762178-03:00"} {"id": "cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae", "sk": "METADATA#COURSE", "access_period": 360, "cert": {"exp_interval": 365}, "created_at": "2025-04-06T11:07:32.762178-03:00"}

View File

@@ -1,3 +1,4 @@
import pprint
from http import HTTPMethod, HTTPStatus from http import HTTPMethod, HTTPStatus
from layercake.dateutils import now from layercake.dateutils import now
@@ -22,7 +23,7 @@ def test_start_progress(
'ID_MATRICULA': '123', 'ID_MATRICULA': '123',
'APROVEITAMENTO': '23.152173913043477', 'APROVEITAMENTO': '23.152173913043477',
'ANDAMENTO': '38.888888888888886', 'ANDAMENTO': '38.888888888888886',
'status': 'IN_PROGRESS', 'event_name': 'UPDATING',
}, },
), ),
lambda_context, lambda_context,
@@ -57,8 +58,7 @@ def test_update_progress(
'ID_MATRICULA': '456', 'ID_MATRICULA': '456',
'APROVEITAMENTO': '23.152173913043477', 'APROVEITAMENTO': '23.152173913043477',
'ANDAMENTO': '12.888888888888886', 'ANDAMENTO': '12.888888888888886',
'status': 'IN_PROGRESS', 'event_name': 'UPDATING',
'event': 'Matrícula - atualização de conteúdo',
}, },
), ),
lambda_context, lambda_context,
@@ -99,7 +99,7 @@ def test_set_as_completed(
'ID_MATRICULA': '567', 'ID_MATRICULA': '567',
'APROVEITAMENTO': '89.152173913043477', 'APROVEITAMENTO': '89.152173913043477',
'ANDAMENTO': '100', 'ANDAMENTO': '100',
'status': 'COMPLETED', 'event_name': 'COMPLETED',
}, },
), ),
lambda_context, lambda_context,
@@ -111,14 +111,14 @@ def test_set_as_completed(
PartitionKey('6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8') PartitionKey('6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8')
) )
assert len(r['items']) == 7 assert len(r['items']) == 8
assert any(item.get('sk') == 'COMPLETED' for item in r['items']) assert any(item.get('sk') == 'COMPLETED' for item in r['items'])
assert any(item.get('sk') == 'LOCK' for item in r['items']) assert any(item.get('sk') == 'LOCK' for item in r['items'])
assert any( assert any(
item.get('sk') == 'SCHEDULE#REMINDER_CERT_EXPIRATION_BEFORE_30_DAYS' item.get('sk') == 'SCHEDULE#REMINDER_CERT_EXPIRATION_BEFORE_30_DAYS'
for item in r['items'] for item in r['items']
) )
assert any(item.get('sk') == 'SCHEDULE#SET_AS_ARCHIVED' for item in r['items']) assert any(item.get('sk') == 'SCHEDULE#SET_CERT_EXPIRED' for item in r['items'])
r = dynamodb_persistence_layer.collection.query(PartitionKey('LOCK')) r = dynamodb_persistence_layer.collection.query(PartitionKey('LOCK'))
assert len(r['items']) == 1 assert len(r['items']) == 1
@@ -147,7 +147,7 @@ def test_set_as_failed(
'ID_MATRICULA': '567', 'ID_MATRICULA': '567',
'APROVEITAMENTO': '12.152173913043477', 'APROVEITAMENTO': '12.152173913043477',
'ANDAMENTO': '100', 'ANDAMENTO': '100',
'status': 'COMPLETED', 'event_name': 'COMPLETED',
}, },
), ),
lambda_context, lambda_context,
@@ -161,63 +161,63 @@ def test_set_as_failed(
assert any(item.get('sk') == 'FAILED' for item in r['items']) assert any(item.get('sk') == 'FAILED' for item in r['items'])
def test_set_as_archived( # def test_set_as_archived(
app, # app,
seeds, # seeds,
dynamodb_persistence_layer: DynamoDBPersistenceLayer, # dynamodb_persistence_layer: DynamoDBPersistenceLayer,
http_api_proxy: HttpApiProxy, # http_api_proxy: HttpApiProxy,
lambda_context: LambdaContext, # lambda_context: LambdaContext,
): # ):
# This data was added from seeds # # This data was added from seeds
r = app.lambda_handler( # r = app.lambda_handler(
http_api_proxy( # http_api_proxy(
raw_path='/', # raw_path='/',
method=HTTPMethod.POST, # method=HTTPMethod.POST,
body={ # body={
'ID_MATRICULA': '899', # 'ID_MATRICULA': '899',
'APROVEITAMENTO': '70', # 'APROVEITAMENTO': '70',
'ANDAMENTO': '100', # 'ANDAMENTO': '100',
'status': 'COMPLETED', # 'status': 'COMPLETED',
}, # },
), # ),
lambda_context, # lambda_context,
) # )
assert r['statusCode'] == HTTPStatus.NO_CONTENT # assert r['statusCode'] == HTTPStatus.NO_CONTENT
# Check `seeds.jsonl` for sample data related to this query # # Check `seeds.jsonl` for sample data related to this query
r = dynamodb_persistence_layer.collection.query( # r = dynamodb_persistence_layer.collection.query(
PartitionKey('cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae') # PartitionKey('cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae')
) # )
assert any(item.get('sk') == 'ARCHIVED' for item in r['items']) # assert any(item.get('sk') == 'ARCHIVED' for item in r['items'])
assert len(r['items']) == 4 # assert len(r['items']) == 4
def test_set_as_expired( # def test_set_as_expired(
app, # app,
seeds, # seeds,
dynamodb_persistence_layer: DynamoDBPersistenceLayer, # dynamodb_persistence_layer: DynamoDBPersistenceLayer,
http_api_proxy: HttpApiProxy, # http_api_proxy: HttpApiProxy,
lambda_context: LambdaContext, # lambda_context: LambdaContext,
): # ):
# This data was added from seeds # # This data was added from seeds
r = app.lambda_handler( # r = app.lambda_handler(
http_api_proxy( # http_api_proxy(
raw_path='/', # raw_path='/',
method=HTTPMethod.POST, # method=HTTPMethod.POST,
body={ # body={
'ID_MATRICULA': '221', # 'ID_MATRICULA': '221',
'APROVEITAMENTO': '69', # 'APROVEITAMENTO': '69',
'ANDAMENTO': '100', # 'ANDAMENTO': '100',
'status': 'COMPLETED', # 'status': 'COMPLETED',
}, # },
), # ),
lambda_context, # lambda_context,
) # )
assert r['statusCode'] == HTTPStatus.NO_CONTENT # assert r['statusCode'] == HTTPStatus.NO_CONTENT
# Check `seeds.jsonl` for sample data related to this query # # Check `seeds.jsonl` for sample data related to this query
r = dynamodb_persistence_layer.collection.query( # r = dynamodb_persistence_layer.collection.query(
PartitionKey('5db53b35-0bae-4907-afda-a213cb5bf651') # PartitionKey('5db53b35-0bae-4907-afda-a213cb5bf651')
) # )
assert any(item.get('sk') == 'EXPIRED' for item in r['items']) # assert any(item.get('sk') == 'EXPIRED' for item in r['items'])
assert len(r['items']) == 3 # assert len(r['items']) == 3