mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	Sort of a hacky hammer, but * The original design of the analytics system mistakenly attempted to play nicely with non-UTC datetimes. * Timezone errors are really hard to find and debug, and don't jump out that easily when reading code. I don't know of any outstanding errors, but putting a few "assert this timezone is in UTC" around will hopefully reduce the chance that there are any current or future timezone errors. Note that none of these functions are called outside of the analytics code (and tests). This commit also doesn't change any current behavior, assuming a database where all datetimes have been being stored in UTC.
		
			
				
	
	
		
			47 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
 | 
						|
from django.utils.timezone import utc as timezone_utc
 | 
						|
 | 
						|
from zerver.lib.test_classes import ZulipTestCase
 | 
						|
from zerver.lib.timestamp import floor_to_hour, floor_to_day, ceiling_to_hour, \
 | 
						|
    ceiling_to_day, timestamp_to_datetime, datetime_to_timestamp, \
 | 
						|
    TimezoneNotUTCException, convert_to_UTC
 | 
						|
 | 
						|
from datetime import datetime, timedelta
 | 
						|
from dateutil import parser
 | 
						|
import pytz
 | 
						|
 | 
						|
from six.moves import zip
 | 
						|
 | 
						|
class TestTimestamp(ZulipTestCase):
 | 
						|
    def test_datetime_and_timestamp_conversions(self):
 | 
						|
        # type: () -> None
 | 
						|
        timestamp = 1483228800
 | 
						|
        for dt in [
 | 
						|
                parser.parse('2017-01-01 00:00:00.123 UTC'),
 | 
						|
                parser.parse('2017-01-01 00:00:00.123').replace(tzinfo=timezone_utc),
 | 
						|
                parser.parse('2017-01-01 00:00:00.123').replace(tzinfo=pytz.utc)]:
 | 
						|
            self.assertEqual(timestamp_to_datetime(timestamp), dt-timedelta(microseconds=123000))
 | 
						|
            self.assertEqual(datetime_to_timestamp(dt), timestamp)
 | 
						|
 | 
						|
        for dt in [
 | 
						|
                parser.parse('2017-01-01 00:00:00.123+01:00'),
 | 
						|
                parser.parse('2017-01-01 00:00:00.123')]:
 | 
						|
            with self.assertRaises(TimezoneNotUTCException):
 | 
						|
                datetime_to_timestamp(dt)
 | 
						|
 | 
						|
    def test_convert_to_UTC(self):
 | 
						|
        # type: () -> None
 | 
						|
        utc_datetime = parser.parse('2017-01-01 00:00:00.123 UTC')
 | 
						|
        for dt in [
 | 
						|
                parser.parse('2017-01-01 00:00:00.123').replace(tzinfo=timezone_utc),
 | 
						|
                parser.parse('2017-01-01 00:00:00.123'),
 | 
						|
                parser.parse('2017-01-01 05:00:00.123+05')]:
 | 
						|
            self.assertEqual(convert_to_UTC(dt), utc_datetime)
 | 
						|
 | 
						|
    def test_enforce_UTC(self):
 | 
						|
        # type: () -> None
 | 
						|
        non_utc_datetime = parser.parse('2017-01-01 00:00:00.123')
 | 
						|
        for function in [floor_to_hour, floor_to_day, ceiling_to_hour, ceiling_to_hour]:
 | 
						|
            with self.assertRaises(TimezoneNotUTCException):
 | 
						|
                function(non_utc_datetime)
 |