import pytest from atlas_um.admin_settings.forms import ( BusinessUnitForm, PersonnelTypeForm, JobCategoryForm, ResourceGroupForm, ClaimNameForm, ClaimValueForm, InternalUserDomainForm, ) from atlas_um.helpers.ordering import QueryOrdering from atlas_um.helpers.pagination import QueryPagination from atlas_um.pgdb import ( ResourceGroup, BusinessUnit, PersonnelType, JobCategory, ClaimName, ClaimValue, InternalUserDomain, ) from atlas_um.template_filters import _dumps from tests.atlas_um.factories import ( BusinessUnitFactory, JobCategoryFactory, PersonnelTypeFactory, ResourceGroupFactory, ClaimNameFactory, ClaimValueFactory, InternalUserDomainFactory, ) from . import helpers from tests.atlas_um.pytest_helpers import UrlForThisMixin, RenderSOUPMixin class BaseTestUserDetailsList(UrlForThisMixin, RenderSOUPMixin): FAKE_HOST = "atlas_um.test" ENDPOINT = "" TEMPLATE = "admin_settings/user_details_list.html" model = None form_class = None factory_class = None title = "" @pytest.fixture def app_config(self): def inner(app): app.config["SERVER_NAME"] = self.FAKE_HOST return inner def test_title(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): page = self.render_soup(**self.get_context()) expected_title = f"Admin settings: {self.title}" assert page.title.get_text(strip=True) == expected_title assert ( page.find(id="subnav-header") .find(string=True, recursive=False) .strip() == "Admin settings" ) assert ( page.select_one(".ui.main.container.content h4").get_text( strip=True ) == self.title ) def test_fields(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): obj = self.factory_class.build() pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert ( page.select_one( ".settings-item .settings-field.name .item-repr" ).get_text(strip=True) == obj.name ) assert ( page.select_one(".settings-item .settings-field.slug").get_text( strip=True ) == obj.slug ) def test_forms(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): obj = self.factory_class.build() pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert page.select_one(".add-item-button") is not None assert page.find(id="search-item-form") is not None assert ( page.find(id="new-item-form").attrs.get("action") == "test_url_for_create" ) assert page.select_one(".ui.input.popup-value #name") is not None assert ( page.select_one("#new-item-button").get_text(strip=True) == "Apply" ) assert page.find(id="update-item-form").attrs.get("action") == "#" assert page.find(id="csrf_token") is not None assert page.select_one(".master-header input[name=name]") is not None assert ( page.select_one(".master-header button[type=submit]").get_text( strip=True ) == "Search" ) assert ( page.select(".settings-item .item-input input[name-name]") is not None ) assert ( page.select_one( ".settings-item .settings-field.name .item-input input" ) is not None ) assert ( page.select_one(".settings-item .settings-is-active input") is not None ) assert ( page.select_one(".settings-item").attrs.get("data-action-url") == f"test_url_for_update_{obj.id}" ) def test_sidebar(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): page = self.render_soup(**self.get_context()) assert self.title in page.select_one(".left-menu").get_text(strip=True) assert self.url_for_this( app, endpoint=f"{self.ENDPOINT}", _external=False ) in [el.attrs.get("href") for el in page.select(".left-menu .item")] def test_frontend_libs_are_added(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): page = self.render_soup(**self.get_context()) assert all(helpers.added_frontend_libs(page)) assert ( page.find("script", attrs={"src": "/static/js/admin-settings.js"}) is not None ) def test_pagination(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): page = self.render_soup(**self.get_context()) assert page.select_one(".pagination") is not None def get_context(self): ordering = QueryOrdering( self.model.query, [self.model.name, self.model.slug] ) pagination = QueryPagination(query=ordering.query) context = { "objects": pagination.items, "ordering": ordering, "pagination": pagination, "title": self.title, "form": self.form_class(), "resource_groups": ResourceGroup.query.active(), "url_for_create": lambda **kwargs: "test_url_for_create", "url_for_update": lambda **kwargs: f"test_url_for_update_{kwargs.get('id')}", # noqa } return context class TestBusinessUnits(BaseTestUserDetailsList): model = BusinessUnit form_class = BusinessUnitForm factory_class = BusinessUnitFactory title = "Business Units" ENDPOINT = "admin_settings.business_units" class TestJobCategories(BaseTestUserDetailsList): model = JobCategory form_class = JobCategoryForm factory_class = JobCategoryFactory title = "Job Categories" ENDPOINT = "admin_settings.job_categories" class TestPersonnelTypes(BaseTestUserDetailsList): model = PersonnelType form_class = PersonnelTypeForm factory_class = PersonnelTypeFactory title = "Personnel Types" ENDPOINT = "admin_settings.personnel_types" class TestResourceGroups(UrlForThisMixin, RenderSOUPMixin): FAKE_HOST = "atlas_um.test" ENDPOINT = "admin_settings.resource_groups" TEMPLATE = "admin_settings/resource_groups_list.html" model = ResourceGroup form_class = ResourceGroupForm factory_class = ResourceGroupFactory title = "Resource Groups" @pytest.fixture def app_config(self): def inner(app): app.config["SERVER_NAME"] = self.FAKE_HOST return inner def test_title(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): page = self.render_soup(**self.get_context()) expected_title = f"Admin settings: {self.title}" assert page.title.get_text(strip=True) == expected_title assert ( page.find(id="subnav-header") .find(string=True, recursive=False) .strip() == "Admin settings" ) assert ( page.select_one(".ui.main.container.content h4").get_text( strip=True ) == self.title ) def test_fields(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): obj = self.factory_class.build() pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert ( page.select_one( ".settings-item .settings-field.name .item-repr" ).get_text(strip=True) == obj.name ) assert ( page.select_one( ".settings-item .settings-field.namespace_url" ).get_text(strip=True) == obj.namespace_url ) assert ( page.select_one( ".settings-item .settings-field.external_id" ).get_text(strip=True) == obj.external_id ) assert page.select_one( ".settings-item .settings-field.session_ttl" ).get_text(strip=True) == str(obj.session_ttl) assert page.select_one( ".settings-item .settings-field.active_session_ttl" ).get_text(strip=True) == str(obj.active_session_ttl) assert ( page.select_one( ".settings-item .settings-field.affected" ).get_text(strip=True) == "0" ) def test_forms(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): obj = self.factory_class.build() pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert page.find(id="search-item-form") is not None assert page.select_one(".add-item-button") is not None assert ( page.find(id="new-item-form").attrs.get("action") == "test_url_for_create" ) assert page.select_one(".ui.input.popup-value #name") is not None assert ( page.select_one(".ui.input.popup-value #external_id") is not None ) assert ( page.select_one(".ui.input.popup-value #service_url") is not None ) assert ( page.select_one(".ui.input.popup-value #session_ttl") is not None ) assert ( page.select_one(".ui.input.popup-value #active_session_ttl") is not None ) assert ( page.select_one("#new-item-button").get_text(strip=True) == "Apply" ) assert page.find(id="update-item-form").attrs.get("action") == "#" assert page.find(id="csrf_token") is not None assert page.select_one(".master-header input[name=name]") is not None assert ( page.select_one(".master-header button[type=submit]").get_text( strip=True ) == "Search" ) assert ( page.select(".settings-item .item-input input[name=name]") is not None ) assert ( page.select_one( ".settings-item .settings-field.name .item-input input" ) is not None ) assert ( page.select_one(".settings-item .settings-is-active input") is not None ) assert ( page.select_one(".settings-item").attrs.get("data-action-url") == f"test_url_for_update_{obj.id}" ) def test_sidebar(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): obj = self.factory_class.build() pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert self.title in page.select_one(".left-menu").get_text(strip=True) assert self.url_for_this( app, endpoint=f"{self.ENDPOINT}", _external=False ) in [el.attrs.get("href") for el in page.select(".left-menu .item")] def test_frontend_libs_are_added(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): page = self.render_soup(**self.get_context()) assert all(helpers.added_frontend_libs(page)) assert ( page.find("script", attrs={"src": "/static/js/admin-settings.js"}) is not None ) def get_context(self): ordering = QueryOrdering( self.model.query.active(), [ self.model.name, self.model.namespace_url, self.model.external_id, self.model.service_url, ], ) pagination = QueryPagination(query=ordering.query) context = { "objects": pagination.items, "ordering": ordering, "pagination": pagination, "title": self.title, "form": self.form_class(), "resource_groups": ResourceGroup.query.active(), "affected_count": {}, "url_for_create": lambda **kwargs: "test_url_for_create", "url_for_update": lambda **kwargs: f"test_url_for_update_{kwargs.get('id')}", # noqa } return context class TestClaimNames(UrlForThisMixin, RenderSOUPMixin): FAKE_HOST = "atlas_um.test" ENDPOINT = "admin_settings.claim_names" TEMPLATE = "admin_settings/claim_names_list.html" model = ClaimName form_class = ClaimNameForm factory_class = ClaimNameFactory title = "Claim Names" @pytest.fixture def app_config(self): def inner(app): app.config["SERVER_NAME"] = self.FAKE_HOST return inner def test_title(self, app, pgdb_session): resource_group = ResourceGroupFactory.build() pgdb_session.add(resource_group) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, resource_group_id=resource_group.id) ): page = self.render_soup(**self.get_context()) expected_title = f"Admin settings: {self.title}" assert page.title.get_text(strip=True) == expected_title assert ( page.find(id="subnav-header") .find(string=True, recursive=False) .strip() == "Admin settings" ) assert ( page.select_one(".ui.main.container.content h4").get_text( strip=True ) == self.title ) def test_fields(self, app, pgdb_session): resource_group = ResourceGroupFactory.build() pgdb_session.add(resource_group) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, resource_group_id=resource_group.id) ): obj = self.factory_class.build(resource_group=resource_group) pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert ( page.select_one( ".settings-item .settings-field.friendly .item-repr" ).get_text(strip=True) == obj.friendly ) assert ( page.select_one(".settings-item .settings-field.path").get_text( strip=True ) == obj.path ) assert ( page.select_one( ".settings-item .settings-field.external_id" ).get_text(strip=True) == obj.external_id ) assert ( page.select_one( ".settings-item .settings-field.claim_values_" "serializer .item-repr" ).get_text(strip=True) == obj.claim_values_serializer ) assert ( page.select_one( ".settings-item .settings-field.affected" ).get_text(strip=True) == "0" ) def test_forms(self, app, pgdb_session): resource_group = ResourceGroupFactory.build() pgdb_session.add(resource_group) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, resource_group_id=resource_group.id) ): obj = self.factory_class.build(resource_group=resource_group) pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert page.find(id="search-item-form") is not None assert page.select_one(".add-item-button") is not None assert ( page.find(id="new-item-form").attrs.get("action") == "test_url_for_create" ) assert page.select_one(".ui.input.popup-value #friendly") is not None assert ( page.select_one(".ui.input.popup-value #external_id") is not None ) assert ( page.select_one(".ui.input.popup-value #claim_values_serializer") is not None ) assert ( page.select_one(".ui.input.popup-value #claim_values_source") is not None ) assert page.select_one(".ui.input.popup-value #parent") is not None assert page.select_one(".ui.input.popup-value #optional") is not None assert ( page.select_one("#new-item-button").get_text(strip=True) == "Apply" ) assert page.find(id="update-item-form").attrs.get("action") == "#" assert page.find(id="csrf_token") is not None assert ( page.select_one(".master-header input[name=friendly]") is not None ) assert ( page.select_one(".master-header button[type=submit]").get_text( strip=True ) == "Search" ) assert ( page.select(".settings-item .item-input input[name=friendly]") is not None ) assert ( page.select(".settings-item .item-input input[name=external_id]") is not None ) assert ( page.select( ".settings-item .item-input " "select[name=claim_values_serializer]" ) is not None ) assert ( page.select_one(".settings-item .settings-is-active input") is not None ) assert ( page.select_one(".settings-item").attrs.get("data-action-url") == f"test_url_for_update_{obj.id}" ) def test_sidebar(self, app, pgdb_session): resource_group = ResourceGroupFactory.build() pgdb_session.add(resource_group) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, resource_group_id=resource_group.id) ): obj = self.factory_class.build(resource_group=resource_group) pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert self.title in page.select_one(".left-menu").get_text(strip=True) assert obj.friendly in page.select_one(".left-menu").get_text( strip=True ) assert self.url_for_this( app, endpoint=f"{self.ENDPOINT}", resource_group_id=resource_group.id, _external=False, ) in [el.attrs.get("href") for el in page.select(".left-menu .item")] def test_frontend_libs_are_added(self, app, pgdb_session): resource_group = ResourceGroupFactory.build() pgdb_session.add(resource_group) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, resource_group_id=resource_group.id) ): page = self.render_soup(**self.get_context()) assert all(helpers.added_frontend_libs(page)) assert ( page.find("script", attrs={"src": "/static/js/admin-settings.js"}) is not None ) def get_context(self): ordering = QueryOrdering( self.model.query, [ self.model.friendly, self.model.path, self.model.external_id, self.model.claim_values_serializer, ], ) pagination = QueryPagination(query=ordering.query) context = { "objects": pagination.items, "ordering": ordering, "pagination": pagination, "title": self.title, "form": self.form_class(), "resource_groups": ResourceGroup.query.active(), "holder": None, "affected_count": {}, "url_for_create": lambda **kwargs: "test_url_for_create", "url_for_update": lambda **kwargs: f"test_url_for_update_{kwargs.get('id')}", # noqa } return context class TestClaimValues(UrlForThisMixin, RenderSOUPMixin): FAKE_HOST = "atlas_um.test" CORE_IMAGES_HOST = "core-images.test" ENDPOINT = "admin_settings.claim_values" TEMPLATE = "admin_settings/claim_values_list.html" model = ClaimValue form_class = ClaimValueForm factory_class = ClaimValueFactory title = "Claim Values" @pytest.fixture def app_config(self): def inner(app): app.config["SERVER_NAME"] = self.FAKE_HOST app.config["CORE_IMAGES_HOST"] = self.CORE_IMAGES_HOST return inner def test_title(self, app, pgdb_session): claim_name = ClaimNameFactory.build() pgdb_session.add(claim_name) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, claim_name_id=claim_name.id) ): page = self.render_soup(**self.get_context()) expected_title = f"Admin settings: {self.title}" assert page.title.get_text(strip=True) == expected_title assert ( page.find(id="subnav-header") .find(string=True, recursive=False) .strip() == "Admin settings" ) assert ( page.select_one(".ui.main.container.content h4").get_text( strip=True ) == self.title ) def test_fields_no_image(self, app, pgdb_session): claim_name = ClaimNameFactory.build() pgdb_session.add(claim_name) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, claim_name_id=claim_name.id) ): obj = self.factory_class.build(claim_name=claim_name) pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert ( page.select_one( ".settings-item .settings-field.friendly .item-repr" ).get_text(strip=True) == obj.friendly ) assert ( page.select_one( ".settings-item .settings-field.external_id" ).get_text(strip=True) == obj.external_id ) assert page.select_one( ".settings-item .settings-field.components .item-repr" ).get_text(strip=True) == _dumps(obj.components) assert ( page.select_one( ".settings-item .settings-field.affected" ).get_text(strip=True) == "0" ) assert page.select_one(".settings-item .settings-field.image") is None def test_fields_with_image(self, app, pgdb_session): claim_name = ClaimNameFactory.build(images_url="test") pgdb_session.add(claim_name) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, claim_name_id=claim_name.id) ): obj = self.factory_class.build(claim_name=claim_name) pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context(holder=claim_name)) assert ( page.select_one( ".settings-item .settings-field.friendly .item-repr" ).get_text(strip=True) == obj.friendly ) assert ( page.select_one( ".settings-item .settings-field.external_id" ).get_text(strip=True) == obj.external_id ) assert page.select_one( ".settings-item .settings-field.components .item-repr" ).get_text(strip=True) == _dumps(obj.components) assert ( page.select_one( ".settings-item .settings-field.affected" ).get_text(strip=True) == "0" ) assert ( page.select_one( ".settings-item .settings-field.image img" ).attrs.get("src") == claim_name.claim_values[0].image ) def test_fields_with_parents(self, app, pgdb_session): parent_claim_name = ClaimNameFactory.build() claim_name = ClaimNameFactory.build( images_url="test", parent=parent_claim_name ) pgdb_session.add(parent_claim_name) pgdb_session.add(claim_name) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, claim_name_id=claim_name.id) ): parent_claim_value = ClaimValueFactory.build( claim_name=parent_claim_name ) pgdb_session.add(parent_claim_value) obj = self.factory_class.build( claim_name=claim_name, parent=parent_claim_value ) pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup( **self.get_context( holder=claim_name, parents=[parent_claim_value], query=self.model.query.filter_by( claim_name_id=claim_name.id ), ) ) assert ( page.select_one( ".settings-item .settings-field.friendly .item-repr" ).get_text(strip=True) == obj.friendly ) assert ( page.select_one( ".settings-item .settings-field.external_id" ).get_text(strip=True) == obj.external_id ) assert page.select_one( ".settings-item .settings-field.components .item-repr" ).get_text(strip=True) == _dumps(obj.components) assert ( page.select_one( ".settings-item .settings-field.affected" ).get_text(strip=True) == "0" ) assert ( page.select_one( ".settings-item .settings-field.image img" ).attrs.get("src") == claim_name.claim_values[0].image ) assert ( page.select_one( ".settings-item .settings-field.parent .item-repr" ).get_text(strip=True) == parent_claim_value.friendly ) assert ( page.select_one(".parents-select").get_text(strip=True) == f"All {parent_claim_name.friendly}{parent_claim_value.friendly}" ) def test_forms(self, app, pgdb_session): claim_name = ClaimNameFactory.build() pgdb_session.add(claim_name) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, claim_name_id=claim_name.id) ): obj = self.factory_class.build(claim_name=claim_name) pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert page.find(id="search-item-form") is not None assert page.select_one(".add-item-button") is not None assert ( page.find(id="new-item-form").attrs.get("action") == "test_url_for_create" ) assert page.select_one(".ui.input.popup-value #friendly") is not None assert ( page.select_one(".ui.input.popup-value #external_id") is not None ) assert page.select_one(".ui.input.popup-value #components") is not None assert page.select_one(".ui.input.popup-value #parent") is None assert ( page.select_one("#new-item-button").get_text(strip=True) == "Apply" ) assert page.find(id="update-item-form").attrs.get("action") == "#" assert page.find(id="csrf_token") is not None assert ( page.select_one(".master-header input[name=friendly]") is not None ) assert ( page.select_one(".master-header button[type=submit]").get_text( strip=True ) == "Search" ) assert ( page.select(".settings-item .item-input input[name=friendly]") is not None ) assert ( page.select(".settings-item .item-input input[name=external_id]") is not None ) assert ( page.select(".settings-item .item-input input[name=components]") is not None ) assert ( page.select_one(".settings-item .settings-is-active input") is not None ) assert ( page.select_one(".settings-item").attrs.get("data-action-url") == f"test_url_for_update_{obj.id}" ) def test_forms_with_parent(self, app, pgdb_session): parent_claim_name = ClaimNameFactory.build() claim_name = ClaimNameFactory.build(parent=parent_claim_name) pgdb_session.add(parent_claim_name) pgdb_session.add(claim_name) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, claim_name_id=claim_name.id) ): obj = self.factory_class.build(claim_name=claim_name) pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context(holder=claim_name)) assert page.find(id="search-item-form") is not None assert page.select_one(".add-item-button") is not None assert ( page.find(id="new-item-form").attrs.get("action") == "test_url_for_create" ) assert page.select_one(".ui.input.popup-value #friendly") is not None assert ( page.select_one(".ui.input.popup-value #external_id") is not None ) assert page.select_one(".ui.input.popup-value #components") is not None assert page.select_one(".ui.input.popup-value #parent") is not None assert ( page.select_one("#new-item-button").get_text(strip=True) == "Apply" ) assert page.find(id="update-item-form").attrs.get("action") == "#" assert page.find(id="csrf_token") is not None assert ( page.select_one(".master-header input[name=friendly]") is not None ) assert ( page.select_one(".master-header button[type=submit]").get_text( strip=True ) == "Search" ) assert ( page.select(".settings-item .item-input input[name=friendly]") is not None ) assert ( page.select(".settings-item .item-input input[name=external_id]") is not None ) assert ( page.select(".settings-item .item-input input[name=components]") is not None ) assert ( page.select_one(".settings-item .settings-is-active input") is not None ) assert ( page.select_one(".settings-item").attrs.get("data-action-url") == f"test_url_for_update_{obj.id}" ) def test_frontend_libs_are_added(self, app, pgdb_session): claim_name = ClaimNameFactory.build() pgdb_session.add(claim_name) pgdb_session.commit() with app.test_request_context( self.url_for_this(app, claim_name_id=claim_name.id) ): page = self.render_soup(**self.get_context()) assert all(helpers.added_frontend_libs(page)) assert ( page.find("script", attrs={"src": "/static/js/admin-settings.js"}) is not None ) def get_context(self, **kwargs): query = kwargs.pop("query", None) ordering = QueryOrdering( query or self.model.query, [self.model.friendly, self.model.external_id], ) pagination = QueryPagination(query=ordering.query) context = { "objects": pagination.items, "ordering": ordering, "title": self.title, "form": self.form_class(), "pagination": pagination, "resource_groups": ResourceGroup.query.active(), "holder": kwargs.pop("holder", None), "affected_count": {}, "url_for_create": lambda **kwargs: "test_url_for_create", "url_for_update": lambda **kwargs: f"test_url_for_update_{kwargs.get('id')}", # noqa **kwargs, } return context class TestInternalUserDomains(UrlForThisMixin, RenderSOUPMixin): ENDPOINT = "admin_settings.internal_domains" TEMPLATE = "admin_settings/internal_user_domains_list.html" model = InternalUserDomain form_class = InternalUserDomainForm factory_class = InternalUserDomainFactory title = "Internal User Domains" def get_context(self): ordering = QueryOrdering( self.model.query, [self.model.domain], ) pagination = QueryPagination(query=ordering.query) context = { "objects": pagination.items, "ordering": ordering, "pagination": pagination, "title": self.title, "form": self.form_class(), "url_for_create": lambda **kwargs: "test_url_for_create", "url_for_update": lambda **kwargs: f"test_url_for_update_{kwargs.get('id')}", # noqa } return context def test_title(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): page = self.render_soup(**self.get_context()) expected_title = f"Admin settings: {self.title}" assert page.title.get_text(strip=True) == expected_title assert ( page.find(id="subnav-header") .find(string=True, recursive=False) .strip() == "Admin settings" ) assert ( page.select_one(".ui.main.container.content h4").get_text( strip=True ) == self.title ) def test_fields(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): obj = self.factory_class.build() pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert ( page.select_one(".settings-item .settings-field.domain").get_text( strip=True ) == obj.domain ) def test_sidebar(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): page = self.render_soup(**self.get_context()) assert self.title in page.select_one(".left-menu").get_text(strip=True) assert self.url_for_this( app, endpoint=f"{self.ENDPOINT}", _external=False ) in [el.attrs.get("href") for el in page.select(".left-menu .item")] def test_frontend_libs_are_added(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): page = self.render_soup(**self.get_context()) assert all(helpers.added_frontend_libs(page)) assert ( page.find("script", attrs={"src": "/static/js/admin-settings.js"}) is not None ) def test_forms(self, app, pgdb_session): with app.test_request_context(self.url_for_this(app)): obj = self.factory_class.build() pgdb_session.add(obj) pgdb_session.commit() page = self.render_soup(**self.get_context()) assert page.find(id="search-item-form") is not None