Test Results (6 tests)
⏱️ Duration: 69.57s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f24a51f8670>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f24a4f61d80>
billing_page = <pages.billing_page.BillingPage object at 0x7f24a4f620b0>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod
def test_bi02_upgrade_plan_via_change_plan_button(
sign_up_page, pricing_page, billing_page, base_url
):
"""
Bi02 User can upgrade his plan using Change plan button.
Basic Monthly user opens Billing, clicks Change Plan, buys Standard
Annual from the embedded pricing widget, and ends up on the Standard plan.
"""
email = f"promo.auto.bi02.{uuid.uuid4().hex[:8]}@promo.com"
_signup_and_purchase_plan(
sign_up_page, pricing_page, base_url, email,
PricingPage.BASIC_MONTHLY_CTA, monthly=True,
)
> billing_page.go_to_billing_url(base_url)
tests/billing/test_billing.py:82:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/billing_page.py:104: in go_to_billing_url
self.page.goto(f"{base_url}{self.BILLING_PATH}")
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:9875: in goto
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_page.py:560: in goto
return await self._main_frame.goto(**locals_to_params(locals()))
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:156: in goto
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 0x7f24a51f8e80>
cb = <function Channel.send.<locals>.<lambda> at 0x7f24a4106c20>
is_internal = False, title = None
async def wrap_api_call(
self, cb: Callable[[], Any], is_internal: bool =
📸 Failure Screenshot:
⏱️ Duration: 37.93s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f249e610340>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f249e6107c0>
billing_page = <pages.billing_page.BillingPage object at 0x7f249e611180>
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 0x7f24a51f8e80>
cb = <function Channel.send.<locals>.<lam
📸 Failure Screenshot:
⏱️ Duration: 30.01s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f24a41a07c0>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f24a41a2aa0>
billing_page = <pages.billing_page.BillingPage object at 0x7f24a41a18a0>
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,
)
tests/billing/test_billing.py:136:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/billing/test_billing.py:44: in _signup_and_purchase_plan
sign_up_page.create_account(
pages/sign_up_page.py:45: in create_account
self.page.goto(f"{base_url}/signup")
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:9875: in goto
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_page.py:560: in goto
return await self._main_frame.goto(**locals_to_params(locals()))
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:156: in goto
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 0x7f24a51f8e80>
cb = <function Channel.send.<locals>.<lambda> at 0x7f249e5f2b00>
is_internal = False, title = None
async def wrap_api_call(
self, cb: Callable[[], Any],
⏱️ Duration: 30.01s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f249d36f7c0>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f249d36f0d0>
billing_page = <pages.billing_page.BillingPage object at 0x7f249d36f550>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod_skip_smoke
def test_bi05_standard_user_redirected_from_upgrade_page(
sign_up_page, pricing_page, billing_page, base_url
):
"""
Bi05 Standard user tries to access upgrade page but is redirected to billing.
A Standard Monthly user (already on the plan the upgrade page sells) is
redirected straight to Billing instead of seeing the upgrade offer.
"""
email = f"promo.auto.bi05.{uuid.uuid4().hex[:8]}@promo.com"
> _signup_and_purchase_plan(
sign_up_page, pricing_page, base_url, email,
PricingPage.STANDARD_MONTHLY_CTA, monthly=True,
)
tests/billing/test_billing.py:165:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/billing/test_billing.py:44: in _signup_and_purchase_plan
sign_up_page.create_account(
pages/sign_up_page.py:45: in create_account
self.page.goto(f"{base_url}/signup")
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:9875: in goto
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_page.py:560: in goto
return await self._main_frame.goto(**locals_to_params(locals()))
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:156: in goto
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 0x7f24a51f8e80>
cb = <function Channel.send.<locals>.<lambda> at 0x7f24a4104ee0>
is_internal = False, title = None
async def wrap_
⏱️ Duration: 20.18s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f249d505d80>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f249d506cb0>
billing_page = <pages.billing_page.BillingPage object at 0x7f249d5060b0>
base_url = 'https://test03.testingpromo.com'
@pytest.mark.skip_prod_skip_smoke
def test_bi06_basic_monthly_upgrades_via_upgrade_page(
sign_up_page, pricing_page, billing_page, base_url
):
"""
Bi06 Basic monthly user upgrades plan to standard via the upgrade page.
"""
email = f"promo.auto.bi06.{uuid.uuid4().hex[:8]}@promo.com"
> _signup_and_purchase_plan(
sign_up_page, pricing_page, base_url, email,
PricingPage.BASIC_MONTHLY_CTA, monthly=True,
)
tests/billing/test_billing.py:186:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/billing/test_billing.py:44: in _signup_and_purchase_plan
sign_up_page.create_account(
pages/sign_up_page.py:46: in create_account
self.page.locator(self.FULL_NAME_INPUT).wait_for(state="visible", timeout=self.T_SLOW)
/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 0x7f24a51f8e80>
cb = <function Channel.send.<locals>.<lambda> at 0x7f24a421fd90>
is_internal = False, title = None
async def wrap_api_call(
self, cb: Callable[[], Any], is_internal: bool = False, title: str = None
) -> Any:
if self._api
📸 Failure Screenshot:
⏱️ Duration: 20.19s
❌ Error:
sign_up_page = <pages.sign_up_page.SignUpPage object at 0x7f249d55ff70>
pricing_page = <pages.pricing_page.PricingPage object at 0x7f249d55f6a0>
billing_page = <pages.billing_page.BillingPage object at 0x7f249d55fb80>
login_page = <pages.login_page.LoginPage object at 0x7f249e63cf40>
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,
)
tests/billing/test_billing.py:226:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/billing/test_billing.py:44: in _signup_and_purchase_plan
sign_up_page.create_account(
pages/sign_up_page.py:46: in create_account
self.page.locator(self.FULL_NAME_INPUT).wait_for(state="visible", timeout=self.T_SLOW)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait
📸 Failure Screenshot: