import base64 import gzip import json import time from datetime import datetime from typing import Dict, List from apollo_main_db.push_notifications.models import UserDeviceToken from handle_user_changes.constants import DSP_APP_NAME from handle_user_changes.handler import handler from handle_user_changes.logger import get_logger from tests.factories import UserDeviceFactory pytest_plugins = ['tests.fixtures.auth0_logs'] def create_aws_log_event(messages: List[Dict[str, str]]) -> dict: event_data = { 'logEvents': messages } log_event = { 'awslogs': { 'data': base64.b64encode( gzip.compress( json.dumps(event_data).encode('utf-8') ) ) } } return log_event def test_block_user(db_session, blocked_user_response, mocker, user_id, redis_client): UserDeviceFactory.create(user_id=user_id, is_active=True) mocker.patch('handle_user_changes.admin_api.get_markets', return_value=[]) mocker.patch('handle_user_changes.apollo_api.get_job_categories', return_value=[]) mocker.patch('handle_user_changes.intercom_api.upsert_users') aws_messages = [ {'message': json.dumps(blocked_user_response)}, ] event = create_aws_log_event(aws_messages) handler(event, redis_client, get_logger()) device = db_session.query(UserDeviceToken).filter_by(user_id=user_id).one() assert not device.is_active def test_block_then_unblock_user( db_session, blocked_user_response, unblocked_user_response, mocker, user_id, redis_client ): UserDeviceFactory.create(user_id=user_id, is_active=True) mocker.patch('handle_user_changes.admin_api.get_markets', return_value=[]) mocker.patch('handle_user_changes.apollo_api.get_job_categories', return_value=[]) mocker.patch('handle_user_changes.intercom_api.upsert_users') aws_messages = [ {'message': json.dumps(blocked_user_response)}, {'message': json.dumps(unblocked_user_response)}, ] event = create_aws_log_event(aws_messages) handler(event, redis_client, get_logger()) device = db_session.query(UserDeviceToken).filter_by(user_id=user_id).one() assert device.is_active def test_block_user_by_inactivity(db_session, blocked_user_by_inactivity_response, mocker, user_id, redis_client): UserDeviceFactory.create(user_id=user_id, is_active=True) mocker.patch('handle_user_changes.admin_api.get_markets', return_value=[]) mocker.patch('handle_user_changes.apollo_api.get_job_categories', return_value=[]) mocker.patch('handle_user_changes.intercom_api.upsert_users') aws_messages = [ {'message': json.dumps(blocked_user_by_inactivity_response)}, ] event = create_aws_log_event(aws_messages) handler(event, redis_client, get_logger()) device = db_session.query(UserDeviceToken).filter_by(user_id=user_id).one() assert not device.is_active def test_block_and_unblock_user_by_inactivity( db_session, blocked_user_by_inactivity_response, unblocked_user_response, mocker, user_id, redis_client ): UserDeviceFactory.create(user_id=user_id, is_active=True) mocker.patch('handle_user_changes.admin_api.get_markets', return_value=[]) mocker.patch('handle_user_changes.apollo_api.get_job_categories', return_value=[]) mocker.patch('handle_user_changes.intercom_api.upsert_users') aws_messages = [ {'message': json.dumps(blocked_user_by_inactivity_response)}, {'message': json.dumps(unblocked_user_response)}, ] event = create_aws_log_event(aws_messages) handler(event, redis_client, get_logger()) device = db_session.query(UserDeviceToken).filter_by(user_id=user_id).one() assert device.is_active def test_deleted_user(db_session, deleted_user_response, mocker, user_id, redis_client): UserDeviceFactory.create(user_id=user_id, is_active=True) mocker.patch('handle_user_changes.admin_api.get_markets', return_value=[]) mocker.patch('handle_user_changes.apollo_api.get_job_categories', return_value=[]) mocker.patch('handle_user_changes.intercom_api.upsert_users') aws_messages = [{'message': json.dumps(deleted_user_response)}] event = create_aws_log_event(aws_messages) handler(event, redis_client, get_logger()) device = db_session.query(UserDeviceToken).filter_by(user_id=user_id).one() assert not device.is_active def test_updated_job_category(db_session, updated_job_category_response, mocker, job_category, redis_client): job_categories = {job_category['id']: job_category['name']} mocker.patch('handle_user_changes.admin_api.get_markets', return_value=[]) mocker.patch('handle_user_changes.apollo_api.get_job_categories', return_value=job_categories) mocked_upsert_users_func = mocker.patch('handle_user_changes.intercom_api.upsert_users') aws_messages = [ {'message': json.dumps(updated_job_category_response)}, ] event = create_aws_log_event(aws_messages) handler(event, redis_client, get_logger()) mocked_upsert_users_func.assert_called_once() args, _ = mocked_upsert_users_func.call_args_list[0] users_chunk, _ = args first_user = users_chunk[0] assert first_user['custom_attributes']['Job Category ID'] == job_category['id'] assert first_user['custom_attributes']['Job Category Name'] == job_category['name'] def test_dump_users_changes_to_redis(db_session, update_user_response, mocker, user_id, redis_client): mocker.patch('handle_user_changes.admin_api.get_markets', return_value=[]) mocker.patch('handle_user_changes.apollo_api.get_job_categories', return_value=[]) mocker.patch('handle_user_changes.intercom_api.upsert_users') updated_at = datetime.now() timestamp = int(datetime.timestamp(updated_at)) # sleep 1 sec to avoid equal timestamps time.sleep(1) response = update_user_response(user_id, is_blocked=False, updated_at=datetime.now()) aws_messages = [{'message': json.dumps(response)}] event = create_aws_log_event(aws_messages) handler(event, redis_client, get_logger()) user_updated_at = redis_client.get(f"{DSP_APP_NAME}auth0:user_{user_id}:updated_at") user_details = redis_client.get(f"{DSP_APP_NAME}auth0:user_{user_id}:details") assert int(user_updated_at) > timestamp assert user_details == b'Update a user'