from __future__ import annotations from datetime import UTC, datetime, timedelta from uuid import uuid4 from generalresearch.models.thl.user_iphistory import ( UserIPHistory, UserIPRecord, ) from generalresearch.models.thl.user_ref import UserRef def test_collapse_ip_records(): # This does not exist in a db, so we do not need fixtures/ real user ids, whatever now = datetime.now(tz=UTC) - timedelta(days=1) # Gets stored most recent first. This is reversed, but the validator will order it records = [ UserIPRecord(ip="1.2.3.5", created=now + timedelta(minutes=1)), UserIPRecord( ip="1e5c:de49:165a:6aa0:4f89:1433:9af7:aaaa", created=now + timedelta(minutes=2), ), UserIPRecord( ip="1e5c:de49:165a:6aa0:4f89:1433:9af7:bbbb", created=now + timedelta(minutes=3), ), UserIPRecord(ip="1.2.3.5", created=now + timedelta(minutes=4)), UserIPRecord( ip="1e5c:de49:165a:6aa0:4f89:1433:9af7:cccc", created=now + timedelta(minutes=5), ), UserIPRecord( ip="6666:de49:165a:6aa0:4f89:1433:9af7:aaaa", created=now + timedelta(minutes=6), ), UserIPRecord(ip="1.2.3.6", created=now + timedelta(minutes=7)), ] iph = UserIPHistory( user=UserRef(user_id=1, product_user_id=uuid4().hex, product_id=uuid4().hex), ips=records, ) res = iph.collapse_ip_records() # We should be left with one of the 1.2.3.5 ipv4s, # and only the 1e5c::cccc and the 6666 ipv6 addresses assert len(res) == 4 assert [x.ip for x in res] == [ "1.2.3.6", "6666:de49:165a:6aa0:4f89:1433:9af7:aaaa", "1e5c:de49:165a:6aa0:4f89:1433:9af7:cccc", "1.2.3.5", ]