Use aware UTC datetimes internally (#887)

In lieu of Python v3.12 deprecation warnings
This commit is contained in:
Ville Skyttä 2023-06-14 23:39:34 +03:00 committed by GitHub
parent 3346977297
commit 3d36108446
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 84 additions and 54 deletions

View File

@ -43,6 +43,7 @@ from email import charset
from socket import error as SocketError from socket import error as SocketError
from datetime import datetime from datetime import datetime
from datetime import timezone
from .NotifyBase import NotifyBase from .NotifyBase import NotifyBase
from ..URLBase import PrivacyMode from ..URLBase import PrivacyMode
@ -805,7 +806,8 @@ class NotifyEmail(NotifyBase):
base['To'] = formataddr((to_name, to_addr), charset='utf-8') base['To'] = formataddr((to_name, to_addr), charset='utf-8')
base['Message-ID'] = make_msgid(domain=self.smtp_host) base['Message-ID'] = make_msgid(domain=self.smtp_host)
base['Date'] = \ base['Date'] = \
datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S +0000") datetime.now(timezone.utc)\
.strftime("%a, %d %b %Y %H:%M:%S +0000")
base['X-Application'] = self.app_id base['X-Application'] = self.app_id
if cc: if cc:

View File

@ -47,6 +47,7 @@ from cryptography.hazmat.primitives import asymmetric
from cryptography.exceptions import UnsupportedAlgorithm from cryptography.exceptions import UnsupportedAlgorithm
from datetime import datetime from datetime import datetime
from datetime import timedelta from datetime import timedelta
from datetime import timezone
from json.decoder import JSONDecodeError from json.decoder import JSONDecodeError
from urllib.parse import urlencode as _urlencode from urllib.parse import urlencode as _urlencode
@ -106,7 +107,7 @@ class GoogleOAuth:
# Our keys we build using the provided content # Our keys we build using the provided content
self.__refresh_token = None self.__refresh_token = None
self.__access_token = None self.__access_token = None
self.__access_token_expiry = datetime.utcnow() self.__access_token_expiry = datetime.now(timezone.utc)
def load(self, path): def load(self, path):
""" """
@ -117,7 +118,7 @@ class GoogleOAuth:
self.content = None self.content = None
self.private_key = None self.private_key = None
self.__access_token = None self.__access_token = None
self.__access_token_expiry = datetime.utcnow() self.__access_token_expiry = datetime.now(timezone.utc)
try: try:
with open(path, mode="r", encoding=self.encoding) as fp: with open(path, mode="r", encoding=self.encoding) as fp:
@ -199,7 +200,7 @@ class GoogleOAuth:
'token with.') 'token with.')
return None return None
if self.__access_token_expiry > datetime.utcnow(): if self.__access_token_expiry > datetime.now(timezone.utc):
# Return our no-expired key # Return our no-expired key
return self.__access_token return self.__access_token
@ -209,7 +210,7 @@ class GoogleOAuth:
key_identifier = self.content.get('private_key_id') key_identifier = self.content.get('private_key_id')
# Generate our Assertion # Generate our Assertion
now = datetime.utcnow() now = datetime.now(timezone.utc)
expiry = now + self.access_token_lifetime_sec expiry = now + self.access_token_lifetime_sec
payload = { payload = {
@ -301,7 +302,7 @@ class GoogleOAuth:
if 'expires_in' in response: if 'expires_in' in response:
delta = timedelta(seconds=int(response['expires_in'])) delta = timedelta(seconds=int(response['expires_in']))
self.__access_token_expiry = \ self.__access_token_expiry = \
delta + datetime.utcnow() - self.clock_skew delta + datetime.now(timezone.utc) - self.clock_skew
else: else:
# Allow some grace before we expire # Allow some grace before we expire

View File

@ -50,6 +50,7 @@ import requests
from json import loads from json import loads
from json import dumps from json import dumps
from datetime import datetime from datetime import datetime
from datetime import timezone
from .NotifyBase import NotifyBase from .NotifyBase import NotifyBase
from ..common import NotifyImageSize from ..common import NotifyImageSize
@ -99,7 +100,7 @@ class NotifyGitter(NotifyBase):
request_rate_per_sec = 0 request_rate_per_sec = 0
# For Tracking Purposes # For Tracking Purposes
ratelimit_reset = datetime.utcnow() ratelimit_reset = datetime.now(timezone.utc).replace(tzinfo=None)
# Default to 1 # Default to 1
ratelimit_remaining = 1 ratelimit_remaining = 1
@ -298,7 +299,7 @@ class NotifyGitter(NotifyBase):
# Gitter server. One would hope we're on NTP and our clocks are # Gitter server. One would hope we're on NTP and our clocks are
# the same allowing this to role smoothly: # the same allowing this to role smoothly:
now = datetime.utcnow() now = datetime.now(timezone.utc).replace(tzinfo=None)
if now < self.ratelimit_reset: if now < self.ratelimit_reset:
# We need to throttle for the difference in seconds # We need to throttle for the difference in seconds
# We add 0.5 seconds to the end just to allow a grace # We add 0.5 seconds to the end just to allow a grace
@ -350,8 +351,9 @@ class NotifyGitter(NotifyBase):
try: try:
self.ratelimit_remaining = \ self.ratelimit_remaining = \
int(r.headers.get('X-RateLimit-Remaining')) int(r.headers.get('X-RateLimit-Remaining'))
self.ratelimit_reset = datetime.utcfromtimestamp( self.ratelimit_reset = datetime.fromtimestamp(
int(r.headers.get('X-RateLimit-Reset'))) int(r.headers.get('X-RateLimit-Reset')), timezone.utc
).replace(tzinfo=None)
except (TypeError, ValueError): except (TypeError, ValueError):
# This is returned if we could not retrieve this information # This is returned if we could not retrieve this information

View File

@ -35,6 +35,7 @@ import requests
from copy import deepcopy from copy import deepcopy
from json import dumps, loads from json import dumps, loads
from datetime import datetime from datetime import datetime
from datetime import timezone
from .NotifyBase import NotifyBase from .NotifyBase import NotifyBase
from ..URLBase import PrivacyMode from ..URLBase import PrivacyMode
@ -150,7 +151,7 @@ class NotifyMastodon(NotifyBase):
request_rate_per_sec = 0 request_rate_per_sec = 0
# For Tracking Purposes # For Tracking Purposes
ratelimit_reset = datetime.utcnow() ratelimit_reset = datetime.now(timezone.utc).replace(tzinfo=None)
# Default to 1000; users can send up to 1000 DM's and 2400 toot a day # Default to 1000; users can send up to 1000 DM's and 2400 toot a day
# This value only get's adjusted if the server sets it that way # This value only get's adjusted if the server sets it that way
@ -834,7 +835,7 @@ class NotifyMastodon(NotifyBase):
# Mastodon server. One would hope we're on NTP and our clocks are # Mastodon server. One would hope we're on NTP and our clocks are
# the same allowing this to role smoothly: # the same allowing this to role smoothly:
now = datetime.utcnow() now = datetime.now(timezone.utc).replace(tzinfo=None)
if now < self.ratelimit_reset: if now < self.ratelimit_reset:
# We need to throttle for the difference in seconds # We need to throttle for the difference in seconds
# We add 0.5 seconds to the end just to allow a grace # We add 0.5 seconds to the end just to allow a grace
@ -892,8 +893,9 @@ class NotifyMastodon(NotifyBase):
# Capture rate limiting if possible # Capture rate limiting if possible
self.ratelimit_remaining = \ self.ratelimit_remaining = \
int(r.headers.get('X-RateLimit-Remaining')) int(r.headers.get('X-RateLimit-Remaining'))
self.ratelimit_reset = datetime.utcfromtimestamp( self.ratelimit_reset = datetime.fromtimestamp(
int(r.headers.get('X-RateLimit-Limit'))) int(r.headers.get('X-RateLimit-Limit')), timezone.utc
).replace(tzinfo=None)
except (TypeError, ValueError): except (TypeError, ValueError):
# This is returned if we could not retrieve this information # This is returned if we could not retrieve this information

View File

@ -56,6 +56,7 @@ import requests
from json import loads from json import loads
from datetime import timedelta from datetime import timedelta
from datetime import datetime from datetime import datetime
from datetime import timezone
from .NotifyBase import NotifyBase from .NotifyBase import NotifyBase
from ..URLBase import PrivacyMode from ..URLBase import PrivacyMode
@ -134,7 +135,7 @@ class NotifyReddit(NotifyBase):
request_rate_per_sec = 0 request_rate_per_sec = 0
# For Tracking Purposes # For Tracking Purposes
ratelimit_reset = datetime.utcnow() ratelimit_reset = datetime.now(timezone.utc).replace(tzinfo=None)
# Default to 1.0 # Default to 1.0
ratelimit_remaining = 1.0 ratelimit_remaining = 1.0
@ -275,7 +276,7 @@ class NotifyReddit(NotifyBase):
# Our keys we build using the provided content # Our keys we build using the provided content
self.__refresh_token = None self.__refresh_token = None
self.__access_token = None self.__access_token = None
self.__access_token_expiry = datetime.utcnow() self.__access_token_expiry = datetime.now(timezone.utc)
self.kind = kind.strip().lower() \ self.kind = kind.strip().lower() \
if isinstance(kind, str) \ if isinstance(kind, str) \
@ -417,10 +418,10 @@ class NotifyReddit(NotifyBase):
if 'expires_in' in response: if 'expires_in' in response:
delta = timedelta(seconds=int(response['expires_in'])) delta = timedelta(seconds=int(response['expires_in']))
self.__access_token_expiry = \ self.__access_token_expiry = \
delta + datetime.utcnow() - self.clock_skew delta + datetime.now(timezone.utc) - self.clock_skew
else: else:
self.__access_token_expiry = self.access_token_lifetime_sec + \ self.__access_token_expiry = self.access_token_lifetime_sec + \
datetime.utcnow() - self.clock_skew datetime.now(timezone.utc) - self.clock_skew
# The Refresh Token # The Refresh Token
self.__refresh_token = response.get( self.__refresh_token = response.get(
@ -547,7 +548,7 @@ class NotifyReddit(NotifyBase):
# Gitter server. One would hope we're on NTP and our clocks are # Gitter server. One would hope we're on NTP and our clocks are
# the same allowing this to role smoothly: # the same allowing this to role smoothly:
now = datetime.utcnow() now = datetime.now(timezone.utc).replace(tzinfo=None)
if now < self.ratelimit_reset: if now < self.ratelimit_reset:
# We need to throttle for the difference in seconds # We need to throttle for the difference in seconds
wait = abs( wait = abs(
@ -671,8 +672,9 @@ class NotifyReddit(NotifyBase):
self.ratelimit_remaining = \ self.ratelimit_remaining = \
float(r.headers.get( float(r.headers.get(
'X-RateLimit-Remaining')) 'X-RateLimit-Remaining'))
self.ratelimit_reset = datetime.utcfromtimestamp( self.ratelimit_reset = datetime.fromtimestamp(
int(r.headers.get('X-RateLimit-Reset'))) int(r.headers.get('X-RateLimit-Reset')), timezone.utc
).replace(tzinfo=None)
except (TypeError, ValueError): except (TypeError, ValueError):
# This is returned if we could not retrieve this information # This is returned if we could not retrieve this information

View File

@ -89,6 +89,7 @@ import base64
import requests import requests
from hashlib import sha256 from hashlib import sha256
from datetime import datetime from datetime import datetime
from datetime import timezone
from collections import OrderedDict from collections import OrderedDict
from xml.etree import ElementTree from xml.etree import ElementTree
from email.mime.text import MIMEText from email.mime.text import MIMEText
@ -436,7 +437,8 @@ class NotifySES(NotifyBase):
base['Reply-To'] = formataddr(reply_to, charset='utf-8') base['Reply-To'] = formataddr(reply_to, charset='utf-8')
base['Cc'] = ','.join(cc) base['Cc'] = ','.join(cc)
base['Date'] = \ base['Date'] = \
datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S +0000") datetime.now(
timezone.utc).strftime("%a, %d %b %Y %H:%M:%S +0000")
base['X-Application'] = self.app_id base['X-Application'] = self.app_id
if attach: if attach:
@ -585,7 +587,7 @@ class NotifySES(NotifyBase):
} }
# Get a reference time (used for header construction) # Get a reference time (used for header construction)
reference = datetime.utcnow() reference = datetime.now(timezone.utc)
# Provide Content-Length # Provide Content-Length
headers['Content-Length'] = str(len(payload)) headers['Content-Length'] = str(len(payload))

View File

@ -35,6 +35,7 @@ import hmac
import requests import requests
from hashlib import sha256 from hashlib import sha256
from datetime import datetime from datetime import datetime
from datetime import timezone
from collections import OrderedDict from collections import OrderedDict
from xml.etree import ElementTree from xml.etree import ElementTree
from itertools import chain from itertools import chain
@ -396,7 +397,7 @@ class NotifySNS(NotifyBase):
} }
# Get a reference time (used for header construction) # Get a reference time (used for header construction)
reference = datetime.utcnow() reference = datetime.now(timezone.utc)
# Provide Content-Length # Provide Content-Length
headers['Content-Length'] = str(len(payload)) headers['Content-Length'] = str(len(payload))

View File

@ -36,6 +36,7 @@ import re
import requests import requests
from copy import deepcopy from copy import deepcopy
from datetime import datetime from datetime import datetime
from datetime import timezone
from requests_oauthlib import OAuth1 from requests_oauthlib import OAuth1
from json import dumps from json import dumps
from json import loads from json import loads
@ -124,7 +125,7 @@ class NotifyTwitter(NotifyBase):
request_rate_per_sec = 0 request_rate_per_sec = 0
# For Tracking Purposes # For Tracking Purposes
ratelimit_reset = datetime.utcnow() ratelimit_reset = datetime.now(timezone.utc).replace(tzinfo=None)
# Default to 1000; users can send up to 1000 DM's and 2400 tweets a day # Default to 1000; users can send up to 1000 DM's and 2400 tweets a day
# This value only get's adjusted if the server sets it that way # This value only get's adjusted if the server sets it that way
@ -678,7 +679,7 @@ class NotifyTwitter(NotifyBase):
# Twitter server. One would hope we're on NTP and our clocks are # Twitter server. One would hope we're on NTP and our clocks are
# the same allowing this to role smoothly: # the same allowing this to role smoothly:
now = datetime.utcnow() now = datetime.now(timezone.utc).replace(tzinfo=None)
if now < self.ratelimit_reset: if now < self.ratelimit_reset:
# We need to throttle for the difference in seconds # We need to throttle for the difference in seconds
# We add 0.5 seconds to the end just to allow a grace # We add 0.5 seconds to the end just to allow a grace
@ -736,8 +737,9 @@ class NotifyTwitter(NotifyBase):
# Capture rate limiting if possible # Capture rate limiting if possible
self.ratelimit_remaining = \ self.ratelimit_remaining = \
int(r.headers.get('x-rate-limit-remaining')) int(r.headers.get('x-rate-limit-remaining'))
self.ratelimit_reset = datetime.utcfromtimestamp( self.ratelimit_reset = datetime.fromtimestamp(
int(r.headers.get('x-rate-limit-reset'))) int(r.headers.get('x-rate-limit-reset')), timezone.utc
).replace(tzinfo=None)
except (TypeError, ValueError): except (TypeError, ValueError):
# This is returned if we could not retrieve this information # This is returned if we could not retrieve this information

View File

@ -40,6 +40,7 @@ from helpers import AppriseURLTester
from json import dumps from json import dumps
from datetime import datetime from datetime import datetime
from datetime import timezone
# Disable logging for a cleaner testing output # Disable logging for a cleaner testing output
import logging import logging
@ -156,13 +157,14 @@ def test_plugin_gitter_general(mock_post, mock_get):
] ]
# Epoch time: # Epoch time:
epoch = datetime.utcfromtimestamp(0) epoch = datetime.fromtimestamp(0, timezone.utc)
request = mock.Mock() request = mock.Mock()
request.content = dumps(response_obj) request.content = dumps(response_obj)
request.status_code = requests.codes.ok request.status_code = requests.codes.ok
request.headers = { request.headers = {
'X-RateLimit-Reset': (datetime.utcnow() - epoch).total_seconds(), 'X-RateLimit-Reset': (
datetime.now(timezone.utc) - epoch).total_seconds(),
'X-RateLimit-Remaining': 1, 'X-RateLimit-Remaining': 1,
} }
@ -211,21 +213,21 @@ def test_plugin_gitter_general(mock_post, mock_get):
# Return our object, but place it in the future forcing us to block # Return our object, but place it in the future forcing us to block
request.headers['X-RateLimit-Reset'] = \ request.headers['X-RateLimit-Reset'] = \
(datetime.utcnow() - epoch).total_seconds() + 1 (datetime.now(timezone.utc) - epoch).total_seconds() + 1
request.headers['X-RateLimit-Remaining'] = 0 request.headers['X-RateLimit-Remaining'] = 0
obj.ratelimit_remaining = 0 obj.ratelimit_remaining = 0
assert obj.send(body="test") is True assert obj.send(body="test") is True
# Return our object, but place it in the future forcing us to block # Return our object, but place it in the future forcing us to block
request.headers['X-RateLimit-Reset'] = \ request.headers['X-RateLimit-Reset'] = \
(datetime.utcnow() - epoch).total_seconds() - 1 (datetime.now(timezone.utc) - epoch).total_seconds() - 1
request.headers['X-RateLimit-Remaining'] = 0 request.headers['X-RateLimit-Remaining'] = 0
obj.ratelimit_remaining = 0 obj.ratelimit_remaining = 0
assert obj.send(body="test") is True assert obj.send(body="test") is True
# Return our limits to always work # Return our limits to always work
request.headers['X-RateLimit-Reset'] = \ request.headers['X-RateLimit-Reset'] = \
(datetime.utcnow() - epoch).total_seconds() (datetime.now(timezone.utc) - epoch).total_seconds()
request.headers['X-RateLimit-Remaining'] = 1 request.headers['X-RateLimit-Remaining'] = 1
obj.ratelimit_remaining = 1 obj.ratelimit_remaining = 1

View File

@ -36,6 +36,7 @@ from unittest import mock
import requests import requests
from json import dumps, loads from json import dumps, loads
from datetime import datetime from datetime import datetime
from datetime import timezone
from apprise import Apprise from apprise import Apprise
from apprise import NotifyType from apprise import NotifyType
from apprise import AppriseAttachment from apprise import AppriseAttachment
@ -175,13 +176,14 @@ def test_plugin_mastodon_general(mock_post, mock_get):
} }
# Epoch time: # Epoch time:
epoch = datetime.utcfromtimestamp(0) epoch = datetime.fromtimestamp(0, timezone.utc)
request = mock.Mock() request = mock.Mock()
request.content = dumps(response_obj) request.content = dumps(response_obj)
request.status_code = requests.codes.ok request.status_code = requests.codes.ok
request.headers = { request.headers = {
'X-RateLimit-Limit': (datetime.utcnow() - epoch).total_seconds(), 'X-RateLimit-Limit': (
datetime.now(timezone.utc) - epoch).total_seconds(),
'X-RateLimit-Remaining': 1, 'X-RateLimit-Remaining': 1,
} }
@ -231,21 +233,21 @@ def test_plugin_mastodon_general(mock_post, mock_get):
# Return our object, but place it in the future forcing us to block # Return our object, but place it in the future forcing us to block
request.headers['X-RateLimit-Limit'] = \ request.headers['X-RateLimit-Limit'] = \
(datetime.utcnow() - epoch).total_seconds() + 1 (datetime.now(timezone.utc) - epoch).total_seconds() + 1
request.headers['X-RateLimit-Remaining'] = 0 request.headers['X-RateLimit-Remaining'] = 0
obj.ratelimit_remaining = 0 obj.ratelimit_remaining = 0
assert obj.send(body="test") is True assert obj.send(body="test") is True
# Return our object, but place it in the future forcing us to block # Return our object, but place it in the future forcing us to block
request.headers['X-RateLimit-Limit'] = \ request.headers['X-RateLimit-Limit'] = \
(datetime.utcnow() - epoch).total_seconds() - 1 (datetime.now(timezone.utc) - epoch).total_seconds() - 1
request.headers['X-RateLimit-Remaining'] = 0 request.headers['X-RateLimit-Remaining'] = 0
obj.ratelimit_remaining = 0 obj.ratelimit_remaining = 0
assert obj.send(body="test") is True assert obj.send(body="test") is True
# Return our limits to always work # Return our limits to always work
request.headers['X-RateLimit-Limit'] = \ request.headers['X-RateLimit-Limit'] = \
(datetime.utcnow() - epoch).total_seconds() (datetime.now(timezone.utc) - epoch).total_seconds()
request.headers['X-RateLimit-Remaining'] = 1 request.headers['X-RateLimit-Remaining'] = 1
obj.ratelimit_remaining = 1 obj.ratelimit_remaining = 1

View File

@ -39,6 +39,7 @@ from unittest import mock
from json import dumps from json import dumps
from datetime import datetime from datetime import datetime
from datetime import timedelta from datetime import timedelta
from datetime import timezone
# Disable logging for a cleaner testing output # Disable logging for a cleaner testing output
import logging import logging
@ -250,7 +251,7 @@ def test_plugin_reddit_general(mock_post):
} }
# Epoch time: # Epoch time:
epoch = datetime.utcfromtimestamp(0) epoch = datetime.fromtimestamp(0, timezone.utc)
good_response = mock.Mock() good_response = mock.Mock()
good_response.content = dumps({ good_response.content = dumps({
@ -267,7 +268,8 @@ def test_plugin_reddit_general(mock_post):
}) })
good_response.status_code = requests.codes.ok good_response.status_code = requests.codes.ok
good_response.headers = { good_response.headers = {
'X-RateLimit-Reset': (datetime.utcnow() - epoch).total_seconds(), 'X-RateLimit-Reset': (
datetime.now(timezone.utc) - epoch).total_seconds(),
'X-RateLimit-Remaining': 1, 'X-RateLimit-Remaining': 1,
} }
@ -296,7 +298,8 @@ def test_plugin_reddit_general(mock_post):
# Force a case where there are no more remaining posts allowed # Force a case where there are no more remaining posts allowed
good_response.headers = { good_response.headers = {
'X-RateLimit-Reset': (datetime.utcnow() - epoch).total_seconds(), 'X-RateLimit-Reset': (
datetime.now(timezone.utc) - epoch).total_seconds(),
'X-RateLimit-Remaining': 0, 'X-RateLimit-Remaining': 0,
} }
# behind the scenes, it should cause us to update our rate limit # behind the scenes, it should cause us to update our rate limit
@ -305,7 +308,8 @@ def test_plugin_reddit_general(mock_post):
# This should cause us to block # This should cause us to block
good_response.headers = { good_response.headers = {
'X-RateLimit-Reset': (datetime.utcnow() - epoch).total_seconds(), 'X-RateLimit-Reset': (
datetime.now(timezone.utc) - epoch).total_seconds(),
'X-RateLimit-Remaining': 10, 'X-RateLimit-Remaining': 10,
} }
assert obj.send(body="test") is True assert obj.send(body="test") is True
@ -319,7 +323,8 @@ def test_plugin_reddit_general(mock_post):
# Reset our variable back to 1 # Reset our variable back to 1
good_response.headers = { good_response.headers = {
'X-RateLimit-Reset': (datetime.utcnow() - epoch).total_seconds(), 'X-RateLimit-Reset': (
datetime.now(timezone.utc) - epoch).total_seconds(),
'X-RateLimit-Remaining': 1, 'X-RateLimit-Remaining': 1,
} }
# Handle cases where our epoch time is wrong # Handle cases where our epoch time is wrong
@ -328,7 +333,8 @@ def test_plugin_reddit_general(mock_post):
# Return our object, but place it in the future forcing us to block # Return our object, but place it in the future forcing us to block
good_response.headers = { good_response.headers = {
'X-RateLimit-Reset': (datetime.utcnow() - epoch).total_seconds() + 1, 'X-RateLimit-Reset': (
datetime.now(timezone.utc) - epoch).total_seconds() + 1,
'X-RateLimit-Remaining': 0, 'X-RateLimit-Remaining': 0,
} }
@ -337,7 +343,8 @@ def test_plugin_reddit_general(mock_post):
# Return our object, but place it in the future forcing us to block # Return our object, but place it in the future forcing us to block
good_response.headers = { good_response.headers = {
'X-RateLimit-Reset': (datetime.utcnow() - epoch).total_seconds() - 1, 'X-RateLimit-Reset': (
datetime.now(timezone.utc) - epoch).total_seconds() - 1,
'X-RateLimit-Remaining': 0, 'X-RateLimit-Remaining': 0,
} }
assert obj.send(body="test") is True assert obj.send(body="test") is True
@ -348,7 +355,8 @@ def test_plugin_reddit_general(mock_post):
# Invalid JSON # Invalid JSON
response = mock.Mock() response = mock.Mock()
response.headers = { response.headers = {
'X-RateLimit-Reset': (datetime.utcnow() - epoch).total_seconds(), 'X-RateLimit-Reset': (
datetime.now(timezone.utc) - epoch).total_seconds(),
'X-RateLimit-Remaining': 1, 'X-RateLimit-Remaining': 1,
} }
response.content = '{' response.content = '{'
@ -393,7 +401,8 @@ def test_plugin_reddit_general(mock_post):
}) })
good_response.status_code = requests.codes.ok good_response.status_code = requests.codes.ok
good_response.headers = { good_response.headers = {
'X-RateLimit-Reset': (datetime.utcnow() - epoch).total_seconds(), 'X-RateLimit-Reset': (
datetime.now(timezone.utc) - epoch).total_seconds(),
'X-RateLimit-Remaining': 1, 'X-RateLimit-Remaining': 1,
} }

View File

@ -34,6 +34,7 @@ import json
import logging import logging
import os import os
from datetime import datetime from datetime import datetime
from datetime import timezone
from unittest.mock import Mock, patch from unittest.mock import Mock, patch
import pytest import pytest
@ -341,13 +342,14 @@ def test_plugin_twitter_general(mocker):
}] }]
# Epoch time: # Epoch time:
epoch = datetime.utcfromtimestamp(0) epoch = datetime.fromtimestamp(0, timezone.utc)
request = Mock() request = Mock()
request.content = json.dumps(response_obj) request.content = json.dumps(response_obj)
request.status_code = requests.codes.ok request.status_code = requests.codes.ok
request.headers = { request.headers = {
'x-rate-limit-reset': (datetime.utcnow() - epoch).total_seconds(), 'x-rate-limit-reset': (
datetime.now(timezone.utc) - epoch).total_seconds(),
'x-rate-limit-remaining': 1, 'x-rate-limit-remaining': 1,
} }
@ -402,21 +404,21 @@ def test_plugin_twitter_general(mocker):
# Return our object, but place it in the future forcing us to block # Return our object, but place it in the future forcing us to block
request.headers['x-rate-limit-reset'] = \ request.headers['x-rate-limit-reset'] = \
(datetime.utcnow() - epoch).total_seconds() + 1 (datetime.now(timezone.utc) - epoch).total_seconds() + 1
request.headers['x-rate-limit-remaining'] = 0 request.headers['x-rate-limit-remaining'] = 0
obj.ratelimit_remaining = 0 obj.ratelimit_remaining = 0
assert obj.send(body="test") is True assert obj.send(body="test") is True
# Return our object, but place it in the future forcing us to block # Return our object, but place it in the future forcing us to block
request.headers['x-rate-limit-reset'] = \ request.headers['x-rate-limit-reset'] = \
(datetime.utcnow() - epoch).total_seconds() - 1 (datetime.now(timezone.utc) - epoch).total_seconds() - 1
request.headers['x-rate-limit-remaining'] = 0 request.headers['x-rate-limit-remaining'] = 0
obj.ratelimit_remaining = 0 obj.ratelimit_remaining = 0
assert obj.send(body="test") is True assert obj.send(body="test") is True
# Return our limits to always work # Return our limits to always work
request.headers['x-rate-limit-reset'] = \ request.headers['x-rate-limit-reset'] = \
(datetime.utcnow() - epoch).total_seconds() (datetime.now(timezone.utc) - epoch).total_seconds()
request.headers['x-rate-limit-remaining'] = 1 request.headers['x-rate-limit-remaining'] = 1
obj.ratelimit_remaining = 1 obj.ratelimit_remaining = 1
@ -595,10 +597,11 @@ def test_plugin_twitter_dm_attachments_basic(
mock_post = mocker.patch("requests.post") mock_post = mocker.patch("requests.post")
# Epoch time: # Epoch time:
epoch = datetime.utcfromtimestamp(0) epoch = datetime.fromtimestamp(0, timezone.utc)
mock_get.return_value = good_message_response mock_get.return_value = good_message_response
mock_post.return_value.headers = { mock_post.return_value.headers = {
'x-rate-limit-reset': (datetime.utcnow() - epoch).total_seconds(), 'x-rate-limit-reset': (
datetime.now(timezone.utc) - epoch).total_seconds(),
'x-rate-limit-remaining': 1, 'x-rate-limit-remaining': 1,
} }