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. # 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()

View File

@ -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()

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` # 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