"""Tests for track_visit_events_handling service""" from datetime import datetime, timedelta import json from apollo_main_db.apollo.models import ApolloVisitLog import factory from tests.factories import ApolloVisitLogFactory from track_visit_events_handling import config from track_visit_events_handling.handler import cleanup_track_visit_logs, process_event, save_track_visits from track_visit_events_handling.logger import get_logger def test_cleanup_track_visit_logs(db_session): """Test for cleanup_track_visit_logs. """ instance_id = 100 user_id = "user_id_1" ApolloVisitLogFactory.create( created_at=datetime.utcnow() - timedelta(days=config.TRACK_VISITS_LOG_RETENTION_DAYS + 1)) ApolloVisitLogFactory.create( created_at=datetime.utcnow(), user_id=user_id, dsp_id=2, type_id=1, instance_id=instance_id) result = cleanup_track_visit_logs() assert result == 1 visit_list = db_session.query(ApolloVisitLog).all() assert len(visit_list) == 1 visit = visit_list[0] assert visit.dsp_id == 2 assert visit.type_id == 1 assert visit.instance_id == str(instance_id) assert visit.user_id == user_id def round_seconds(ts: datetime) -> datetime: if ts.microsecond >= 500000: ts += timedelta(seconds=1) return ts.replace(microsecond=0) def test_save_track_visits(db_session): """Test for save_track_visits.""" records = [ factory.build(dict, FACTORY_CLASS=ApolloVisitLogFactory), factory.build(dict, FACTORY_CLASS=ApolloVisitLogFactory), ] for r in records: del r["id"] records.append({"user_id": "user_id_1", "spotify_id": "track_id_1", "created_at": datetime.utcnow()}) records.append({"user_id": "user_id_2", "apple_id": 100, "spotify_id": None, "created_at": datetime.utcnow()}) save_track_visits(records) visits = db_session.query(ApolloVisitLog).all() assert len(records) == len(visits) for r in records: visit = next( v for v in visits if ( v.user_id == r["user_id"] and v.dsp_id == r["dsp_id"] and v.type_id == r["type_id"] and v.instance_id == str(r["instance_id"]) and v.created_at == round_seconds(r["created_at"]) ) ) assert visit def test_process_event(mocker): """Test process_event. """ mocked_cleanup = mocker.patch("track_visit_events_handling.handler.cleanup_track_visit_logs", return_value=0) mocker_save = mocker.patch("track_visit_events_handling.handler.save_track_visits") logger = get_logger("test") records = [{"r1": 1}, {"r2": 2}] event = {"Records": [{"body": json.dumps(r)} for r in records]} process_event(logger, event) mocked_cleanup.assert_called_once() mocker_save.assert_called_once_with(records)