diff --git a/tests/test_data_model.py b/tests/test_data_model.py new file mode 100644 index 0000000..7ad56a4 --- /dev/null +++ b/tests/test_data_model.py @@ -0,0 +1,55 @@ +import pytest +from Whatsapp_Chat_Exporter.data_model import TimeZone, Timing +from datetime import timedelta + + +class TestTimeZone: + def test_utcoffset(self): + tz = TimeZone(5.5) + assert tz.utcoffset(None) == timedelta(hours=5.5) + + def test_dst(self): + tz = TimeZone(2) + assert tz.dst(None) == timedelta(0) + + +class TestTiming: + @pytest.mark.parametrize("offset, expected_hour", [ + (8, "08:00"), # Integer (e.g., Hong Kong Standard Time) + (-8, "16:00"), # Negative Integer (e.g., PST) + (5.5, "05:30"), # Positive Float (e.g., IST) + (-3.5, "20:30"), # Negative Float (e.g., Newfoundland) + ]) + + def test_format_timestamp_various_offsets(self, offset, expected_hour): + """Verify that both int and float offsets calculate time correctly.""" + t = Timing(offset) + result = t.format_timestamp(1672531200, "%H:%M") + assert result == expected_hour + + @pytest.mark.parametrize("ts_input", [ + 1672531200, # Unix timestamp as int + 1672531200.0, # Unix timestamp as float + ]) + + def test_timestamp_input_types(self, ts_input): + """Verify the method accepts both int and float timestamps.""" + t = Timing(0) + result = t.format_timestamp(ts_input, "%Y") + assert result == "2023" + + def test_timing_none_offset(self): + """Verify initialization with None doesn't crash and uses system time.""" + t = Timing(None) + assert t.tz is None + # Should still return a valid string based on local machine time without crashing + result = t.format_timestamp(1672531200, "%Y") + assert result == "2023" + + def test_millisecond_scaling(self): + """Verify that timestamps in milliseconds are correctly scaled down.""" + t = Timing(0) + # Milliseconds as int + assert t.format_timestamp(1672531200000, "%Y") == "2023" + # Milliseconds as float + assert t.format_timestamp(1672531200000.0, "%Y") == "2023"