2424
2525
2626class AssertionsBase :
27- def __init__ (self , locator : Locator , is_not : bool = False ) -> None :
27+ def __init__ (
28+ self , locator : Locator , is_not : bool = False , message : Optional [str ] = None
29+ ) -> None :
2830 self ._actual_locator = locator
2931 self ._loop = locator ._loop
3032 self ._dispatcher_fiber = locator ._dispatcher_fiber
3133 self ._is_not = is_not
34+ self ._custom_message = message
3235
3336 async def _expect_impl (
3437 self ,
@@ -51,21 +54,27 @@ async def _expect_impl(
5154 log = "\n " .join (result .get ("log" , "" )).strip ()
5255 if log :
5356 log = "\n Call log:\n " + log
54- if expected is not None :
55- raise AssertionError (
56- f"{ message } '{ expected } '\n Actual value: { actual } { log } "
57+ if self ._custom_message :
58+ out_message = (
59+ f"{ self ._custom_message } \n Expected value: { expected or '<None>' } "
60+ )
61+ else :
62+ out_message = (
63+ f"{ message } '{ expected } '" if expected is not None else f"{ message } "
5764 )
58- raise AssertionError (f"{ message } \n Actual value: { actual } { log } " )
65+ raise AssertionError (f"{ out_message } \n Actual value: { actual } { log } " )
5966
6067
6168class PageAssertions (AssertionsBase ):
62- def __init__ (self , page : Page , is_not : bool = False ) -> None :
63- super ().__init__ (page .locator (":root" ), is_not )
69+ def __init__ (
70+ self , page : Page , is_not : bool = False , message : Optional [str ] = None
71+ ) -> None :
72+ super ().__init__ (page .locator (":root" ), is_not , message )
6473 self ._actual_page = page
6574
6675 @property
6776 def _not (self ) -> "PageAssertions" :
68- return PageAssertions (self ._actual_page , not self ._is_not )
77+ return PageAssertions (self ._actual_page , not self ._is_not , self . _custom_message )
6978
7079 async def to_have_title (
7180 self , title_or_reg_exp : Union [Pattern [str ], str ], timeout : float = None
@@ -110,13 +119,17 @@ async def not_to_have_url(
110119
111120
112121class LocatorAssertions (AssertionsBase ):
113- def __init__ (self , locator : Locator , is_not : bool = False ) -> None :
114- super ().__init__ (locator , is_not )
122+ def __init__ (
123+ self , locator : Locator , is_not : bool = False , message : Optional [str ] = None
124+ ) -> None :
125+ super ().__init__ (locator , is_not , message )
115126 self ._actual_locator = locator
116127
117128 @property
118129 def _not (self ) -> "LocatorAssertions" :
119- return LocatorAssertions (self ._actual_locator , not self ._is_not )
130+ return LocatorAssertions (
131+ self ._actual_locator , not self ._is_not , self ._custom_message
132+ )
120133
121134 async def to_contain_text (
122135 self ,
@@ -639,15 +652,20 @@ async def not_to_be_in_viewport(
639652
640653
641654class APIResponseAssertions :
642- def __init__ (self , response : APIResponse , is_not : bool = False ) -> None :
655+ def __init__ (
656+ self , response : APIResponse , is_not : bool = False , message : Optional [str ] = None
657+ ) -> None :
643658 self ._loop = response ._loop
644659 self ._dispatcher_fiber = response ._dispatcher_fiber
645660 self ._is_not = is_not
646661 self ._actual = response
662+ self ._custom_message = message
647663
648664 @property
649665 def _not (self ) -> "APIResponseAssertions" :
650- return APIResponseAssertions (self ._actual , not self ._is_not )
666+ return APIResponseAssertions (
667+ self ._actual , not self ._is_not , self ._custom_message
668+ )
651669
652670 async def to_be_ok (
653671 self ,
@@ -658,18 +676,19 @@ async def to_be_ok(
658676 message = f"Response status expected to be within [200..299] range, was '{ self ._actual .status } '"
659677 if self ._is_not :
660678 message = message .replace ("expected to" , "expected not to" )
679+ out_message = self ._custom_message or message
661680 log_list = await self ._actual ._fetch_log ()
662681 log = "\n " .join (log_list ).strip ()
663682 if log :
664- message += f"\n Call log:\n { log } "
683+ out_message += f"\n Call log:\n { log } "
665684
666685 content_type = self ._actual .headers .get ("content-type" )
667686 is_text_encoding = content_type and is_textual_mime_type (content_type )
668687 text = await self ._actual .text () if is_text_encoding else None
669688 if text is not None :
670- message += f"\n Response Text:\n { text [:1000 ]} "
689+ out_message += f"\n Response Text:\n { text [:1000 ]} "
671690
672- raise AssertionError (message )
691+ raise AssertionError (out_message )
673692
674693 async def not_to_be_ok (self ) -> None :
675694 __tracebackhide__ = True
0 commit comments