2024-01-04 11:11:37 +08:00
import pytest
2023-02-22 23:32:48 +08:00
from nonebot . adapters import MessageTemplate
2023-06-19 17:48:59 +08:00
from utils import FakeMessage , FakeMessageSegment , escape_text
2022-01-29 23:39:13 +08:00
2022-02-06 18:55:19 +08:00
def test_template_basis ( ) :
template = MessageTemplate ( " {key:.3%} " )
formatted = template . format ( key = 0.123456789 )
assert formatted == " 12.346 % "
def test_template_message ( ) :
2023-06-19 17:48:59 +08:00
template = FakeMessage . template ( " { a:custom} { b:text} { c:image}/ {d} " )
2022-01-29 23:39:13 +08:00
@template.add_format_spec
def custom ( input : str ) - > str :
2022-08-22 14:39:00 +08:00
return f " { input } -custom! "
2022-01-29 23:39:13 +08:00
2024-01-04 11:11:37 +08:00
with pytest . raises ( ValueError , match = " already exists " ) :
2022-02-06 18:55:19 +08:00
template . add_format_spec ( custom )
2022-08-22 14:39:00 +08:00
format_args = {
" a " : " custom " ,
" b " : " text " ,
" c " : " https://example.com/test " ,
" d " : 114 ,
}
2022-02-06 18:55:19 +08:00
formatted = template . format ( * * format_args )
assert template . format_map ( format_args ) == formatted
2022-08-22 14:39:00 +08:00
assert formatted . extract_plain_text ( ) == " custom-custom!text/114 "
assert str ( formatted ) == " custom-custom!text[fake:image]/114 "
2022-02-10 13:15:59 +08:00
2022-04-30 09:59:23 +08:00
def test_rich_template_message ( ) :
pic1 , pic2 , pic3 = (
2023-06-19 17:48:59 +08:00
FakeMessageSegment . image ( " file:///pic1.jpg " ) ,
FakeMessageSegment . image ( " file:///pic2.jpg " ) ,
FakeMessageSegment . image ( " file:///pic3.jpg " ) ,
2022-04-30 09:59:23 +08:00
)
2023-06-19 17:48:59 +08:00
template = FakeMessage . template ( " {} {} " + pic2 + " {} " )
2022-04-30 09:59:23 +08:00
result = template . format ( pic1 , " [fake:image] " , pic3 )
2023-06-19 17:48:59 +08:00
assert result [ " image " ] == FakeMessage ( [ pic1 , pic2 , pic3 ] )
2022-04-30 09:59:23 +08:00
assert str ( result ) == (
" [fake:image] " + escape_text ( " [fake:image] " ) + " [fake:image] " + " [fake:image] "
)
2022-02-10 13:15:59 +08:00
def test_message_injection ( ) :
2023-06-19 17:48:59 +08:00
template = FakeMessage . template ( " {name} Is Bad " )
2022-02-10 13:15:59 +08:00
message = template . format ( name = " [fake:image] " )
assert message . extract_plain_text ( ) == escape_text ( " [fake:image]Is Bad " )
2024-01-04 11:11:37 +08:00
def test_malformed_template ( ) :
positive_template = FakeMessage . template ( " {a} {b} " )
message = positive_template . format ( a = " a " , b = " b " )
assert message . extract_plain_text ( ) == " ab "
malformed_template = FakeMessage . template ( " {a.__init__} " )
with pytest . raises ( ValueError , match = " private attribute " ) :
message = malformed_template . format ( a = " a " )
malformed_template = FakeMessage . template ( " {a[__builtins__]} " )
with pytest . raises ( ValueError , match = " private attribute " ) :
message = malformed_template . format ( a = globals ( ) )
malformed_template = MessageTemplate (
" {a[__builtins__][__import__]} {b.__init__} " , private_getattr = True
)
message = malformed_template . format ( a = globals ( ) , b = " b " )