#!/usr/bin/env python3
"""Test the smtputils module."""
import os
from shutil import rmtree
from email.mime.text import MIMEText
from configparser import ConfigParser
try:
import unittest.mock as mock
except ImportError:
import mock
import bbarchivist.smtputils as bs
[docs]def setup_module(module):
"""
Create necessary files.
"""
if not os.path.exists("temp_smtputils"):
os.mkdir("temp_smtputils")
os.chdir("temp_smtputils")
[docs]def teardown_module(module):
"""
Delete necessary files.
"""
os.chdir("..")
rmtree("temp_smtputils", ignore_errors=True)
[docs]class TestClassSMTPUtils:
"""
Test SMTP-related tools.
"""
[docs] def test_smtp_config_generator(self):
"""
Test config filtering.
"""
results = {"server": "abc.xyz",
"port": 69,
"username": "luser",
"password": "hunter2",
"is_ssl": True}
assert bs.smtp_config_generator(results) == results
[docs] def test_smtp_confgen_fback(self):
"""
Test config fallback.
"""
dummy = {"server": None,
"port": 0,
"username": None,
"password": None,
"is_ssl": None}
results_y = {"server": "yes",
"port": "yes",
"username": "yes",
"password": "pas",
"is_ssl": "true"}
with mock.patch("getpass.getpass", mock.MagicMock(return_value="pas")):
with mock.patch("builtins.input", mock.MagicMock(return_value="yes")):
assert bs.smtp_config_generator(dummy) == results_y
[docs] def test_smtp_confgen_ssl(self):
"""
Test SSL fallback, specifically.
"""
dummy = {"server": None,
"port": 0,
"username": None,
"password": None,
"is_ssl": None}
results_n = {"server": "no",
"port": "no",
"username": "no",
"password": "pas",
"is_ssl": "false"}
with mock.patch("getpass.getpass", mock.MagicMock(return_value="pas")):
with mock.patch("builtins.input", mock.MagicMock(return_value="no")):
assert bs.smtp_config_generator(dummy) == results_n
[docs] def test_parse_kwargs(self):
"""
Test kwarg unpacking.
"""
results = {"server": "abc.xyz",
"port": 69,
"username": "luser",
"password": "hunter2",
"is_ssl": True}
assert bs.parse_kwargs(results) == (results['server'],
results['username'],
results['port'],
results['password'])
[docs] def test_generate_message(self):
"""
Test MIMEText message creation.
"""
body = "I am the prince of Nigeria"
username = "prince@gov.ng"
subject = "Urgent request"
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = username
msg['To'] = username
assert bs.generate_message(body, username, subject).as_string() == msg.as_string()
[docs] def test_generate_subject(self):
"""
Test subject generation.
"""
sbj = "SW APPLE - OS BANANA available!"
assert bs.generate_subject("APPLE", "BANANA") == sbj
[docs] def test_send_email(self):
"""
Test sending an email.
"""
kwargs = {"server": "abc.xyz",
"port": 69,
"username": "luser",
"password": None,
"is_ssl": False,
"software": "10.9.8.7654",
"os": "10.2.3.4567",
"body": "Hey! Listen!"}
with mock.patch('getpass.getpass', mock.MagicMock(return_value="hunter2")):
with mock.patch('smtplib.SMTP') as run_amock:
bs.send_email(kwargs)
run_amock.assert_called_with(kwargs['server'], kwargs['port'])
kwargs2 = kwargs
kwargs2['is_ssl'] = True
with mock.patch('smtplib.SMTP_SSL') as run_amock:
bs.send_email(kwargs2)
run_amock.assert_called_with(kwargs['server'], kwargs['port'])
[docs] def test_prep_email(self):
"""
Test preparing and sending an email.
"""
kwargs = {"server": "abc.xyz",
"port": 69,
"username": "luser",
"password": None,
"is_ssl": False,
"software": "10.9.8.7654",
"os": "10.2.3.4567",
"body": "Hey! Listen!"}
kwargsmin = {"server": "abc.xyz",
"port": 69,
"username": "luser",
"password": None,
"is_ssl": False}
with mock.patch('os.path.expanduser', mock.MagicMock(return_value=os.getcwd())):
with mock.patch('bbarchivist.smtputils.smtp_config_loader', mock.MagicMock(return_value=kwargsmin)):
with mock.patch('bbarchivist.utilities.return_and_delete', mock.MagicMock(return_value="Hey! Listen!")):
with mock.patch('smtplib.SMTP') as run_amock:
bs.prep_email("10.2.3.4567", "10.9.8.7654", "hunter2")
run_amock.assert_called_with(kwargs['server'], kwargs['port'])
[docs]class TestClassSMTPUtilsConfig:
"""
Test reading/writing configs with ConfigParser.
"""
@classmethod
[docs] def setup_class(cls):
"""
Create dictionaries for self.
"""
cls.smtpdict = {}
cls.smtpdict['username'] = "butt@butt.butt"
cls.smtpdict['password'] = "hunter2"
cls.smtpdict['server'] = "goatse.cx"
cls.smtpdict['port'] = 9001
cls.smtpdict['is_ssl'] = "false"
cls.bogusdict = {}
cls.bogusdict['username'] = None
cls.bogusdict['password'] = None
cls.bogusdict['server'] = None
cls.bogusdict['port'] = 0
cls.bogusdict['is_ssl'] = None
[docs] def test_smtp_loader_empty(self):
"""
Test reading SMTP settings when empty.
"""
try:
FileNotFoundError
except NameError:
FileNotFoundError = IOError
try:
os.remove("bbarchivist.ini")
except (OSError, FileNotFoundError):
pass
with mock.patch('os.path.expanduser', mock.MagicMock(return_value=os.getcwd())):
with mock.patch('configparser.ConfigParser.read', mock.MagicMock(return_value=self.bogusdict)):
assert bs.smtp_config_loader() == self.bogusdict
[docs] def test_smtp_loader_completed(self):
"""
Test reading SMTP settings when completed.
"""
config = ConfigParser()
open("bbarchivist.ini", 'w').close()
config.read("bbarchivist.ini")
config['email'] = {}
config['email']['username'] = "butt@butt.butt"
config['email']['password'] = "hunter2"
config['email']['server'] = "goatse.cx"
config['email']['port'] = "9001"
config['email']['is_ssl'] = "false"
with open("bbarchivist.ini", "w") as configfile:
config.write(configfile)
assert bs.smtp_config_loader(os.getcwd()) == self.smtpdict
[docs] def test_smtp_writer(self):
"""
Test writing compression settings.
"""
try:
FileNotFoundError
except NameError:
FileNotFoundError = IOError
try:
os.remove("bbarchivist.ini")
except (OSError, FileNotFoundError):
pass
dict2 = self.smtpdict
dict2['port'] = 6969
with mock.patch('os.path.expanduser', mock.MagicMock(return_value=os.getcwd())):
bs.smtp_config_writer(homepath=None, **dict2)
assert bs.smtp_config_loader() == dict2