mirror of
https://github.com/caronc/apprise.git
synced 2025-08-09 08:25:07 +02:00
Bugfix: Decorator handles multiple URLs correctly now (#678)
This commit is contained in:
@ -26,6 +26,7 @@ from os.path import dirname
|
||||
from os.path import join
|
||||
from apprise.decorators import notify
|
||||
from apprise import Apprise
|
||||
from apprise import AppriseConfig
|
||||
from apprise import AppriseAsset
|
||||
from apprise import AppriseAttachment
|
||||
from apprise import common
|
||||
@ -308,3 +309,140 @@ def test_notify_complex_decoration():
|
||||
|
||||
# Tidy
|
||||
del common.NOTIFY_SCHEMA_MAP['utiltest']
|
||||
|
||||
|
||||
def test_notify_multi_instance_decoration(tmpdir):
|
||||
"""decorators: Test multi-instance @notify
|
||||
"""
|
||||
|
||||
# Verify our schema we're about to declare doesn't already exist
|
||||
# in our schema map:
|
||||
assert 'multi' not in common.NOTIFY_SCHEMA_MAP
|
||||
|
||||
verify_obj = []
|
||||
|
||||
# Define a function here on the spot
|
||||
@notify(on="multi", name="Apprise @notify Decorator Testing")
|
||||
def my_inline_notify_wrapper(
|
||||
body, title, notify_type, attach, meta, *args, **kwargs):
|
||||
|
||||
# Track what is added
|
||||
verify_obj.append({
|
||||
'body': body,
|
||||
'title': title,
|
||||
'notify_type': notify_type,
|
||||
'attach': attach,
|
||||
'meta': meta,
|
||||
'args': args,
|
||||
'kwargs': kwargs,
|
||||
})
|
||||
|
||||
# Now after our hook being inline... it's been loaded
|
||||
assert 'multi' in common.NOTIFY_SCHEMA_MAP
|
||||
|
||||
# Prepare our config
|
||||
t = tmpdir.mkdir("multi-test").join("apprise.yml")
|
||||
t.write("""urls:
|
||||
- multi://user1:pass@hostname
|
||||
- multi://user2:pass2@hostname
|
||||
""")
|
||||
|
||||
# Create ourselves a config object
|
||||
ac = AppriseConfig(paths=str(t))
|
||||
|
||||
# Create ourselves an apprise object
|
||||
aobj = Apprise()
|
||||
|
||||
# Add our configuration
|
||||
aobj.add(ac)
|
||||
|
||||
# The number of configuration files that exist
|
||||
assert len(ac) == 1
|
||||
|
||||
# no notifications are loaded
|
||||
assert len(ac.servers()) == 2
|
||||
|
||||
# Nothing stored yet in our object
|
||||
assert len(verify_obj) == 0
|
||||
|
||||
assert aobj.notify("Hello World", title="My Title") is True
|
||||
|
||||
assert len(verify_obj) == 2
|
||||
|
||||
# Python 3.6 does not nessisarily return list in order
|
||||
# So let's be sure it's sorted by the user id field to make the remaining
|
||||
# checks on this test easy
|
||||
verify_obj = sorted(verify_obj, key=lambda x: x['meta']['user'])
|
||||
|
||||
# Our content was populated after the notify() call
|
||||
obj = verify_obj[0]
|
||||
assert obj['body'] == "Hello World"
|
||||
assert obj['title'] == "My Title"
|
||||
assert obj['notify_type'] == common.NotifyType.INFO
|
||||
|
||||
meta = obj['meta']
|
||||
assert isinstance(meta, dict)
|
||||
|
||||
# No format was defined
|
||||
assert 'body_format' in obj['kwargs']
|
||||
assert obj['kwargs']['body_format'] is None
|
||||
|
||||
# The meta argument allows us to further parse the URL parameters
|
||||
# specified
|
||||
assert isinstance(obj['kwargs'], dict)
|
||||
|
||||
assert 'asset' in meta
|
||||
assert isinstance(meta['asset'], AppriseAsset)
|
||||
|
||||
assert 'tag' in meta
|
||||
assert isinstance(meta['tag'], set)
|
||||
|
||||
assert len(meta) == 7
|
||||
# We carry all of our default arguments from the @notify's initialization
|
||||
assert meta['schema'] == 'multi'
|
||||
assert meta['host'] == 'hostname'
|
||||
assert meta['user'] == 'user1'
|
||||
assert meta['password'] == 'pass'
|
||||
|
||||
# Verify our URL is correct
|
||||
assert meta['url'] == 'multi://user1:pass@hostname'
|
||||
|
||||
#
|
||||
# Now verify our second URL saved correct
|
||||
#
|
||||
|
||||
# Our content was populated after the notify() call
|
||||
obj = verify_obj[1]
|
||||
assert obj['body'] == "Hello World"
|
||||
assert obj['title'] == "My Title"
|
||||
assert obj['notify_type'] == common.NotifyType.INFO
|
||||
|
||||
meta = obj['meta']
|
||||
assert isinstance(meta, dict)
|
||||
|
||||
# No format was defined
|
||||
assert 'body_format' in obj['kwargs']
|
||||
assert obj['kwargs']['body_format'] is None
|
||||
|
||||
# The meta argument allows us to further parse the URL parameters
|
||||
# specified
|
||||
assert isinstance(obj['kwargs'], dict)
|
||||
|
||||
assert 'asset' in meta
|
||||
assert isinstance(meta['asset'], AppriseAsset)
|
||||
|
||||
assert 'tag' in meta
|
||||
assert isinstance(meta['tag'], set)
|
||||
|
||||
assert len(meta) == 7
|
||||
# We carry all of our default arguments from the @notify's initialization
|
||||
assert meta['schema'] == 'multi'
|
||||
assert meta['host'] == 'hostname'
|
||||
assert meta['user'] == 'user2'
|
||||
assert meta['password'] == 'pass2'
|
||||
|
||||
# Verify our URL is correct
|
||||
assert meta['url'] == 'multi://user2:pass2@hostname'
|
||||
|
||||
# Tidy
|
||||
del common.NOTIFY_SCHEMA_MAP['multi']
|
||||
|
Reference in New Issue
Block a user