add test for RemoteMailmanService

This commit is contained in:
Max Erenberg 2021-08-19 22:08:48 +00:00
parent 490abb302c
commit 46fd926acc
4 changed files with 83 additions and 8 deletions

View File

@ -2,4 +2,4 @@
ignore =
# line too long
E501
exclude = .git,.vscode,venv,__pycache__,__init__.py,conftest.py,build,dist
exclude = .git,.vscode,venv,__pycache__,__init__.py,build,dist

View File

View File

@ -0,0 +1,42 @@
from multiprocessing import Process
import socket
import sys
import time
import requests
from ceo_common.model import RemoteMailmanService
def test_remote_mailman(cfg, http_client, app, mock_mailman_server, g_syscom):
port = cfg.get('ceod_port')
hostname = socket.gethostname()
def server_start():
sys.stdout = open('/dev/null', 'w')
sys.stderr = sys.stdout
app.run(debug=False, host='0.0.0.0', port=port)
proc = Process(target=server_start)
proc.start()
for _ in range(5):
try:
http_client.get(hostname, '/ping')
except requests.exceptions.ConnectionError:
time.sleep(0.5)
continue
break
try:
mailman_srv = RemoteMailmanService()
assert mock_mailman_server.subscriptions['csc-general'] == []
# RemoteMailmanService -> app -> MailmanService -> MockMailmanServer
address = 'test_1@csclub.internal'
mailman_srv.subscribe(address, 'csc-general')
assert mock_mailman_server.subscriptions['csc-general'] == [address]
mailman_srv.unsubscribe(address, 'csc-general')
assert mock_mailman_server.subscriptions['csc-general'] == []
finally:
proc.terminate()
proc.join()

View File

@ -5,6 +5,7 @@ import os
import pwd
import shutil
import subprocess
from subprocess import DEVNULL
import tempfile
from unittest.mock import patch
@ -16,15 +17,14 @@ from zope import component
from ceo_common.interfaces import IConfig, IKerberosService, ILDAPService, \
IFileService, IMailmanService, IHTTPClient, IUWLDAPService, IMailService
from ceo_common.model import Config, RemoteMailmanService, HTTPClient
from ceo_common.model import Config, HTTPClient
from ceod.api import create_app
from ceod.model import KerberosService, LDAPService, FileService, User, \
MailmanService, Group, UWLDAPService, UWLDAPRecord, MailService
from ceod.model.utils import strings_to_bytes
import ceod.utils as utils
from .MockSMTPServer import MockSMTPServer
from .MockMailmanServer import MockMailmanServer
from .conftest_ceod_api import client
from .conftest_ceod_api import client # noqa: F401
@pytest.fixture(scope='session')
@ -96,6 +96,40 @@ def g_admin_ctx(cfg, ceod_admin_creds, app):
return wrapper
@pytest.fixture(scope='session')
def syscom_creds():
"""
Acquire credentials for a syscom member and store them in a ccache.
Yields the name of the ccache file.
"""
with tempfile.NamedTemporaryFile() as f:
subprocess.run(
['kinit', '-c', f.name, 'ctdalek'],
check=True, text=True, input='krb5', stdout=DEVNULL,
)
yield f.name
@pytest.fixture
def g_syscom(syscom_creds, app):
"""
Store the principal for the syscom member in flask.g, and point
KRB5CCNAME to the file where the TGT is stored.
Use this fixture if you need syscom credentials for an HTTP request
to a different process.
"""
filename = syscom_creds
with app.app_context():
old_krb5ccname = os.environ['KRB5CCNAME']
os.environ['KRB5CCNAME'] = 'FILE:' + filename
try:
flask.g.sasl_user = 'ctdalek'
yield filename
finally:
os.environ['KRB5CCNAME'] = old_krb5ccname
flask.g.pop('sasl_user')
@pytest.fixture(scope='session')
def ldap_conn(cfg, ceod_admin_creds) -> ldap3.Connection:
# Assume that the same server URL is being used for the CSC
@ -119,7 +153,6 @@ def ldap_srv_session(cfg, krb_srv, ldap_conn):
for base_dn in [users_base, groups_base, sudo_base]:
delete_subtree(conn, base_dn)
ou = base_dn.split(',', 1)[0].split('=')[1]
conn.add(base_dn, 'organizationalUnit')
_ldap_srv = LDAPService()
@ -156,9 +189,9 @@ def file_srv(cfg):
@pytest.fixture(scope='session')
def http_client(cfg):
client = HTTPClient()
component.provideUtility(client, IHTTPClient)
return
_client = HTTPClient()
component.provideUtility(_client, IHTTPClient)
return _client
@pytest.fixture(scope='session')