87 lines
3.0 KiB
Python
87 lines
3.0 KiB
Python
|
import datetime
|
||
|
import os
|
||
|
from unittest.mock import patch
|
||
|
|
||
|
import ldap3
|
||
|
|
||
|
from ceo_common.model import Term
|
||
|
import ceo_common.utils as ceo_common_utils
|
||
|
|
||
|
|
||
|
def expire_member(user, ldap_conn):
|
||
|
most_recent_term = max(map(Term, user.terms))
|
||
|
new_term = most_recent_term - 1
|
||
|
changes = {
|
||
|
'term': [(ldap3.MODIFY_REPLACE, [str(new_term)])]
|
||
|
}
|
||
|
dn = user.ldap_srv.uid_to_dn(user.uid)
|
||
|
ldap_conn.modify(dn, changes)
|
||
|
|
||
|
|
||
|
def test_create_account(client, mock_cloud_server, new_user, ldap_conn):
|
||
|
uid = new_user.uid
|
||
|
mock_cloud_server.clear()
|
||
|
status, _ = client.post('/api/cloud/accounts/create', principal=uid)
|
||
|
assert status == 200
|
||
|
assert uid in mock_cloud_server.users_by_username
|
||
|
|
||
|
status, _ = client.post('/api/cloud/accounts/create', principal=uid)
|
||
|
assert status != 200
|
||
|
|
||
|
mock_cloud_server.clear()
|
||
|
expire_member(new_user, ldap_conn)
|
||
|
status, _ = client.post('/api/cloud/accounts/create', principal=uid)
|
||
|
assert status == 403
|
||
|
|
||
|
|
||
|
def test_purge_accounts(
|
||
|
client, mock_cloud_server, cloud_srv, mock_mail_server, new_user,
|
||
|
ldap_conn,
|
||
|
):
|
||
|
uid = new_user.uid
|
||
|
mock_cloud_server.clear()
|
||
|
mock_mail_server.messages.clear()
|
||
|
accounts_deleted = []
|
||
|
accounts_to_be_deleted = []
|
||
|
if os.path.isfile(cloud_srv.pending_deletions_file):
|
||
|
os.unlink(cloud_srv.pending_deletions_file)
|
||
|
expected = {
|
||
|
'accounts_deleted': accounts_deleted,
|
||
|
'accounts_to_be_deleted': accounts_to_be_deleted,
|
||
|
}
|
||
|
current_term = Term.current()
|
||
|
beginning_of_term = current_term.to_datetime()
|
||
|
client.post('/api/cloud/accounts/create', principal=uid)
|
||
|
expire_member(new_user, ldap_conn)
|
||
|
with patch.object(ceo_common_utils, 'get_current_datetime') as now_mock:
|
||
|
# one-month grace period - account should not be deleted
|
||
|
now_mock.return_value = beginning_of_term + datetime.timedelta(days=1)
|
||
|
status, data = client.post('/api/cloud/accounts/purge')
|
||
|
assert status == 200
|
||
|
assert data == expected
|
||
|
|
||
|
# grace period has passed - user should be sent a warning
|
||
|
now_mock.return_value += datetime.timedelta(days=32)
|
||
|
accounts_to_be_deleted.append(new_user.uid)
|
||
|
status, data = client.post('/api/cloud/accounts/purge')
|
||
|
assert status == 200
|
||
|
assert data == expected
|
||
|
assert os.path.isfile(cloud_srv.pending_deletions_file)
|
||
|
assert len(mock_mail_server.messages) == 1
|
||
|
|
||
|
# user still has one week left to renew their membership
|
||
|
status, data = client.post('/api/cloud/accounts/purge')
|
||
|
assert status == 200
|
||
|
assert data == expected
|
||
|
|
||
|
# one week has passed - the account can now be deleted
|
||
|
now_mock.return_value += datetime.timedelta(days=8)
|
||
|
accounts_to_be_deleted.clear()
|
||
|
accounts_deleted.append(new_user.uid)
|
||
|
status, data = client.post('/api/cloud/accounts/purge')
|
||
|
assert status == 200
|
||
|
assert data == expected
|
||
|
assert new_user.uid not in mock_cloud_server.users_by_username
|
||
|
assert len(mock_mail_server.messages) == 2
|
||
|
mock_mail_server.messages.clear()
|