Files
notifications-api/tests/app/dao/test_invited_user_dao.py
Leo Hemsted 6181c60f75 remove usage of notify_db fixture in unit tests
* notify_db fixture creates the database connection and ensures the test
  db exists and has migrations applied etc. It will run once per session
  (test run).
* notify_db_session fixture runs after your test finishes and deletes
  all non static (eg type table) data.

In unit tests that hit the database (ie: most of them), 99% of the time
we will need to use notify_db_session to ensure everything is reset. The
only time we don't need to use it is when we're querying things such as
"ensure get X works when database is empty". This is such a low
percentage of tests that it's easier for us to just use
notify_db_session every time, and ensure that all our tests run much
more consistently, at the cost of a small bit of performance when
running tests.

We used to use notify_db to access the session object for manually
adding, committing, etc. To dissuade usage of that fixture I've moved
that to the `notify_db_session`. I've then removed all uses of notify_db
that I could find in the codebase.

As a note, if you're writing a test that uses a `sample_x` fixture, all
of those fixtures rely on notify_db_session so you'll get the teardown
functionality for free. If you're just calling eg `create_x` db.py
functions, then you'll need to make you add notify_db_session fixture to
your test, even if you aren't manually accessing the session.
2022-05-04 11:36:54 +01:00

149 lines
5.0 KiB
Python

import uuid
from datetime import datetime, timedelta
import pytest
from sqlalchemy.orm.exc import NoResultFound
from app import db
from app.dao.invited_user_dao import (
delete_invitations_created_more_than_two_days_ago,
get_invited_user_by_id,
get_invited_user_by_service_and_id,
get_invited_users_for_service,
save_invited_user,
)
from app.models import InvitedUser
from tests.app.db import create_invited_user
def test_create_invited_user(notify_db_session, sample_service):
assert InvitedUser.query.count() == 0
email_address = 'invited_user@service.gov.uk'
invite_from = sample_service.users[0]
data = {
'service': sample_service,
'email_address': email_address,
'from_user': invite_from,
'permissions': 'send_messages,manage_service',
'folder_permissions': []
}
invited_user = InvitedUser(**data)
save_invited_user(invited_user)
assert InvitedUser.query.count() == 1
assert invited_user.email_address == email_address
assert invited_user.from_user == invite_from
permissions = invited_user.get_permissions()
assert len(permissions) == 2
assert 'send_messages' in permissions
assert 'manage_service' in permissions
assert invited_user.folder_permissions == []
def test_create_invited_user_sets_default_folder_permissions_of_empty_list(
sample_service,
):
assert InvitedUser.query.count() == 0
invite_from = sample_service.users[0]
data = {
'service': sample_service,
'email_address': 'invited_user@service.gov.uk',
'from_user': invite_from,
'permissions': 'send_messages,manage_service',
}
invited_user = InvitedUser(**data)
save_invited_user(invited_user)
assert InvitedUser.query.count() == 1
assert invited_user.folder_permissions == []
def test_get_invited_user_by_service_and_id(notify_db_session, sample_invited_user):
from_db = get_invited_user_by_service_and_id(sample_invited_user.service.id, sample_invited_user.id)
assert from_db == sample_invited_user
def test_get_invited_user_by_id(notify_db_session, sample_invited_user):
from_db = get_invited_user_by_id(sample_invited_user.id)
assert from_db == sample_invited_user
def test_get_unknown_invited_user_returns_none(notify_db_session, sample_service):
unknown_id = uuid.uuid4()
with pytest.raises(NoResultFound) as e:
get_invited_user_by_service_and_id(sample_service.id, unknown_id)
assert 'No row was found when one was required' in str(e.value)
def test_get_invited_users_for_service(notify_db_session, sample_service):
invites = []
for i in range(0, 5):
email = 'invited_user_{}@service.gov.uk'.format(i)
invited_user = create_invited_user(sample_service, to_email_address=email)
invites.append(invited_user)
all_from_db = get_invited_users_for_service(sample_service.id)
assert len(all_from_db) == 5
for invite in invites:
assert invite in all_from_db
def test_get_invited_users_for_service_that_has_no_invites(notify_db_session, sample_service):
invites = get_invited_users_for_service(sample_service.id)
assert len(invites) == 0
def test_save_invited_user_sets_status_to_cancelled(notify_db_session, sample_invited_user):
assert InvitedUser.query.count() == 1
saved = InvitedUser.query.get(sample_invited_user.id)
assert saved.status == 'pending'
saved.status = 'cancelled'
save_invited_user(saved)
assert InvitedUser.query.count() == 1
cancelled_invited_user = InvitedUser.query.get(sample_invited_user.id)
assert cancelled_invited_user.status == 'cancelled'
def test_should_delete_all_invitations_more_than_one_day_old(
sample_user,
sample_service):
make_invitation(sample_user, sample_service, age=timedelta(hours=48))
make_invitation(sample_user, sample_service, age=timedelta(hours=48))
assert len(InvitedUser.query.all()) == 2
delete_invitations_created_more_than_two_days_ago()
assert len(InvitedUser.query.all()) == 0
def test_should_not_delete_invitations_less_than_two_days_old(
sample_user,
sample_service):
make_invitation(sample_user, sample_service, age=timedelta(hours=47, minutes=59, seconds=59),
email_address="valid@2.com")
make_invitation(sample_user, sample_service, age=timedelta(hours=48),
email_address="expired@1.com")
assert len(InvitedUser.query.all()) == 2
delete_invitations_created_more_than_two_days_ago()
assert len(InvitedUser.query.all()) == 1
assert InvitedUser.query.first().email_address == "valid@2.com"
def make_invitation(user, service, age=None, email_address="test@test.com"):
verify_code = InvitedUser(
email_address=email_address,
from_user=user,
service=service,
status='pending',
created_at=datetime.utcnow() - (age or timedelta(hours=0)),
permissions='manage_settings',
folder_permissions=[str(uuid.uuid4())]
)
db.session.add(verify_code)
db.session.commit()