diff --git a/test/test_plugin_email.py b/test/test_plugin_email.py index 07cb283f11..701c33b464 100644 --- a/test/test_plugin_email.py +++ b/test/test_plugin_email.py @@ -1360,3 +1360,144 @@ def test_plugin_email_url_parsing(mock_smtp, mock_smtp_ssl): user, pw = response.login.call_args[0] assert pw == 'abc123' assert user == 'joe@mydomain.nl' + + +@mock.patch('smtplib.SMTP_SSL') +@mock.patch('smtplib.SMTP') +def test_plugin_email_plus_in_toemail(mock_smtp, mock_smtp_ssl): + """ + NotifyEmail() support + in To Email address + + """ + + response = mock.Mock() + mock_smtp_ssl.return_value = response + mock_smtp.return_value = response + + # We want to test the case where a + is found in the To address; we want to + # ensure that it is supported + results = NotifyEmail.parse_url( + 'mailtos://user:pass123@gmail.com' + '?to=Plus Support') + assert isinstance(results, dict) + assert 'user' == results['user'] + assert 'gmail.com' == results['host'] + assert 'pass123' == results['password'] + assert results['port'] is None + assert 'Plus Support' in results['targets'] + + obj = Apprise.instantiate(results, suppress_exceptions=False) + assert isinstance(obj, NotifyEmail) is True + + assert len(obj.targets) == 1 + assert ('Plus Support', 'test+notification@gmail.com') in obj.targets + + assert mock_smtp.call_count == 0 + assert mock_smtp_ssl.call_count == 0 + assert obj.notify("test") is True + assert mock_smtp.call_count == 1 + assert mock_smtp_ssl.call_count == 0 + assert response.starttls.call_count == 1 + assert response.login.call_count == 1 + assert response.sendmail.call_count == 1 + # Store our Sent Arguments + # Syntax is: + # sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=()) + # [0] [1] [2] + _from = response.sendmail.call_args[0][0] + _to = response.sendmail.call_args[0][1] + _msg = response.sendmail.call_args[0][2] + assert _from == 'user@gmail.com' + assert isinstance(_to, list) + assert len(_to) == 1 + assert _to[0] == 'test+notification@gmail.com' + assert _msg.split('\n')[-3] == 'test' + + mock_smtp.reset_mock() + mock_smtp_ssl.reset_mock() + response.reset_mock() + + # + # Perform the same test where the To field jsut contains the + in the + # address + # + results = NotifyEmail.parse_url( + 'mailtos://user:pass123@gmail.com' + '?to=test+notification@gmail.com') + assert isinstance(results, dict) + assert 'user' == results['user'] + assert 'gmail.com' == results['host'] + assert 'pass123' == results['password'] + assert results['port'] is None + assert 'test+notification@gmail.com' in results['targets'] + + obj = Apprise.instantiate(results, suppress_exceptions=False) + assert isinstance(obj, NotifyEmail) is True + + assert len(obj.targets) == 1 + assert (False, 'test+notification@gmail.com') in obj.targets + + assert mock_smtp.call_count == 0 + assert mock_smtp_ssl.call_count == 0 + assert obj.notify("test") is True + assert mock_smtp.call_count == 1 + assert mock_smtp_ssl.call_count == 0 + assert response.starttls.call_count == 1 + assert response.login.call_count == 1 + assert response.sendmail.call_count == 1 + # Store our Sent Arguments + # Syntax is: + # sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=()) + # [0] [1] [2] + _from = response.sendmail.call_args[0][0] + _to = response.sendmail.call_args[0][1] + _msg = response.sendmail.call_args[0][2] + assert _from == 'user@gmail.com' + assert isinstance(_to, list) + assert len(_to) == 1 + assert _to[0] == 'test+notification@gmail.com' + assert _msg.split('\n')[-3] == 'test' + + mock_smtp.reset_mock() + mock_smtp_ssl.reset_mock() + response.reset_mock() + + # + # Perform the same test where the To field is in the URL itself + # + results = NotifyEmail.parse_url( + 'mailtos://user:pass123@gmail.com' + '/test+notification@gmail.com') + assert isinstance(results, dict) + assert 'user' == results['user'] + assert 'gmail.com' == results['host'] + assert 'pass123' == results['password'] + assert results['port'] is None + assert 'test+notification@gmail.com' in results['targets'] + + obj = Apprise.instantiate(results, suppress_exceptions=False) + assert isinstance(obj, NotifyEmail) is True + + assert len(obj.targets) == 1 + assert (False, 'test+notification@gmail.com') in obj.targets + + assert mock_smtp.call_count == 0 + assert mock_smtp_ssl.call_count == 0 + assert obj.notify("test") is True + assert mock_smtp.call_count == 1 + assert mock_smtp_ssl.call_count == 0 + assert response.starttls.call_count == 1 + assert response.login.call_count == 1 + assert response.sendmail.call_count == 1 + # Store our Sent Arguments + # Syntax is: + # sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=()) + # [0] [1] [2] + _from = response.sendmail.call_args[0][0] + _to = response.sendmail.call_args[0][1] + _msg = response.sendmail.call_args[0][2] + assert _from == 'user@gmail.com' + assert isinstance(_to, list) + assert len(_to) == 1 + assert _to[0] == 'test+notification@gmail.com' + assert _msg.split('\n')[-3] == 'test'