mirror of
https://github.com/caronc/apprise.git
synced 2025-08-18 12:30:13 +02:00
Added support for recent CPython and PyPy versions; Droped Python v2.7 Support (#680)
This commit is contained in:
@@ -24,20 +24,12 @@
|
||||
# THE SOFTWARE.
|
||||
|
||||
import os
|
||||
import six
|
||||
import sys
|
||||
import pytest
|
||||
try:
|
||||
# Python 3.x
|
||||
from unittest import mock
|
||||
|
||||
except ImportError:
|
||||
# Python 2.7
|
||||
import mock
|
||||
|
||||
import requests
|
||||
from json import dumps
|
||||
from json import loads
|
||||
from unittest import mock
|
||||
|
||||
from apprise import Apprise
|
||||
from apprise import AppriseAttachment
|
||||
from apprise import AppriseAsset
|
||||
@@ -289,10 +281,10 @@ def test_plugin_telegram_general(mock_post):
|
||||
mock_post.return_value.content = '{}'
|
||||
|
||||
# test url call
|
||||
assert isinstance(obj.url(), six.string_types) is True
|
||||
assert isinstance(obj.url(), str) is True
|
||||
|
||||
# test privacy version of url
|
||||
assert isinstance(obj.url(privacy=True), six.string_types) is True
|
||||
assert isinstance(obj.url(privacy=True), str) is True
|
||||
assert obj.url(privacy=True).startswith('tgram://1...p/') is True
|
||||
|
||||
# Test that we can load the string we generate back:
|
||||
@@ -544,12 +536,10 @@ def test_plugin_telegram_general(mock_post):
|
||||
assert '-123456789525' in obj.targets
|
||||
|
||||
|
||||
@pytest.mark.skipif(sys.version_info.major <= 2, reason="Requires Python 3.x+")
|
||||
@mock.patch('requests.post')
|
||||
def test_plugin_telegram_formating_py3(mock_post):
|
||||
def test_plugin_telegram_formatting(mock_post):
|
||||
"""
|
||||
NotifyTelegram() Python v3+ Formatting Tests
|
||||
|
||||
NotifyTelegram() formatting tests
|
||||
"""
|
||||
|
||||
# Disable Throttling to speed testing
|
||||
@@ -887,395 +877,6 @@ def test_plugin_telegram_formating_py3(mock_post):
|
||||
'ok\r\n'
|
||||
|
||||
|
||||
@pytest.mark.skipif(sys.version_info.major >= 3, reason="Requires Python 2.x+")
|
||||
@mock.patch('requests.post')
|
||||
def test_plugin_telegram_formating_py2(mock_post):
|
||||
"""
|
||||
NotifyTelegram() Python v2 Formatting Tests
|
||||
|
||||
"""
|
||||
|
||||
# Disable Throttling to speed testing
|
||||
plugins.NotifyTelegram.request_rate_per_sec = 0
|
||||
|
||||
# Prepare Mock
|
||||
mock_post.return_value = requests.Request()
|
||||
mock_post.return_value.status_code = requests.codes.ok
|
||||
mock_post.return_value.content = '{}'
|
||||
|
||||
# Simple success response
|
||||
mock_post.return_value.content = dumps({
|
||||
"ok": True,
|
||||
"result": [{
|
||||
"update_id": 645421321,
|
||||
"message": {
|
||||
"message_id": 2,
|
||||
"from": {
|
||||
"id": 532389719,
|
||||
"is_bot": False,
|
||||
"first_name": "Chris",
|
||||
"language_code": "en-US"
|
||||
},
|
||||
"chat": {
|
||||
"id": 532389719,
|
||||
"first_name": "Chris",
|
||||
"type": "private"
|
||||
},
|
||||
"date": 1519694394,
|
||||
"text": "/start",
|
||||
"entities": [{
|
||||
"offset": 0,
|
||||
"length": 6,
|
||||
"type": "bot_command",
|
||||
}],
|
||||
}},
|
||||
],
|
||||
})
|
||||
mock_post.return_value.status_code = requests.codes.ok
|
||||
|
||||
results = plugins.NotifyTelegram.parse_url(
|
||||
'tgram://123456789:abcdefg_hijklmnop/')
|
||||
|
||||
instance = plugins.NotifyTelegram(**results)
|
||||
assert isinstance(instance, plugins.NotifyTelegram)
|
||||
|
||||
response = instance.send(title='title', body='body')
|
||||
assert response is True
|
||||
# 1 call to look up bot owner, and second for notification
|
||||
assert mock_post.call_count == 2
|
||||
|
||||
assert mock_post.call_args_list[0][0][0] == \
|
||||
'https://api.telegram.org/bot123456789:abcdefg_hijklmnop/getUpdates'
|
||||
assert mock_post.call_args_list[1][0][0] == \
|
||||
'https://api.telegram.org/bot123456789:abcdefg_hijklmnop/sendMessage'
|
||||
|
||||
# Reset our values
|
||||
mock_post.reset_mock()
|
||||
|
||||
# Now test our HTML Conversion as TEXT)
|
||||
aobj = Apprise()
|
||||
aobj.add('tgram://123456789:abcdefg_hijklmnop/')
|
||||
assert len(aobj) == 1
|
||||
|
||||
title = '🚨 Change detected for <i>Apprise Test Title</i>'
|
||||
body = '<a href="http://localhost"><i>Apprise Body Title</i></a>' \
|
||||
' had <a href="http://127.0.0.1">a change</a>'
|
||||
|
||||
assert aobj.notify(title=title, body=body, body_format=NotifyFormat.TEXT)
|
||||
|
||||
# Test our calls
|
||||
assert mock_post.call_count == 2
|
||||
|
||||
assert mock_post.call_args_list[0][0][0] == \
|
||||
'https://api.telegram.org/bot123456789:abcdefg_hijklmnop/getUpdates'
|
||||
assert mock_post.call_args_list[1][0][0] == \
|
||||
'https://api.telegram.org/bot123456789:abcdefg_hijklmnop/sendMessage'
|
||||
|
||||
payload = loads(mock_post.call_args_list[1][1]['data'])
|
||||
|
||||
# Test that everything is escaped properly in a TEXT mode
|
||||
assert payload['text'].encode('utf-8') == \
|
||||
'<b>\xf0\x9f\x9a\xa8 Change detected for <i>' \
|
||||
'Apprise Test Title</i></b>\r\n<' \
|
||||
'a href="http://localhost"><i>Apprise Body Title' \
|
||||
'</i></a> had <a href="http://127.0.0.1"' \
|
||||
'>a change</a>'
|
||||
|
||||
# Reset our values
|
||||
mock_post.reset_mock()
|
||||
|
||||
# Now test our HTML Conversion as TEXT)
|
||||
aobj = Apprise()
|
||||
aobj.add('tgram://123456789:abcdefg_hijklmnop/?format=html')
|
||||
assert len(aobj) == 1
|
||||
|
||||
assert aobj.notify(title=title, body=body, body_format=NotifyFormat.HTML)
|
||||
|
||||
# Test our calls
|
||||
assert mock_post.call_count == 2
|
||||
|
||||
assert mock_post.call_args_list[0][0][0] == \
|
||||
'https://api.telegram.org/bot123456789:abcdefg_hijklmnop/getUpdates'
|
||||
assert mock_post.call_args_list[1][0][0] == \
|
||||
'https://api.telegram.org/bot123456789:abcdefg_hijklmnop/sendMessage'
|
||||
|
||||
payload = loads(mock_post.call_args_list[1][1]['data'])
|
||||
|
||||
# Test that everything is escaped properly in a HTML mode
|
||||
assert payload['text'].encode('utf-8') == \
|
||||
'<b>\xf0\x9f\x9a\xa8 Change detected for <i>Apprise Test Title</i>' \
|
||||
'</b>\r\n<a href="http://localhost"><i>Apprise Body Title</i></a> ' \
|
||||
'had <a href="http://127.0.0.1">a change</a>'
|
||||
|
||||
# Reset our values
|
||||
mock_post.reset_mock()
|
||||
|
||||
# Now test our MARKDOWN Handling
|
||||
title = '# 🚨 Change detected for _Apprise Test Title_'
|
||||
body = '_[Apprise Body Title](http://localhost)_' \
|
||||
' had [a change](http://127.0.0.1)'
|
||||
|
||||
aobj = Apprise()
|
||||
aobj.add('tgram://123456789:abcdefg_hijklmnop/?format=markdown')
|
||||
assert len(aobj) == 1
|
||||
|
||||
assert aobj.notify(
|
||||
title=title, body=body, body_format=NotifyFormat.MARKDOWN)
|
||||
|
||||
# Test our calls
|
||||
assert mock_post.call_count == 2
|
||||
|
||||
assert mock_post.call_args_list[0][0][0] == \
|
||||
'https://api.telegram.org/bot123456789:abcdefg_hijklmnop/getUpdates'
|
||||
assert mock_post.call_args_list[1][0][0] == \
|
||||
'https://api.telegram.org/bot123456789:abcdefg_hijklmnop/sendMessage'
|
||||
|
||||
payload = loads(mock_post.call_args_list[1][1]['data'])
|
||||
|
||||
# Test that everything is escaped properly in a HTML mode
|
||||
assert payload['text'].encode('utf-8') == \
|
||||
'# \xf0\x9f\x9a\xa8 Change detected for _Apprise Test Title_\r\n_' \
|
||||
'[Apprise Body Title](http://localhost)_ had ' \
|
||||
'[a change](http://127.0.0.1)'
|
||||
|
||||
# Reset our values
|
||||
mock_post.reset_mock()
|
||||
|
||||
# Upstream to use HTML but input specified as Markdown
|
||||
aobj = Apprise()
|
||||
aobj.add('tgram://987654321:abcdefg_hijklmnop/?format=html')
|
||||
assert len(aobj) == 1
|
||||
|
||||
# HTML forced by the command line, but MARKDOWN specified as
|
||||
# upstream mode
|
||||
assert aobj.notify(
|
||||
title=title, body=body, body_format=NotifyFormat.MARKDOWN)
|
||||
|
||||
# Test our calls
|
||||
assert mock_post.call_count == 2
|
||||
|
||||
assert mock_post.call_args_list[0][0][0] == \
|
||||
'https://api.telegram.org/bot987654321:abcdefg_hijklmnop/getUpdates'
|
||||
assert mock_post.call_args_list[1][0][0] == \
|
||||
'https://api.telegram.org/bot987654321:abcdefg_hijklmnop/sendMessage'
|
||||
|
||||
payload = loads(mock_post.call_args_list[1][1]['data'])
|
||||
|
||||
# Test that everything is escaped properly in a HTML mode
|
||||
assert payload['text'].encode('utf-8') == \
|
||||
'<b>\r\n<b>\xf0\x9f\x9a\xa8 Change detected for ' \
|
||||
'<i>Apprise Test Title</i></b>\r\n</b>\r\n<i>' \
|
||||
'<a href="http://localhost">Apprise Body Title</a>' \
|
||||
'</i> had <a href="http://127.0.0.1">a change</a>\r\n'
|
||||
|
||||
# Reset our values
|
||||
mock_post.reset_mock()
|
||||
|
||||
# Now test hebrew types (outside of default utf-8)
|
||||
# כותרת נפלאה translates to 'A wonderful title'
|
||||
# זו הודעה translates to 'This is a notification'
|
||||
title = 'כותרת נפלאה' \
|
||||
.decode('utf-8').encode('ISO-8859-8')
|
||||
body = '[_[זו הודעה](http://localhost)_' \
|
||||
.decode('utf-8').encode('ISO-8859-8')
|
||||
|
||||
asset = AppriseAsset(encoding='utf-8')
|
||||
# Now test default entries
|
||||
aobj = Apprise(asset=asset)
|
||||
aobj.add('tgram://123456789:abcdefg_hijklmnop/')
|
||||
assert len(aobj) == 1
|
||||
|
||||
# Our notification will fail because we'll have an encoding error
|
||||
assert not aobj.notify(title=title, body=body)
|
||||
# Nothing was even attempted to be notified
|
||||
assert mock_post.call_count == 0
|
||||
|
||||
# Let's use the expected input
|
||||
asset = AppriseAsset(encoding='ISO-8859-8')
|
||||
|
||||
# Now test default entries
|
||||
aobj = Apprise(asset=asset)
|
||||
|
||||
aobj.add('tgram://123456789:abcdefg_hijklmnop/')
|
||||
assert len(aobj) == 1
|
||||
|
||||
# Our notification will work now
|
||||
assert aobj.notify(title=title, body=body)
|
||||
|
||||
# Test our calls
|
||||
assert mock_post.call_count == 2
|
||||
|
||||
assert mock_post.call_args_list[0][0][0] == \
|
||||
'https://api.telegram.org/bot123456789:abcdefg_hijklmnop/getUpdates'
|
||||
assert mock_post.call_args_list[1][0][0] == \
|
||||
'https://api.telegram.org/bot123456789:abcdefg_hijklmnop/sendMessage'
|
||||
|
||||
payload = loads(mock_post.call_args_list[1][1]['data'])
|
||||
|
||||
# Test that everything is escaped properly in a HTML mode
|
||||
assert payload['text'].encode('utf-8') == \
|
||||
'<b>\xd7\x9b\xd7\x95\xd7\xaa\xd7\xa8\xd7\xaa '\
|
||||
'\xd7\xa0\xd7\xa4\xd7\x9c\xd7\x90\xd7\x94</b>\r\n[_[\xd7\x96\xd7\x95 '\
|
||||
'\xd7\x94\xd7\x95\xd7\x93\xd7\xa2\xd7\x94](http://localhost)_'
|
||||
|
||||
# Now we'll test an edge case where a title was defined, but after
|
||||
# processing it, it was determiend there really wasn't anything there
|
||||
# at all at the end of the day.
|
||||
|
||||
# Reset our values
|
||||
mock_post.reset_mock()
|
||||
|
||||
# Upstream to use HTML but input specified as Markdown
|
||||
aobj = Apprise()
|
||||
aobj.add('tgram://987654321:abcdefg_hijklmnop/?format=markdown')
|
||||
assert len(aobj) == 1
|
||||
|
||||
# Now test our MARKDOWN Handling (no title defined... not really anyway)
|
||||
title = '# '
|
||||
body = '_[Apprise Body Title](http://localhost)_' \
|
||||
' had [a change](http://127.0.0.2)'
|
||||
|
||||
# MARKDOWN forced by the command line, but TEXT specified as
|
||||
# upstream mode
|
||||
assert aobj.notify(
|
||||
title=title, body=body, body_format=NotifyFormat.TEXT)
|
||||
|
||||
# Test our calls
|
||||
assert mock_post.call_count == 2
|
||||
|
||||
assert mock_post.call_args_list[0][0][0] == \
|
||||
'https://api.telegram.org/bot987654321:abcdefg_hijklmnop/getUpdates'
|
||||
assert mock_post.call_args_list[1][0][0] == \
|
||||
'https://api.telegram.org/bot987654321:abcdefg_hijklmnop/sendMessage'
|
||||
|
||||
payload = loads(mock_post.call_args_list[1][1]['data'])
|
||||
|
||||
# Test that everything is escaped properly in a HTML mode
|
||||
assert payload['text'] == \
|
||||
'_[Apprise Body Title](http://localhost)_ had ' \
|
||||
'[a change](http://127.0.0.2)'
|
||||
|
||||
# Reset our values
|
||||
mock_post.reset_mock()
|
||||
|
||||
# Upstream to use HTML but input specified as Markdown
|
||||
aobj = Apprise()
|
||||
aobj.add('tgram://987654321:abcdefg_hijklmnop/?format=markdown')
|
||||
assert len(aobj) == 1
|
||||
|
||||
# Set an actual title this time
|
||||
title = '# A Great Title'
|
||||
body = '_[Apprise Body Title](http://localhost)_' \
|
||||
' had [a change](http://127.0.0.2)'
|
||||
|
||||
# MARKDOWN forced by the command line, but TEXT specified as
|
||||
# upstream mode
|
||||
assert aobj.notify(
|
||||
title=title, body=body, body_format=NotifyFormat.TEXT)
|
||||
|
||||
# Test our calls
|
||||
assert mock_post.call_count == 2
|
||||
|
||||
assert mock_post.call_args_list[0][0][0] == \
|
||||
'https://api.telegram.org/bot987654321:abcdefg_hijklmnop/getUpdates'
|
||||
assert mock_post.call_args_list[1][0][0] == \
|
||||
'https://api.telegram.org/bot987654321:abcdefg_hijklmnop/sendMessage'
|
||||
|
||||
payload = loads(mock_post.call_args_list[1][1]['data'])
|
||||
|
||||
# Test that everything is escaped properly in a HTML mode
|
||||
assert payload['text'] == \
|
||||
'# A Great Title\r\n_[Apprise Body Title](http://localhost)_ had ' \
|
||||
'[a change](http://127.0.0.2)'
|
||||
|
||||
# Reset our values
|
||||
mock_post.reset_mock()
|
||||
|
||||
#
|
||||
# Now test that <br/> is correctly escaped
|
||||
#
|
||||
title = 'Test Message Title'
|
||||
body = 'Test Message Body <br/> ok</br>'
|
||||
|
||||
aobj = Apprise()
|
||||
aobj.add('tgram://1234:aaaaaaaaa/-1123456245134')
|
||||
assert len(aobj) == 1
|
||||
|
||||
assert aobj.notify(
|
||||
title=title, body=body, body_format=NotifyFormat.MARKDOWN)
|
||||
|
||||
# Test our calls
|
||||
assert mock_post.call_count == 1
|
||||
|
||||
assert mock_post.call_args_list[0][0][0] == \
|
||||
'https://api.telegram.org/bot1234:aaaaaaaaa/sendMessage'
|
||||
|
||||
payload = loads(mock_post.call_args_list[0][1]['data'])
|
||||
|
||||
# Test that everything is escaped properly in a HTML mode
|
||||
assert payload['text'] == \
|
||||
'<b>Test Message Title\r\n' \
|
||||
'</b>\r\n' \
|
||||
'Test Message Body\r\n' \
|
||||
'ok\r\n'
|
||||
|
||||
# Reset our values
|
||||
mock_post.reset_mock()
|
||||
|
||||
#
|
||||
# Now test that <br/> is correctly escaped as it would have been via the
|
||||
# CLI mode where the body_format is TEXT
|
||||
#
|
||||
|
||||
aobj = Apprise()
|
||||
aobj.add('tgram://1234:aaaaaaaaa/-1123456245134')
|
||||
assert len(aobj) == 1
|
||||
|
||||
assert aobj.notify(
|
||||
title=title, body=body, body_format=NotifyFormat.TEXT)
|
||||
|
||||
# Test our calls
|
||||
assert mock_post.call_count == 1
|
||||
|
||||
assert mock_post.call_args_list[0][0][0] == \
|
||||
'https://api.telegram.org/bot1234:aaaaaaaaa/sendMessage'
|
||||
|
||||
payload = loads(mock_post.call_args_list[0][1]['data'])
|
||||
|
||||
# Test that everything is escaped properly in a HTML mode
|
||||
assert payload['text'] == \
|
||||
'<b>Test Message Title</b>\r\n' \
|
||||
'Test Message Body <br/> ok</br>'
|
||||
|
||||
# Reset our values
|
||||
mock_post.reset_mock()
|
||||
|
||||
#
|
||||
# Now test that <br/> is correctly escaped if fed as HTML
|
||||
#
|
||||
|
||||
aobj = Apprise()
|
||||
aobj.add('tgram://1234:aaaaaaaaa/-1123456245134')
|
||||
assert len(aobj) == 1
|
||||
|
||||
assert aobj.notify(
|
||||
title=title, body=body, body_format=NotifyFormat.HTML)
|
||||
|
||||
# Test our calls
|
||||
assert mock_post.call_count == 1
|
||||
|
||||
assert mock_post.call_args_list[0][0][0] == \
|
||||
'https://api.telegram.org/bot1234:aaaaaaaaa/sendMessage'
|
||||
|
||||
payload = loads(mock_post.call_args_list[0][1]['data'])
|
||||
|
||||
# Test that everything is escaped properly in a HTML mode
|
||||
assert payload['text'] == \
|
||||
'<b>Test Message Title</b>\r\n' \
|
||||
'Test Message Body\r\n' \
|
||||
'ok\r\n'
|
||||
|
||||
|
||||
@mock.patch('requests.post')
|
||||
def test_plugin_telegram_html_formatting(mock_post):
|
||||
"""
|
||||
|
Reference in New Issue
Block a user