from urllib.parse import urlparse from bs4 import BeautifulSoup from flask import render_template, url_for from atlas_um.pgdb import DNAAccountStatuses, DNAAccount from tests.atlas_um.factories import DNAAccountFactory from . import helpers class TestShowDNAAccount: def test_title(self, app, pgdb_session, faker): given_name = faker.first_name() family_name = faker.last_name() account = DNAAccountFactory.build( given_name=given_name, family_name=family_name, ) pgdb_session.add(account) pgdb_session.commit() with app.test_request_context(self.url_for_this(app, account)): account = DNAAccount.query.get(account.id) page = self.render_soup( account=account, DNAAccountStatuses=DNAAccountStatuses ) assert page.title.get_text(strip=True) == f"{given_name} {family_name}" page_head = page.find(id="subnav-header") vip_text = "VIP" if account.is_vip else "" assert ( page_head.get_text(strip=True) == f"{given_name} {family_name}{vip_text}{account.status}EXTERNAL" ) def test_detail_fields_sony_employee(self, app, faker, pgdb_session): account = DNAAccountFactory.build(is_sony_employee=True) pgdb_session.add(account) pgdb_session.commit() with app.test_request_context(self.url_for_this(app, account)): account = DNAAccount.query.get(account.id) page = self.render_soup( account=account, DNAAccountStatuses=DNAAccountStatuses ) for value, selector in ( (account.given_name, "account-detail-given-name"), (account.family_name, "account-detail-family-name"), (account.email, "account-detail-email"), (account.job_title, "account-detail-job-title"), (account.personnel_type.name, "account-detail-personnel-type"), (account.business_unit.name, "account-detail-business-unit"), ( account.expiration_date.strftime("%m/%d/%y"), "account-detail-expiration-date", ), (account.location, "account-detail-location"), (account.preferred_username, "account-detail-sony-username"), (account.supervisor_name, "account-detail-supervisor-name"), (account.supervisor_email, "account-detail-supervisor-email"), ( account.created_at.strftime("%m/%d/%y, %-I:%M %p"), "account-detail-created", ), ( account.updated_at.strftime("%m/%d/%y, %-I:%M %p"), "account-detail-last-modified", ), (account.sub, "account-detail-sub"), ): element = page.find(id=selector) assert ( element is not None and element.get_text(strip=True) == value ), f"Error with field: {selector}" def test_detail_fields_non_sony_employee(self, app, faker, 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) page = self.render_soup( account=account, DNAAccountStatuses=DNAAccountStatuses ) for value, selector in ( (account.given_name, "account-detail-given-name"), (account.family_name, "account-detail-family-name"), (account.email, "account-detail-email"), # (account.job_title, "account-detail-job-title"), ( account.created_at.strftime("%m/%d/%y, %-I:%M %p"), "account-detail-created", ), ( account.updated_at.strftime("%m/%d/%y, %-I:%M %p"), "account-detail-last-modified", ), (account.sub, "account-detail-sub"), ): element = page.find(id=selector) assert ( element is not None and element.get_text(strip=True) == value ), f"Error with field: {selector}" def test_copyright_notice( self, app, pgdb_session, expected_copyright_notice ): 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) page = self.render_soup( account=account, DNAAccountStatuses=DNAAccountStatuses ) footer = page.find("footer") copyright_notice = footer.find(id="copyright-notice") assert ( copyright_notice.get_text(strip=True) == expected_copyright_notice ) def test_frontend_libs_are_added( self, app, faker, pgdb_session, expected_copyright_notice ): 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) page = self.render_soup( account=account, DNAAccountStatuses=DNAAccountStatuses ) assert all(helpers.added_frontend_libs(page)) def test_elements_for_active_account(self, app, pgdb_session, faker): 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) page = self.render_soup( account=account, DNAAccountStatuses=DNAAccountStatuses ) assert page.select_one("#edit-button").get_text(strip=True) == "Edit" assert ( page.select_one(".details-header-with-extra .extra").get_text( strip=True ) == "" ) def test_elements_for_invited_account(self, app, faker, pgdb_session): account = DNAAccountFactory.build( expiration_date=faker.future_date(), invitation_is_sent=False, 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) page = self.render_soup( account=account, DNAAccountStatuses=DNAAccountStatuses ) assert ( page.select_one("#send-invitation-button").get_text(strip=True) == "Send invitation" ) def test_elements_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) page = self.render_soup( account=account, DNAAccountStatuses=DNAAccountStatuses ) assert ( page.select_one("#edit-button").get_text(strip=True) == "Reactivate" ) assert ( page.select_one(".details-header-with-extra .extra").get_text( strip=True ) == f"Suspended on {account.expiration_date:%m/%d/%y}" ) # Helpers def url_for_this(self, app, account, **kwargs): kwargs["endpoint"] = "dna_accounts.show" kwargs["account_id"] = account.id with app.app_context(): u = url_for(**kwargs) return u def urlspec_for_this(self, app, **kwargs): u = urlparse(self.url_for_this(app, **kwargs)) return u._replace(scheme="", netloc="") def render_soup(self, *args, **kwargs): rt = render_template( "dna_accounts/show_dna_account.html", *args, **kwargs ) return BeautifulSoup(rt, "html.parser")