mirror of
https://github.com/caronc/apprise-api.git
synced 2024-12-12 09:50:50 +01:00
Improved test cases (#137)
This commit is contained in:
parent
42893d7855
commit
a54d7b42f1
@ -24,12 +24,13 @@
|
|||||||
# THE SOFTWARE.
|
# THE SOFTWARE.
|
||||||
from django.test import SimpleTestCase
|
from django.test import SimpleTestCase
|
||||||
from django.test.utils import override_settings
|
from django.test.utils import override_settings
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch, Mock
|
||||||
from ..forms import NotifyForm
|
from ..forms import NotifyForm
|
||||||
from ..utils import ConfigCache
|
from ..utils import ConfigCache
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import apprise
|
import apprise
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
class StatefulNotifyTests(SimpleTestCase):
|
class StatefulNotifyTests(SimpleTestCase):
|
||||||
@ -51,8 +52,8 @@ class StatefulNotifyTests(SimpleTestCase):
|
|||||||
response = self.client.post('/get/{}'.format(key))
|
response = self.client.post('/get/{}'.format(key))
|
||||||
assert response.status_code == 403
|
assert response.status_code == 403
|
||||||
|
|
||||||
@patch('apprise.Apprise.notify')
|
@patch('requests.post')
|
||||||
def test_stateful_configuration_io(self, mock_notify):
|
def test_stateful_configuration_io(self, mock_post):
|
||||||
"""
|
"""
|
||||||
Test the writing, removal, writing and removal of configuration to
|
Test the writing, removal, writing and removal of configuration to
|
||||||
verify it persists and is removed when expected
|
verify it persists and is removed when expected
|
||||||
@ -61,16 +62,26 @@ class StatefulNotifyTests(SimpleTestCase):
|
|||||||
# our key to use
|
# our key to use
|
||||||
key = 'test_stateful'
|
key = 'test_stateful'
|
||||||
|
|
||||||
# Set our return value
|
request = Mock()
|
||||||
mock_notify.return_value = True
|
request.content = b'ok'
|
||||||
|
request.status_code = requests.codes.ok
|
||||||
|
mock_post.return_value = request
|
||||||
|
|
||||||
|
# Monkey Patch
|
||||||
|
apprise.plugins.NotifyEmail.NotifyEmail.enabled = True
|
||||||
|
|
||||||
# Preare our list of URLs we want to save
|
# Preare our list of URLs we want to save
|
||||||
urls = [
|
urls = [
|
||||||
'mail=mailto://user:pass@hotmail.com',
|
|
||||||
'devops=slack://TokenA/TokenB/TokenC',
|
'devops=slack://TokenA/TokenB/TokenC',
|
||||||
'pusbullet=pbul://tokendetails',
|
'pusbullet=pbul://tokendetails',
|
||||||
|
'general,json=json://hostname',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Monkey Patch
|
||||||
|
apprise.plugins.NotifySlack.NotifySlack.enabled = True
|
||||||
|
apprise.plugins.NotifyPushBullet.NotifyPushBullet.enabled = True
|
||||||
|
apprise.plugins.NotifyJSON.NotifyJSON.enabled = True
|
||||||
|
|
||||||
# For 10 iterations, repeat these tests to verify that don't change
|
# For 10 iterations, repeat these tests to verify that don't change
|
||||||
# and our saved content is not different on subsequent calls.
|
# and our saved content is not different on subsequent calls.
|
||||||
for _ in range(10):
|
for _ in range(10):
|
||||||
@ -94,6 +105,7 @@ class StatefulNotifyTests(SimpleTestCase):
|
|||||||
form_data = {
|
form_data = {
|
||||||
'body': '## test notifiction',
|
'body': '## test notifiction',
|
||||||
'format': apprise.NotifyFormat.MARKDOWN,
|
'format': apprise.NotifyFormat.MARKDOWN,
|
||||||
|
'tag': 'general',
|
||||||
}
|
}
|
||||||
|
|
||||||
form = NotifyForm(data=form_data)
|
form = NotifyForm(data=form_data)
|
||||||
@ -103,10 +115,34 @@ class StatefulNotifyTests(SimpleTestCase):
|
|||||||
# self.client.post()
|
# self.client.post()
|
||||||
del form.cleaned_data['attachment']
|
del form.cleaned_data['attachment']
|
||||||
|
|
||||||
|
# We sent the notification successfully
|
||||||
response = self.client.post(
|
response = self.client.post(
|
||||||
'/notify/{}'.format(key), form.cleaned_data)
|
'/notify/{}'.format(key), form.cleaned_data)
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert mock_notify.call_count == 1
|
assert mock_post.call_count == 1
|
||||||
|
|
||||||
|
mock_post.reset_mock()
|
||||||
|
|
||||||
|
form_data = {
|
||||||
|
'body': '## test notifiction',
|
||||||
|
'format': apprise.NotifyFormat.MARKDOWN,
|
||||||
|
'tag': 'no-on-with-this-tag',
|
||||||
|
}
|
||||||
|
|
||||||
|
form = NotifyForm(data=form_data)
|
||||||
|
assert form.is_valid()
|
||||||
|
|
||||||
|
# Required to prevent None from being passed into
|
||||||
|
# self.client.post()
|
||||||
|
del form.cleaned_data['attachment']
|
||||||
|
|
||||||
|
# No one to notify
|
||||||
|
response = self.client.post(
|
||||||
|
'/notify/{}'.format(key), form.cleaned_data)
|
||||||
|
assert response.status_code == 424
|
||||||
|
assert mock_post.call_count == 0
|
||||||
|
|
||||||
|
mock_post.reset_mock()
|
||||||
|
|
||||||
# Now empty our data
|
# Now empty our data
|
||||||
response = self.client.post('/del/{}'.format(key))
|
response = self.client.post('/del/{}'.format(key))
|
||||||
@ -117,7 +153,7 @@ class StatefulNotifyTests(SimpleTestCase):
|
|||||||
assert response.status_code == 204
|
assert response.status_code == 204
|
||||||
|
|
||||||
# Reset our count
|
# Reset our count
|
||||||
mock_notify.reset_mock()
|
mock_post.reset_mock()
|
||||||
|
|
||||||
# Now we do a similar approach as the above except we remove the
|
# Now we do a similar approach as the above except we remove the
|
||||||
# configuration from under the application
|
# configuration from under the application
|
||||||
@ -151,10 +187,103 @@ class StatefulNotifyTests(SimpleTestCase):
|
|||||||
# self.client.post()
|
# self.client.post()
|
||||||
del form.cleaned_data['attachment']
|
del form.cleaned_data['attachment']
|
||||||
|
|
||||||
|
# No one to notify (no tag specified)
|
||||||
|
response = self.client.post(
|
||||||
|
'/notify/{}'.format(key), form.cleaned_data)
|
||||||
|
assert response.status_code == 424
|
||||||
|
assert mock_post.call_count == 0
|
||||||
|
|
||||||
|
# Reset our configuration
|
||||||
|
mock_post.reset_mock()
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test tagging now
|
||||||
|
#
|
||||||
|
form_data = {
|
||||||
|
'body': '## test notifiction',
|
||||||
|
'format': apprise.NotifyFormat.MARKDOWN,
|
||||||
|
'tag': 'general+json',
|
||||||
|
}
|
||||||
|
|
||||||
|
form = NotifyForm(data=form_data)
|
||||||
|
assert form.is_valid()
|
||||||
|
|
||||||
|
# Required to prevent None from being passed into
|
||||||
|
# self.client.post()
|
||||||
|
del form.cleaned_data['attachment']
|
||||||
|
|
||||||
|
response = self.client.post(
|
||||||
|
'/notify/{}'.format(key), form.cleaned_data)
|
||||||
|
# + (plus) not supported at this time
|
||||||
|
assert response.status_code == 400
|
||||||
|
assert mock_post.call_count == 0
|
||||||
|
|
||||||
|
# Reset our configuration
|
||||||
|
mock_post.reset_mock()
|
||||||
|
|
||||||
|
form_data = {
|
||||||
|
'body': '## test notifiction',
|
||||||
|
'format': apprise.NotifyFormat.MARKDOWN,
|
||||||
|
# Plus with space inbetween
|
||||||
|
'tag': 'general + json',
|
||||||
|
}
|
||||||
|
|
||||||
|
form = NotifyForm(data=form_data)
|
||||||
|
assert form.is_valid()
|
||||||
|
|
||||||
|
# Required to prevent None from being passed into
|
||||||
|
# self.client.post()
|
||||||
|
del form.cleaned_data['attachment']
|
||||||
|
|
||||||
|
response = self.client.post(
|
||||||
|
'/notify/{}'.format(key), form.cleaned_data)
|
||||||
|
# + (plus) not supported at this time
|
||||||
|
assert response.status_code == 400
|
||||||
|
assert mock_post.call_count == 0
|
||||||
|
|
||||||
|
mock_post.reset_mock()
|
||||||
|
|
||||||
|
form_data = {
|
||||||
|
'body': '## test notifiction',
|
||||||
|
'format': apprise.NotifyFormat.MARKDOWN,
|
||||||
|
# Space (AND)
|
||||||
|
'tag': 'general json',
|
||||||
|
}
|
||||||
|
|
||||||
|
form = NotifyForm(data=form_data)
|
||||||
|
assert form.is_valid()
|
||||||
|
|
||||||
|
# Required to prevent None from being passed into
|
||||||
|
# self.client.post()
|
||||||
|
del form.cleaned_data['attachment']
|
||||||
|
|
||||||
response = self.client.post(
|
response = self.client.post(
|
||||||
'/notify/{}'.format(key), form.cleaned_data)
|
'/notify/{}'.format(key), form.cleaned_data)
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
assert mock_notify.call_count == 1
|
assert mock_post.call_count == 1
|
||||||
|
|
||||||
|
mock_post.reset_mock()
|
||||||
|
|
||||||
|
form_data = {
|
||||||
|
'body': '## test notifiction',
|
||||||
|
'format': apprise.NotifyFormat.MARKDOWN,
|
||||||
|
# Comma (OR)
|
||||||
|
'tag': 'general, devops',
|
||||||
|
}
|
||||||
|
|
||||||
|
form = NotifyForm(data=form_data)
|
||||||
|
assert form.is_valid()
|
||||||
|
|
||||||
|
# Required to prevent None from being passed into
|
||||||
|
# self.client.post()
|
||||||
|
del form.cleaned_data['attachment']
|
||||||
|
|
||||||
|
response = self.client.post(
|
||||||
|
'/notify/{}'.format(key), form.cleaned_data)
|
||||||
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
# 2 endpoints hit
|
||||||
|
assert mock_post.call_count == 2
|
||||||
|
|
||||||
# Now remove the file directly (as though one
|
# Now remove the file directly (as though one
|
||||||
# removed the configuration directory)
|
# removed the configuration directory)
|
||||||
@ -171,4 +300,4 @@ class StatefulNotifyTests(SimpleTestCase):
|
|||||||
assert response.status_code == 204
|
assert response.status_code == 204
|
||||||
|
|
||||||
# Reset our count
|
# Reset our count
|
||||||
mock_notify.reset_mock()
|
mock_post.reset_mock()
|
||||||
|
@ -144,6 +144,9 @@ class StatelessNotifyTests(SimpleTestCase):
|
|||||||
'body': 'test notifiction',
|
'body': 'test notifiction',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Monkey Patch
|
||||||
|
apprise.plugins.NotifyEmail.NotifyEmail.enabled = True
|
||||||
|
|
||||||
# At a minimum 'body' is requred
|
# At a minimum 'body' is requred
|
||||||
form = NotifyByUrlForm(data=form_data)
|
form = NotifyByUrlForm(data=form_data)
|
||||||
assert form.is_valid()
|
assert form.is_valid()
|
||||||
|
@ -55,8 +55,8 @@ timeout = int(os.environ.get('APPRISE_WORKER_TIMEOUT', 300))
|
|||||||
# Our worker type to use; over-ride the default `sync`
|
# Our worker type to use; over-ride the default `sync`
|
||||||
worker_class = 'gevent'
|
worker_class = 'gevent'
|
||||||
|
|
||||||
# Get workers memory consumption under control by leveraging gunicorn worker recycling
|
# Get workers memory consumption under control by leveraging gunicorn
|
||||||
# timeout
|
# worker recycling timeout
|
||||||
max_requests = 1000
|
max_requests = 1000
|
||||||
max_requests_jitter = 50
|
max_requests_jitter = 50
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user