from bs4 import BeautifulSoup from flask import render_template, url_for from atlas_um.dna_accounts.forms import DNAAccountForm from atlas_um.pgdb import DNAAccountStatuses, DNAAccount from tests.atlas_um.factories import DNAAccountFactory from . import helpers class TestEditDNAAccount: def test_title(self, app, pgdb_session): account = DNAAccountFactory.build() pgdb_session.add(account) pgdb_session.commit() with app.test_request_context(self.url_for_this(app, account)): account = DNAAccount.query.get(account.id) form = DNAAccountForm(obj=account) page = self.render_soup( account=account, form=form, statuses=DNAAccountStatuses ) expected_title = f"{account.given_name} {account.family_name}" assert page.title.get_text(strip=True) == expected_title assert ( page.find(id="subnav-header") .find(string=True, recursive=False) .strip() == expected_title ) def test_usm_account_readonly_fields(self, app, pgdb_session): account = DNAAccountFactory.build() pgdb_session.add(account) pgdb_session.commit() with app.test_request_context(self.url_for_this(app, account)): account = DNAAccount.query.get(account.id) form = DNAAccountForm(obj=account) page = self.render_soup( account=account, form=form, statuses=DNAAccountStatuses ) assert ( page.find("div", id="given_name").get_text(strip=True) == account.given_name ) assert ( page.find("div", id="family_name").get_text(strip=True) == account.family_name ) assert ( page.find("div", id="email").get_text(strip=True) == account.email ) assert page.find("div", id="sub").get_text(strip=True) == account.sub assert page.find("input", id="given_name") is None assert page.find("input", id="family_name") is None assert page.find("input", id="email") is None def test_usm_account_editable_fields(self, app, pgdb_session): account = DNAAccountFactory.build(usm_account=None) pgdb_session.add(account) pgdb_session.commit() with app.test_request_context(self.url_for_this(app, account)): account = DNAAccount.query.get(account.id) form = DNAAccountForm(obj=account) page = self.render_soup( account=account, form=form, statuses=DNAAccountStatuses ) assert page.find("div", id="given_name") is None assert page.find("div", id="family_name") is None assert page.find("div", id="email") is None assert ( page.find("input", id="given_name").attrs.get("value") == account.given_name ) assert ( page.find("input", id="family_name").attrs.get("value") == account.family_name ) assert ( page.find("input", id="email").attrs.get("value") == account.email ) def test_frontend_libs_are_added(self, app, pgdb_session): account = DNAAccountFactory.build() pgdb_session.add(account) pgdb_session.commit() with app.test_request_context(self.url_for_this(app, account)): account = DNAAccount.query.get(account.id) form = DNAAccountForm(obj=account) page = self.render_soup( account=account, form=form, statuses=DNAAccountStatuses ) assert all(helpers.added_frontend_libs(page)) def test_suspend_button_for_active_account(self, app, faker, pgdb_session): account = DNAAccountFactory.build(expiration_date=faker.future_date()) pgdb_session.add(account) pgdb_session.commit() with app.test_request_context(self.url_for_this(app, account)): account = DNAAccount.query.get(account.id) form = DNAAccountForm(obj=account) page = self.render_soup( account=account, form=form, statuses=DNAAccountStatuses ) suspend = DNAAccountForm.Actions.SUSPEND assert ( page.select_one( f"button[type=submit][name=action][value={suspend.name}]" ).get_text(strip=True) == suspend.value ) def test_no_suspend_button_for_suspended_account( self, app, faker, pgdb_session ): account = DNAAccountFactory.build(expiration_date=faker.past_date()) pgdb_session.add(account) pgdb_session.commit() with app.test_request_context(self.url_for_this(app, account)): account = DNAAccount.query.get(account.id) form = DNAAccountForm(obj=account) page = self.render_soup( account=account, form=form, statuses=DNAAccountStatuses ) suspend = DNAAccountForm.Actions.SUSPEND assert ( page.select_one( f"button[type=submit][name=action][value={suspend.name}]" ) is None ) # Helpers def url_for_this(self, app, account, **kwargs): kwargs["endpoint"] = "dna_accounts.edit" kwargs["account_id"] = account.id with app.app_context(): u = url_for(**kwargs) return u def render_soup(self, *args, **kwargs): rt = render_template( "dna_accounts/edit_dna_account.html", *args, **kwargs ) return BeautifulSoup(rt, "html.parser")