parent
fa9c2b33d5
commit
bb7818e77d
@ -0,0 +1,7 @@ |
||||
import datetime |
||||
|
||||
|
||||
def get_current_datetime() -> datetime.datetime: |
||||
# We place this in a separate function so that we can mock it out |
||||
# in our unit tests. |
||||
return datetime.datetime.now() |
@ -0,0 +1,86 @@ |
||||
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() |
Loading…
Reference in new issue