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()