from unittest.mock import ANY import pytest from flask import Blueprint from atlas_um.admin_settings.base import AdminSettingsBaseView from atlas_um.helpers.ordering import QueryOrdering from atlas_um.helpers.pagination import QueryPagination from atlas_um.pgdb import ResourceGroup, ClaimName class TestAdminSettingsBaseView: @pytest.fixture def test_class(self, mocker): class TestClass(AdminSettingsBaseView): template = "test_template.html" title = "Test title" model = mocker.MagicMock() affected_by_field = "test_field" service_class = mocker.MagicMock() form_class = mocker.MagicMock() url_prefix = "test_url_prefix" filter_args = "" ordering_fields = [mocker.MagicMock()] @classmethod def as_view(cls, *args, **kwargs): return args, kwargs return TestClass def test_register(self, test_class, mocker): test_blueprint = Blueprint("test_blueprint", __name__) mocker.spy(test_blueprint, "add_url_rule") test_class.register("test_root_prefix", test_blueprint) base_url = ( f"test_root_prefix/{test_class.url_prefix}/" f"{test_class.filter_args}" ) assert test_blueprint.add_url_rule.call_args_list == [ mocker.call( base_url, view_func=test_class.as_view(test_class.url_prefix) ), mocker.call( f"{base_url}/", view_func=test_class.as_view( f"{test_class.url_prefix}_update" ), ), ] def test_get(self, app, test_class, mocker, faker): mocker.patch( "atlas_um.pgdb.queries.resource_group.ResourceGroupQuery.active" ) mocker.patch( "atlas_um.pgdb.queries.claim_name.ClaimNameQuery.filter_global" ) mocked_render = mocker.patch( "atlas_um.admin_settings.base.render_template" ) mocked_affected_count = mocker.patch( "atlas_um.pgdb.queries.dna_account.DNAAccountQuery.affected_by_count" # noqa ) view = test_class() with app.test_request_context(): expected_objects = test_class.model.query.filter_by() expected_objects.count.return_value = faker.pyint() expected_form = test_class.form_class() expected_resource_groups = ResourceGroup.query.active().order_by() expected_global_claim_names = ( ClaimName.query.filter_global().active().order_by() ) expected_ordering = QueryOrdering( test_class.model.query.filter_by(), test_class.ordering_fields ) expected_pagination = QueryPagination( query=expected_ordering.query ) test_id = faker.pyint() test_count = faker.pyint() mocked_affected_count.return_value = [(test_id, test_count)] view.get() assert mocked_render.call_args_list == [ mocker.call( test_class.template, objects=expected_pagination.items, ordering=expected_ordering, pagination=expected_pagination, title=test_class.title, form=expected_form, resource_groups=expected_resource_groups, holder=None, global_claim_names=expected_global_claim_names, affected_count={test_id: test_count}, parents=None, parent_id=None, url_for_create=ANY, url_for_update=ANY, item_search_term="", ) ] def test_post_valid_data_add_item(self, app, test_class, mocker): view = test_class() mocked_flash = mocker.patch("atlas_um.admin_settings.base.flash") view.form_class.return_value.validate_on_submit.return_value = True with app.test_request_context(): view.post() assert test_class.service_class.execute.called assert test_class.service_class.execute.call_args_list == [ mocker.call(None) ] assert mocked_flash.call_args_list == [ mocker.call(test_class.success_message, "positive") ] def test_post_valid_data_update_item(self, app, test_class, mocker, faker): view = test_class() view.form_class.return_value.validate_on_submit.return_value = True mocked_flash = mocker.patch("atlas_um.admin_settings.base.flash") view.get_object = mocker.MagicMock() view.get_form = mocker.MagicMock() expected_data = {"test_field": "test_value"} view.get_form.return_value.data = expected_data with app.test_request_context(): view.post(id=faker.pyint()) assert test_class.service_class.execute.called assert test_class.service_class.execute.call_args_list == [ mocker.call(view.get_object.return_value, **expected_data) ] assert mocked_flash.call_args_list == [ mocker.call(test_class.success_message, "positive") ] def test_post_invalid_data_add_item(self, app, test_class, mocker): view = test_class() mocked_flash = mocker.patch("atlas_um.admin_settings.base.flash") view.form_class.return_value.validate_on_submit.return_value = False with app.test_request_context(): view.post() assert not test_class.service_class.execute.called assert mocked_flash.call_args_list == [mocker.call("", "negative")] def test_post_invalid_data_update_item( self, app, test_class, mocker, faker ): view = test_class() mocked_flash = mocker.patch("atlas_um.admin_settings.base.flash") view.get_object = mocker.MagicMock() view.get_form = mocker.MagicMock() view.get_form.return_value.validate_on_submit.return_value = False view.get_form.return_value.errors = {"test_field": ["test message"]} with app.test_request_context(): view.post(id=faker.pyint()) assert not test_class.service_class.execute.called assert mocked_flash.call_args_list == [ mocker.call("test message", "negative") ]