This commit is contained in:
2025-12-03 12:50:48 -03:00
parent ffa9565ab8
commit af45be7083
3 changed files with 51 additions and 6 deletions

View File

@@ -101,7 +101,6 @@ def _create_user(*, user: User, password: str):
'sk': f'emails#{user.email}',
'email_verified': False,
'email_primary': True,
'mx_record_exists': False,
'created_at': now_,
}
)
@@ -145,13 +144,17 @@ def _update_user(*, old_user: User, new_user: User, password: str):
key=KeyPair(new_user.id, '0'),
update_expr='SET #name = :name, \
email = :email, \
updated_at = :now',
email_verified = :false, \
updated_at = :now \
ADD emails :emails', # Makes the email searchable
expr_attr_names={
'#name': 'name',
},
expr_attr_values={
':name': new_user.name,
':email': new_user.email,
':emails': {new_user.email},
':false': False,
':now': now_,
},
cond_expr='attribute_exists(sk)',
@@ -178,7 +181,6 @@ def _update_user(*, old_user: User, new_user: User, password: str):
'sk': f'emails#{new_user.email}',
'email_verified': False,
'email_primary': True,
'mx_record_exists': False,
'created_at': now_,
}
)

View File

@@ -1,7 +1,7 @@
import json
from http import HTTPMethod, HTTPStatus
from layercake.dynamodb import DynamoDBPersistenceLayer
from layercake.dynamodb import DynamoDBPersistenceLayer, SortKey, TransactKey
from ..conftest import HttpApiProxy, LambdaContext
@@ -31,7 +31,7 @@ def test_preexisting_user(
assert r['statusCode'] == HTTPStatus.OK
def test_preexisting_update_email(
def test_preexisting_user_conflict(
app,
seeds,
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
@@ -58,6 +58,47 @@ def test_preexisting_update_email(
assert r['statusCode'] == HTTPStatus.CONFLICT
def test_preexisting_user_update_email(
app,
seeds,
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
http_api_proxy: HttpApiProxy,
lambda_context: LambdaContext,
):
r = app.lambda_handler(
http_api_proxy(
raw_path='/register',
method=HTTPMethod.POST,
body={
'id': '357db1c5-7442-4075-98a3-fbe5c938a419',
'name': 'Sérgio R Siqueira',
'cpf': '07879819908',
'password': 'Led@Zepellin',
'email': 'osergiosiqueira+pytest@gmail.com',
},
),
lambda_context,
)
assert r['statusCode'] == HTTPStatus.OK
user = dynamodb_persistence_layer.collection.get_items(
TransactKey(
'357db1c5-7442-4075-98a3-fbe5c938a419',
)
+ SortKey('0')
+ SortKey('emails#osergiosiqueira+pytest@gmail.com')
+ SortKey('emails#sergio@somosbeta.com.br'),
flatten_top=False,
)
assert user['0']['email'] == 'osergiosiqueira+pytest@gmail.com'
assert 'emails#osergiosiqueira+pytest@gmail.com' in user
assert 'emails#sergio@somosbeta.com.br' in user
assert user['0']['emails'] == {
'sergio@somosbeta.com.br',
'osergiosiqueira+pytest@gmail.com',
}
def test_non_preexisting_user(
app,
dynamodb_persistence_layer: DynamoDBPersistenceLayer,

View File

@@ -12,7 +12,9 @@
{"id": "SESSION", "sk": "36af142e-9f6d-49d3-bfe9-6a6bd6ab2712", "user_id": "357db1c5-7442-4075-98a3-fbe5c938a419"}
// User data
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "0", "name": "Sérgio R Siqueira", "email": "sergio@somosbeta.com.br", "cpf": "07879819908"}
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "0", "name": "Sérgio R Siqueira", "email": "sergio@somosbeta.com.br", "cpf": "07879819908", "emails": ["sergio@somosbeta.com.br"]}
// Post-migrations (users): rename `emails#` to `EMAIL#`
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "emails#sergio@somosbeta.com.br", "email_verified": true}
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "PASSWORD", "hash": "$pbkdf2-sha256$29000$IuTcm7M2BiAEgPB.b.3dGw$d8xVCbx8zxg7MeQBrOvCOgniiilsIHEMHzoH/OXftLQ"}
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "SCOPE", "scope": ["openid", "profile", "email", "offline_access", "apps:admin"]}
{"id": "357db1c5-7442-4075-98a3-fbe5c938a419", "sk": "SESSION#36af142e-9f6d-49d3-bfe9-6a6bd6ab2712", "created_at": "2025-09-17T13:44:34.544491-03:00", "ttl": 1760719474}