2026-03-02 13:04:08 +08:00
import pytest
from playwright . sync_api import expect
from test . playwright . helpers . auth_selectors import EMAIL_INPUT , SUBMIT_BUTTON
from test . playwright . helpers . flow_steps import flow_params , require
2026-07-03 12:53:39 +08:00
def step_01_open_login ( flow_page , flow_state , login_url , active_auth_context , step , snap , auth_click ) :
2026-03-02 13:04:08 +08:00
page = flow_page
with step ( " open login page " ) :
page . goto ( login_url , wait_until = " domcontentloaded " )
flow_state [ " login_opened " ] = True
snap ( " open " )
2026-07-03 12:53:39 +08:00
def step_02_submit_empty ( flow_page , flow_state , login_url , active_auth_context , step , snap , auth_click ) :
2026-03-02 13:04:08 +08:00
require ( flow_state , " login_opened " )
form , _ = active_auth_context ( )
expect ( form . locator ( EMAIL_INPUT ) ) . to_have_count ( 1 )
with step ( " submit empty login form " ) :
submit_button = form . locator ( SUBMIT_BUTTON )
expect ( submit_button ) . to_have_count ( 1 )
auth_click ( submit_button , " submit_validation " )
flow_state [ " submitted_empty " ] = True
snap ( " submitted_empty " )
2026-07-03 12:53:39 +08:00
def step_03_assert_validation ( flow_page , flow_state , login_url , active_auth_context , step , snap , auth_click ) :
2026-03-02 13:04:08 +08:00
require ( flow_state , " login_opened " , " submitted_empty " )
form , _ = active_auth_context ( )
invalid_inputs = form . locator ( " input[aria-invalid= ' true ' ] " )
error_messages = form . locator ( " p[id$= ' -form-item-message ' ] " )
try :
expect ( invalid_inputs ) . not_to_have_count ( 0 , timeout = 2000 )
snap ( " validation_visible " )
return
except AssertionError :
pass
try :
expect ( error_messages ) . not_to_have_count ( 0 , timeout = 1000 )
snap ( " validation_visible " )
return
except AssertionError :
pass
2026-07-03 12:53:39 +08:00
raise AssertionError ( " No validation feedback detected after submitting an empty login form. Expected aria-invalid inputs or visible error containers. See artifacts for DOM evidence. " )
2026-03-02 13:04:08 +08:00
STEPS = [
( " 01_open_login " , step_01_open_login ) ,
( " 02_submit_empty " , step_02_submit_empty ) ,
( " 03_assert_validation " , step_03_assert_validation ) ,
]
@pytest.mark.p1
@pytest.mark.auth
@pytest.mark.parametrize ( " step_fn " , flow_params ( STEPS ) )
2026-07-03 12:53:39 +08:00
def test_validation_presence_flow ( step_fn , flow_page , flow_state , login_url , active_auth_context , step , snap , auth_click ) :
2026-03-02 13:04:08 +08:00
step_fn ( flow_page , flow_state , login_url , active_auth_context , step , snap , auth_click )