diff --git a/rdmo/management/tests/test_frontend.py b/rdmo/management/tests/test_frontend.py new file mode 100644 index 0000000000..361b384a64 --- /dev/null +++ b/rdmo/management/tests/test_frontend.py @@ -0,0 +1,177 @@ +import os + +import pytest + +from django.core.management import call_command + +from playwright.sync_api import Page, expect +from pytest_django.live_server_helper import LiveServer + +from rdmo.accounts.utils import set_group_permissions +from rdmo.conditions.models import Condition +from rdmo.domain.models import Attribute +from rdmo.options.models import Option, OptionSet +from rdmo.questions.models import Catalog, Question, Section +from rdmo.questions.models import Page as PageModel +from rdmo.questions.models.questionset import QuestionSet +from rdmo.tasks.models import Task +from rdmo.views.models import View + +# Ref: https://pytest-django.readthedocs.io/en/latest/helpers.html#live-server +# https://playwright.dev/python/docs/auth + + +pytestmark = pytest.mark.e2e + +# TODO: django_db_serialized_rollback + +# needed for playwright to run +os.environ.setdefault("DJANGO_ALLOW_ASYNC_UNSAFE", "true") + + +@pytest.fixture(scope="function") +def e2e_tests_django_db_setup(django_db_setup, django_db_blocker, fixtures): + """Set up database and populate with fixtures, that get restored for every test case.""" + with django_db_blocker.unblock(): + call_command('loaddata', *fixtures) + set_group_permissions() + + +@pytest.fixture(scope="session") +def base_url(live_server: LiveServer) -> str: + """Enable playwright to address URLs with base URL automatically prefixed.""" + return live_server.url + + +@pytest.fixture +def logged_in_admin_user(e2e_tests_django_db_setup, page: Page) -> Page: + """Log in as admin user through django login UI, returns logged in page for e2e tests.""" + page.goto("/account/login") + page.get_by_label("Username").fill("admin", timeout=5000) + page.get_by_label("Password").fill("admin") + page.get_by_role("button", name="Login").click() + page.goto("/management") + yield page + + +def test_management_navigation(logged_in_admin_user: Page) -> None: + """Test that each content type is available through the navigation.""" + page = logged_in_admin_user + expect(page.get_by_role("heading", name="Management")).to_be_visible() + page.get_by_role("link", name="Catalogs").click() + expect(page.locator("strong").filter(has_text="Catalogs")).to_be_visible() + page.get_by_role("link", name="Sections").click() + page.get_by_role("link", name="Pages").click() + page.get_by_role("link", name="Question sets").click() + page.get_by_role("link", name="Questions", exact=True).click() + page.get_by_role("link", name="Attributes").click() + page.get_by_role("link", name="Option sets").click() + page.get_by_role("link", name="Options", exact=True).click() + page.get_by_role("link", name="Conditions").click() + page.get_by_role("link", name="Tasks").click() + page.get_by_role("link", name="Views").click() + + +def test_management_has_catalogs(logged_in_admin_user: Page) -> None: + """Test all catalogs in database are visible in management UI.""" + page = logged_in_admin_user + page.goto("/management/catalogs") + catalogs = page.locator(".list-group > .list-group-item") + num_catalogs = Catalog.objects.count() + expect(catalogs).to_have_count(num_catalogs) + + +def test_management_has_sections(logged_in_admin_user: Page) -> None: + """Test all sections in database are visible in management UI.""" + page = logged_in_admin_user + page.goto("/management/sections") + sections = page.locator(".list-group > .list-group-item") + num_sections = Section.objects.count() + expect(sections).to_have_count(num_sections) + + +def test_management_has_pages(logged_in_admin_user: Page) -> None: + """Test all pages in database are visible in management UI.""" + page = logged_in_admin_user + page.goto("/management/pages") + pages = page.locator(".list-group > .list-group-item") + num_pages = PageModel.objects.count() + expect(pages).to_have_count(num_pages) + + +def test_management_has_questionsets(logged_in_admin_user: Page) -> None: + """Test all question sets in database are visible in management UI.""" + page = logged_in_admin_user + page.goto("/management/questionsets") + questionsets = page.locator(".list-group > .list-group-item") + num_questionsets = QuestionSet.objects.count() + expect(questionsets).to_have_count(num_questionsets) + + +def test_management_has_questions(logged_in_admin_user: Page) -> None: + """Test all questions in database are visible in management UI.""" + page = logged_in_admin_user + page.goto("/management/questions") + questions = page.locator(".list-group > .list-group-item") + num_questions = Question.objects.count() + expect(questions).to_have_count(num_questions) + + +def test_management_has_attributes(logged_in_admin_user: Page) -> None: + """Test all attributes in database are visible in management UI.""" + page = logged_in_admin_user + page.goto("/management/attributes") + attributes = page.locator(".list-group > .list-group-item") + num_attributes = Attribute.objects.count() + expect(attributes).to_have_count(num_attributes) + + +def test_management_has_optionsets(logged_in_admin_user: Page) -> None: + """Test all option sets in database are visible in management UI.""" + page = logged_in_admin_user + page.goto("/management/optionsets") + optionsets = page.locator(".list-group > .list-group-item") + num_optionsets = OptionSet.objects.count() + expect(optionsets).to_have_count(num_optionsets) + + +def test_management_has_options(logged_in_admin_user: Page) -> None: + """Test all options in database are visible in management UI.""" + page = logged_in_admin_user + page.goto("/management/options") + options = page.locator(".list-group > .list-group-item") + num_options = Option.objects.count() + expect(options).to_have_count(num_options) + + +def test_management_has_conditions(logged_in_admin_user: Page) -> None: + """Test all conditions in database are visible in management UI.""" + page = logged_in_admin_user + page.goto("/management/conditions") + conditions = page.locator(".list-group > .list-group-item") + num_conditions = Condition.objects.count() + expect(conditions).to_have_count(num_conditions) + + +def test_management_has_tasks(logged_in_admin_user: Page) -> None: + """Test all tasks in database are visible in management UI.""" + page = logged_in_admin_user + page.goto("/management/tasks") + tasks = page.locator(".list-group > .list-group-item") + num_tasks = Task.objects.count() + expect(tasks).to_have_count(num_tasks) + + +def test_management_has_views(logged_in_admin_user: Page) -> None: + """Test all views in database are visible in management UI.""" + page = logged_in_admin_user + page.goto("/management/views") + views = page.locator(".list-group > .list-group-item") + num_views = View.objects.count() + expect(views).to_have_count(num_views) + + +def test_management_catalog_nested_view(logged_in_admin_user: Page) -> None: + + page = logged_in_admin_user + page.goto("/management/catalogs")