f06eec8a35
This could result in "hanging" robot accounts, although that would only leak the names of said accounts. Now we delete them immediately AND we proactively delete them before replacing the namespace (just to be sure)
105 lines
3.6 KiB
Python
105 lines
3.6 KiB
Python
from datetime import datetime
|
|
|
|
import pytest
|
|
|
|
from mock import patch
|
|
|
|
from data.database import EmailConfirmation, User, DeletedNamespace
|
|
from data.model.user import create_user_noverify, validate_reset_code, get_active_users
|
|
from data.model.user import mark_namespace_for_deletion, delete_namespace_via_marker
|
|
from data.model.user import create_robot, lookup_robot, list_namespace_robots
|
|
from data.model.user import InvalidRobotException
|
|
from util.timedeltastring import convert_to_timedelta
|
|
from data.queue import WorkQueue
|
|
from test.fixtures import *
|
|
|
|
def test_create_user_with_expiration(initialized_db):
|
|
with patch('data.model.config.app_config', {'DEFAULT_TAG_EXPIRATION': '1h'}):
|
|
user = create_user_noverify('foobar', 'foo@example.com', email_required=False)
|
|
assert user.removed_tag_expiration_s == 60 * 60
|
|
|
|
@pytest.mark.parametrize('token_lifetime, time_since', [
|
|
('1m', '2m'),
|
|
('2m', '1m'),
|
|
('1h', '1m'),
|
|
])
|
|
def test_validation_code(token_lifetime, time_since, initialized_db):
|
|
user = create_user_noverify('foobar', 'foo@example.com', email_required=False)
|
|
created = datetime.now() - convert_to_timedelta(time_since)
|
|
confirmation = EmailConfirmation.create(user=user, pw_reset=True, created=created)
|
|
|
|
with patch('data.model.config.app_config', {'USER_RECOVERY_TOKEN_LIFETIME': token_lifetime}):
|
|
result = validate_reset_code(confirmation.code)
|
|
expect_success = convert_to_timedelta(token_lifetime) >= convert_to_timedelta(time_since)
|
|
assert expect_success == (result is not None)
|
|
|
|
@pytest.mark.parametrize('disabled', [
|
|
(True),
|
|
(False),
|
|
])
|
|
def test_get_active_users(disabled, initialized_db):
|
|
users = get_active_users(disabled=disabled)
|
|
for user in users:
|
|
if not disabled:
|
|
assert user.enabled
|
|
|
|
def test_mark_namespace_for_deletion(initialized_db):
|
|
def create_transaction(db):
|
|
return db.transaction()
|
|
|
|
# Create a user and then mark it for deletion.
|
|
user = create_user_noverify('foobar', 'foo@example.com', email_required=False)
|
|
|
|
# Add some robots.
|
|
create_robot('foo', user)
|
|
create_robot('bar', user)
|
|
|
|
assert lookup_robot('foobar+foo') is not None
|
|
assert lookup_robot('foobar+bar') is not None
|
|
assert len(list(list_namespace_robots('foobar'))) == 2
|
|
|
|
# Mark the user for deletion.
|
|
queue = WorkQueue('testgcnamespace', create_transaction)
|
|
mark_namespace_for_deletion(user, [], queue)
|
|
|
|
# Ensure the older user is still in the DB.
|
|
older_user = User.get(id=user.id)
|
|
assert older_user.username != 'foobar'
|
|
|
|
# Ensure the robots are deleted.
|
|
with pytest.raises(InvalidRobotException):
|
|
assert lookup_robot('foobar+foo')
|
|
|
|
with pytest.raises(InvalidRobotException):
|
|
assert lookup_robot('foobar+bar')
|
|
|
|
assert len(list(list_namespace_robots(older_user.username))) == 0
|
|
|
|
# Ensure we can create a user with the same namespace again.
|
|
new_user = create_user_noverify('foobar', 'foo@example.com', email_required=False)
|
|
assert new_user.id != user.id
|
|
|
|
# Ensure the older user is still in the DB.
|
|
assert User.get(id=user.id).username != 'foobar'
|
|
|
|
|
|
def test_delete_namespace_via_marker(initialized_db):
|
|
def create_transaction(db):
|
|
return db.transaction()
|
|
|
|
# Create a user and then mark it for deletion.
|
|
user = create_user_noverify('foobar', 'foo@example.com', email_required=False)
|
|
|
|
# Mark the user for deletion.
|
|
queue = WorkQueue('testgcnamespace', create_transaction)
|
|
marker_id = mark_namespace_for_deletion(user, [], queue)
|
|
|
|
# Delete the user.
|
|
delete_namespace_via_marker(marker_id, [])
|
|
|
|
# Ensure the user was actually deleted.
|
|
with pytest.raises(User.DoesNotExist):
|
|
User.get(id=user.id)
|
|
|
|
with pytest.raises(DeletedNamespace.DoesNotExist):
|
|
DeletedNamespace.get(id=marker_id)
|