Test Results (5 tests)
⏱️ Duration: 32.37s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f43b862b190>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f43b862a050>
billing_page = <pages.billing_page.BillingPage object at 0x7f43b86294e0>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod
def test_bi03_downgrade_plan_via_change_plan_button(
sign_up_page, pricing_page, billing_page, base_url
):
"""
Bi03 User can downgrade his plan using Change plan button.
Standard Annual user opens Billing, clicks Change Plan, selects Basic
Monthly from the embedded widget, closes the confirmation, and ends up
with a pending downgrade (still on Standard until period end).
"""
email = f"promo.auto.bi03.{uuid.uuid4().hex[:8]}@promo.com"
> _signup_and_purchase_plan(
sign_up_page, pricing_page, base_url, email,
PricingPage.STANDARD_ANNUAL_CTA, monthly=False,
)
tests/billing/test_billing.py:106:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/billing/test_billing.py:57: in _signup_and_purchase_plan
pricing_page.go_to_pricing_via_header()
pages/pricing_page.py:98: in go_to_pricing_via_header
profile_menu.wait_for(state="visible", timeout=self.T_LOAD)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._impl._connection.Connection object at 0x7f43b9606920>
cb = <function Channel.send.<locals>.<lam
📸 Failure Screenshot:
⏱️ Duration: 86.95s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f43b3b87b20>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f43b3bf6c80>
billing_page = <pages.billing_page.BillingPage object at 0x7f43b3bf6740>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod
def test_bi04_update_payment_method_and_email(
sign_up_page, pricing_page, billing_page, base_url
):
"""
Bi04 User can update his payment method and email address.
Pro Annual user opens Billing, updates the card to a different valid
test card, updates the billing email, and both changes are reflected.
"""
email = f"promo.auto.bi04.{uuid.uuid4().hex[:8]}@promo.com"
_signup_and_purchase_plan(
sign_up_page, pricing_page, base_url, email,
PricingPage.PRO_ANNUAL_CTA, monthly=False,
)
billing_page.go_to_billing_url(base_url)
billing_page.assert_on_billing_page()
billing_page.click_update_payment_method()
> billing_page.complete_new_card_checkout()
tests/billing/test_billing.py:144:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/billing_page.py:257: in complete_new_card_checkout
self.page.wait_for_url(re.compile(r"promo\.com"), timeout=self.T_NETWORK)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:10029: in wait_for_url
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_page.py:588: in wait_for_url
return await self._main_frame.wait_for_url(**locals_to_params(locals()))
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:288: in wait_for_url
async with self.expect_navigation(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_event_context_manager.py:33: in __aexit__
await self._future
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
async def continuation() -> Optional[Response]:
>
📸 Failure Screenshot:
⏱️ Duration: 59.20s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f43b86a06d0>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f43b180dd50>
billing_page = <pages.billing_page.BillingPage object at 0x7f43b180dd80>
login_page = <pages.login_page.LoginPage object at 0x7f43b1adc0d0>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod_skip_smoke
def test_bi07_basic_annual_upgrades_via_upgrade_page(
sign_up_page, pricing_page, billing_page, login_page, base_url
):
"""
Bi07 Basic annual user upgrades plan to standard via the upgrade page.
Covers the signed-out edge case: the upgrade page is reachable while
logged out, attempting to upgrade surfaces an inline login form, and
completing login finishes the upgrade.
Scope note: the source scenario also asserts the Monthly/Annual toggle
is hidden on this page (both signed out and signed back in). Verified
empirically (2026-09-13) that the toggle IS visible for a signed-out
visitor on the current product — that assertion no longer reflects
real behavior (the source itself flagged this exact step as
"to_improve... please review" even at the time it was written), so it
was dropped rather than encoding a false expectation.
"""
email = f"promo.auto.bi07.{uuid.uuid4().hex[:8]}@promo.com"
_signup_and_purchase_plan(
sign_up_page, pricing_page, base_url, email,
PricingPage.BASIC_ANNUAL_CTA, monthly=False,
)
> login_page.sign_out()
tests/billing/test_billing.py:231:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/login_page.py:179: in sign_out
self.page.locator(self.USERNAME_MENU).hover()
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:19385: in hover
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:482: in hover
retu
📸 Failure Screenshot: