async def test_missing_certs(mock_certs, request, msg): with pytest.raises(FileNotFoundError) as error: _config = Config() _authenticator = _Authenticator(config=_config) server = AuthController(hostname=_config.SMTPD_HOST, port=_config.SMTPD_PORT, config=_config, authenticator=_authenticator) request.addfinalizer(server.stop) server.start() with SMTP(server.hostname, server.port) as client: client.send_message(msg) assert error.type == FileNotFoundError
async def test_exception_handler(request, msg): def raise_error(): raise Exception("Deliberately raised error.") server = AuthController() request.addfinalizer(server.stop) server.start() with pytest.raises(Exception): with SMTP(server.hostname, server.port) as client: client.ehlo() server.loop.call_soon_threadsafe(raise_error) client.send_message(msg) assert len(server.messages) == 1
async def test_custom_cert_and_key(request, tmp_path_factory, msg): path = tmp_path_factory.mktemp("certs") generate_certs(path, separate_key=True) _config = Config() _config.use_ssl = True _config.ssl_cert_files = (path.joinpath("cert.pem"), path.joinpath("key.pem")) server = AuthController(config=_config) request.addfinalizer(server.stop) server.start() with SMTP_SSL(server.hostname, server.port) as client: client.send_message(msg) assert len(server.messages) == 1
async def test_config_file(request, msg): _original_env = os.environ.copy() config_file = Path(__file__).parent.joinpath("assets/.test.env") _config = Config(filename=config_file, override=True) server = AuthController(hostname=_config.SMTPD_HOST, port=_config.SMTPD_PORT, config=_config) request.addfinalizer(server.stop) server.start() with SMTP(server.hostname, server.port) as client: client.send_message(msg) assert server.port == "5025" os.environ.clear() os.environ.update(_original_env)
async def test_missing_certs(request, msg): with pytest.raises(FileNotFoundError) as error: _config = Config() _config.use_starttls = True _config.ssl_certs_path = "." _authenticator = _Authenticator(config=_config) server = AuthController(hostname=_config.host, port=_config.port, config=_config, authenticator=_authenticator) request.addfinalizer(server.stop) server.start() with SMTP(server.hostname, server.port) as client: client.send_message(msg) assert error.type == FileNotFoundError
async def test_custom_ssl_context(request, tmp_path_factory, msg): path = tmp_path_factory.mktemp("certs") generate_certs(path, separate_key=True) cert_path = path.joinpath("cert.pem").resolve() key_path = path.joinpath("key.pem").resolve() _context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) _context.load_cert_chain(str(cert_path), str(key_path)) server = AuthController(ssl_context=_context) request.addfinalizer(server.stop) server.config.use_starttls = True server.start() with SMTP(server.hostname, server.port) as client: client.starttls() client.send_message(msg) assert len(server.messages) == 1
def test_TLS_not_supported(request, tmp_path_factory, msg, user): path = tmp_path_factory.mktemp("certs") _generate_certs(path) ssl_cert_files = str(path.joinpath("cert.pem")) context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) context.load_verify_locations(ssl_cert_files) context.load_cert_chain(ssl_cert_files) config = Config() config.enforce_auth = True config.use_ssl = True server = AuthController(config=config, authenticator=_Authenticator(config), ssl_context=context) request.addfinalizer(server.stop) server.start() with pytest.raises(SMTPServerDisconnected): with SMTP(server.hostname, server.port) as client: # this should return a 523 Encryption required error # but instead returns an SMTPServerDisconnected Error client.send_message(msg) assert len(server.messages) == 1