import gzip import io import unittest from datetime import datetime, timezone from unittest.mock import Mock from parameterized import parameterized from slz_downloader.dsp.spotify.partneremails import PartnerEmailsStringIO @unittest.mock.patch( 'slz_downloader.dsp.spotify.partneremails.datetime', wraps=datetime, now=lambda x: datetime(year=2019, month=12, day=5, tzinfo=timezone.utc) ) class TestIO(unittest.TestCase): def test_correct_remove_date_column(self, datetime_mock): test_string = '1@gmail.com\t1997-11-10\tmale\tMX\n' * 1000 expected_test_string = '1@gmail.com\tmale\tMX\n' * 1000 compr_result = bytes(test_string, 'utf-8') for chunk in range(1, 100, 7): raw_obj = PartnerEmailsStringIO(Mock(), io.BytesIO(compr_result)) result = b"" while True: chunk_data = raw_obj.read(chunk) if not chunk_data: break result += chunk_data dec = gzip.decompress(result) self.assertEqual(dec.decode(), expected_test_string) def test_correct_remove_under_13yo(self, datetime_mock): test_string = '1@gmail.com\t1987-11-10\tmale\tMX\n2@gmail.com\t2015-11-10\tfemale\tUA\n' * 500 expected_test_string = '1@gmail.com\tmale\tMX\n' * 500 compr_result = bytes(test_string, 'utf-8') chunk = 50 raw_obj = PartnerEmailsStringIO(Mock(), io.BytesIO(compr_result)) result = b"" while True: chunk_data = raw_obj.read(chunk) if not chunk_data: break result += chunk_data dec = gzip.decompress(result) self.assertEqual(dec.decode(), expected_test_string) def test_correct_skip_if_date_blank(self, datetime_mock): test_string = '1@gmail.com\t1987-11-10\tmale\tMX\n2@gmail.com\t\tfemale\tUA\t\t\n' * 500 expected_test_string = '1@gmail.com\tmale\tMX\n2@gmail.com\tfemale\tUA\t\t\n' * 500 compr_result = bytes(test_string, 'utf-8') chunk = 50 raw_obj = PartnerEmailsStringIO(Mock(), io.BytesIO(compr_result)) result = b"" while True: chunk_data = raw_obj.read(chunk) if not chunk_data: break result += chunk_data dec = gzip.decompress(result) self.assertEqual(dec.decode(), expected_test_string) class TestDataCalc(unittest.TestCase): @parameterized.expand( [ # birthday is today ( datetime(year=2019, month=9, day=5, tzinfo=timezone.utc), datetime(year=2017, month=9, day=5, tzinfo=timezone.utc).date(), 2 ), # few days/month before birthday ( datetime(year=2019, month=9, day=5, tzinfo=timezone.utc), datetime(year=2017, month=9, day=15, tzinfo=timezone.utc).date(), 1 ), ( datetime(year=2019, month=9, day=5, tzinfo=timezone.utc), datetime(year=2017, month=11, day=1, tzinfo=timezone.utc).date(), 1 ), # few days/month after birthday ( datetime(year=2019, month=9, day=5, tzinfo=timezone.utc), datetime(year=2017, month=9, day=1, tzinfo=timezone.utc).date(), 2 ), ( datetime(year=2019, month=9, day=5, tzinfo=timezone.utc), datetime(year=2017, month=7, day=15, tzinfo=timezone.utc).date(), 2 ), # born in leap year # this year is leap year ( datetime(year=2020, month=2, day=29, tzinfo=timezone.utc), datetime(year=2016, month=2, day=29, tzinfo=timezone.utc).date(), 4 ), # this year is not a leap year ( datetime(year=2019, month=2, day=28, tzinfo=timezone.utc), datetime(year=2016, month=2, day=29, tzinfo=timezone.utc).date(), 2 ), ( datetime(year=2019, month=3, day=1, tzinfo=timezone.utc), datetime(year=2016, month=2, day=29, tzinfo=timezone.utc).date(), 3 ), ] ) def test_age(self, _now, birth_date, expected_age): raw_obj = PartnerEmailsStringIO(Mock(), Mock()) raw_obj._now = _now age = raw_obj._calculate_age(birth_date) self.assertEqual(age, expected_age)