Improved test cases (#137)

This commit is contained in:
Chris Caron 2023-09-17 15:53:18 -04:00 committed by GitHub
parent 42893d7855
commit a54d7b42f1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 144 additions and 12 deletions

View File

@ -24,12 +24,13 @@
# THE SOFTWARE.
from django.test import SimpleTestCase
from django.test.utils import override_settings
from unittest.mock import patch
from unittest.mock import patch, Mock
from ..forms import NotifyForm
from ..utils import ConfigCache
import os
import re
import apprise
import requests
class StatefulNotifyTests(SimpleTestCase):
@ -51,8 +52,8 @@ class StatefulNotifyTests(SimpleTestCase):
response = self.client.post('/get/{}'.format(key))
assert response.status_code == 403
@patch('apprise.Apprise.notify')
def test_stateful_configuration_io(self, mock_notify):
@patch('requests.post')
def test_stateful_configuration_io(self, mock_post):
"""
Test the writing, removal, writing and removal of configuration to
verify it persists and is removed when expected
@ -61,16 +62,26 @@ class StatefulNotifyTests(SimpleTestCase):
# our key to use
key = 'test_stateful'
# Set our return value
mock_notify.return_value = True
request = Mock()
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
urls = [
'mail=mailto://user:pass@hotmail.com',
'devops=slack://TokenA/TokenB/TokenC',
'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
# and our saved content is not different on subsequent calls.
for _ in range(10):
@ -94,6 +105,7 @@ class StatefulNotifyTests(SimpleTestCase):
form_data = {
'body': '## test notifiction',
'format': apprise.NotifyFormat.MARKDOWN,
'tag': 'general',
}
form = NotifyForm(data=form_data)
@ -103,10 +115,34 @@ class StatefulNotifyTests(SimpleTestCase):
# self.client.post()
del form.cleaned_data['attachment']
# We sent the notification successfully
response = self.client.post(
'/notify/{}'.format(key), form.cleaned_data)
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
response = self.client.post('/del/{}'.format(key))
@ -117,7 +153,7 @@ class StatefulNotifyTests(SimpleTestCase):
assert response.status_code == 204
# Reset our count
mock_notify.reset_mock()
mock_post.reset_mock()
# Now we do a similar approach as the above except we remove the
# configuration from under the application
@ -151,10 +187,103 @@ class StatefulNotifyTests(SimpleTestCase):
# self.client.post()
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(
'/notify/{}'.format(key), form.cleaned_data)
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
# removed the configuration directory)
@ -171,4 +300,4 @@ class StatefulNotifyTests(SimpleTestCase):
assert response.status_code == 204
# Reset our count
mock_notify.reset_mock()
mock_post.reset_mock()

View File

@ -144,6 +144,9 @@ class StatelessNotifyTests(SimpleTestCase):
'body': 'test notifiction',
}
# Monkey Patch
apprise.plugins.NotifyEmail.NotifyEmail.enabled = True
# At a minimum 'body' is requred
form = NotifyByUrlForm(data=form_data)
assert form.is_valid()

View File

@ -55,8 +55,8 @@ timeout = int(os.environ.get('APPRISE_WORKER_TIMEOUT', 300))
# Our worker type to use; over-ride the default `sync`
worker_class = 'gevent'
# Get workers memory consumption under control by leveraging gunicorn worker recycling
# timeout
# Get workers memory consumption under control by leveraging gunicorn
# worker recycling timeout
max_requests = 1000
max_requests_jitter = 50