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 = ignore =
# line too long # line too long
E501 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 pwd
import shutil import shutil
import subprocess import subprocess
from subprocess import DEVNULL
import tempfile import tempfile
from unittest.mock import patch from unittest.mock import patch
@ -16,15 +17,14 @@ from zope import component
from ceo_common.interfaces import IConfig, IKerberosService, ILDAPService, \ from ceo_common.interfaces import IConfig, IKerberosService, ILDAPService, \
IFileService, IMailmanService, IHTTPClient, IUWLDAPService, IMailService 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.api import create_app
from ceod.model import KerberosService, LDAPService, FileService, User, \ from ceod.model import KerberosService, LDAPService, FileService, User, \
MailmanService, Group, UWLDAPService, UWLDAPRecord, MailService MailmanService, Group, UWLDAPService, UWLDAPRecord, MailService
from ceod.model.utils import strings_to_bytes
import ceod.utils as utils import ceod.utils as utils
from .MockSMTPServer import MockSMTPServer from .MockSMTPServer import MockSMTPServer
from .MockMailmanServer import MockMailmanServer from .MockMailmanServer import MockMailmanServer
from .conftest_ceod_api import client from .conftest_ceod_api import client # noqa: F401
@pytest.fixture(scope='session') @pytest.fixture(scope='session')
@ -96,6 +96,40 @@ def g_admin_ctx(cfg, ceod_admin_creds, app):
return wrapper 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') @pytest.fixture(scope='session')
def ldap_conn(cfg, ceod_admin_creds) -> ldap3.Connection: def ldap_conn(cfg, ceod_admin_creds) -> ldap3.Connection:
# Assume that the same server URL is being used for the CSC # 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]: for base_dn in [users_base, groups_base, sudo_base]:
delete_subtree(conn, base_dn) delete_subtree(conn, base_dn)
ou = base_dn.split(',', 1)[0].split('=')[1]
conn.add(base_dn, 'organizationalUnit') conn.add(base_dn, 'organizationalUnit')
_ldap_srv = LDAPService() _ldap_srv = LDAPService()
@ -156,9 +189,9 @@ def file_srv(cfg):
@pytest.fixture(scope='session') @pytest.fixture(scope='session')
def http_client(cfg): def http_client(cfg):
client = HTTPClient() _client = HTTPClient()
component.provideUtility(client, IHTTPClient) component.provideUtility(_client, IHTTPClient)
return return _client
@pytest.fixture(scope='session') @pytest.fixture(scope='session')