@@ -51,6 +51,11 @@ def message(bot):
5151 return Message (1 , None , None , None , bot = bot )
5252
5353
54+ @pytest .fixture (scope = 'function' )
55+ def prefixes ():
56+ return ['/' , '#' , '' , ' ' ]
57+
58+
5459class TestCommandHandler (object ):
5560 test_flag = False
5661
@@ -75,62 +80,72 @@ def callback_queue_1(self, bot, update, job_queue=None, update_queue=None):
7580 def callback_queue_2 (self , bot , update , job_queue = None , update_queue = None ):
7681 self .test_flag = (job_queue is not None ) and (update_queue is not None )
7782
78- def ch_callback_args (self , bot , update , args ):
79- if update .message .text == '/ test' :
83+ def ch_callback_args (self , bot , update , args , prefix ):
84+ if update .message .text == '{} test' . format ( prefix ) :
8085 self .test_flag = len (args ) == 0
81- elif update .message .text == '/ test@{}' .format (bot .username ):
86+ elif update .message .text == '{} test@{}' .format (prefix , bot .username ):
8287 self .test_flag = len (args ) == 0
8388 else :
8489 self .test_flag = args == ['one' , 'two' ]
8590
86- def test_basic (self , dp , message ):
87- handler = CommandHandler ('test' , self .callback_basic )
88- dp .add_handler (handler )
91+ def test_basic (self , dp , message , prefixes ):
92+ for p in prefixes :
93+ handler = CommandHandler ('test' , self .callback_basic , prefix = p )
94+ dp .add_handler (handler )
8995
90- message .text = '/ test'
91- assert handler .check_update (Update (0 , message ))
92- dp .process_update (Update (0 , message ))
93- assert self .test_flag
96+ message .text = '{} test' . format ( p )
97+ assert handler .check_update (Update (0 , message ))
98+ dp .process_update (Update (0 , message ))
99+ assert self .test_flag
94100
95- message .text = '/ nottest'
96- assert not handler .check_update (Update (0 , message ))
101+ message .text = '{} nottest' . format ( p )
102+ assert not handler .check_update (Update (0 , message ))
97103
98- message .text = 'test'
99- assert not handler .check_update (Update (0 , message ))
104+ message .text = 'test'
105+ result = handler .check_update (Update (0 , message ))
106+ if p in ['' , ' ' ]:
107+ assert result
108+ else :
109+ assert not result
100110
101- message .text = 'not / test at start'
102- assert not handler .check_update (Update (0 , message ))
111+ message .text = 'not {} test at start' . format ( p )
112+ assert not handler .check_update (Update (0 , message ))
103113
104- def test_command_list (self , message ):
105- handler = CommandHandler (['test' , 'start' ], self .callback_basic )
114+ dp .remove_handler (handler )
106115
107- message .text = '/test'
108- assert handler .check_update (Update (0 , message ))
116+ def test_command_list (self , message , prefixes ):
117+ for p in prefixes :
118+ handler = CommandHandler (['test' , 'start' ], self .callback_basic , prefix = p )
109119
110- message .text = '/start'
111- assert handler .check_update (Update (0 , message ))
120+ message .text = '{}test' . format ( p )
121+ assert handler .check_update (Update (0 , message ))
112122
113- message .text = '/stop'
114- assert not handler .check_update (Update (0 , message ))
123+ message .text = '{}start' . format ( p )
124+ assert handler .check_update (Update (0 , message ))
115125
116- def test_edited ( self , message ):
117- handler = CommandHandler ( 'test' , self . callback_basic , allow_edited = False )
126+ message . text = '{}stop' . format ( p )
127+ assert not handler . check_update ( Update ( 0 , message ) )
118128
119- message .text = '/test'
120- assert handler .check_update (Update (0 , message ))
121- assert not handler .check_update (Update (0 , edited_message = message ))
122- handler .allow_edited = True
123- assert handler .check_update (Update (0 , message ))
124- assert handler .check_update (Update (0 , edited_message = message ))
129+ def test_edited (self , message , prefixes ):
130+ for p in prefixes :
131+ handler = CommandHandler ('test' , self .callback_basic , allow_edited = False , prefix = p )
125132
126- def test_directed_commands (self , message ):
127- handler = CommandHandler ('test' , self .callback_basic )
133+ message .text = '{}test' .format (p )
134+ assert handler .check_update (Update (0 , message ))
135+ assert not handler .check_update (Update (0 , edited_message = message ))
136+ handler .allow_edited = True
137+ assert handler .check_update (Update (0 , message ))
138+ assert handler .check_update (Update (0 , edited_message = message ))
128139
129- message .text = '/test@{}' .format (message .bot .username )
130- assert handler .check_update (Update (0 , message ))
140+ def test_directed_commands (self , message , prefixes ):
141+ for p in prefixes :
142+ handler = CommandHandler ('test' , self .callback_basic , prefix = p )
131143
132- message .text = '/test@otherbot'
133- assert not handler .check_update (Update (0 , message ))
144+ message .text = '{}test@{}' .format (p , message .bot .username )
145+ assert handler .check_update (Update (0 , message ))
146+
147+ message .text = '{}test@otherbot' .format (p )
148+ assert not handler .check_update (Update (0 , message ))
134149
135150 def test_with_filter (self , message ):
136151 handler = CommandHandler ('test' , self .callback_basic , Filters .group )
@@ -142,53 +157,74 @@ def test_with_filter(self, message):
142157 message .chat = Chat (23 , 'private' )
143158 assert not handler .check_update (Update (0 , message ))
144159
145- def test_pass_args (self , dp , message ):
146- handler = CommandHandler ('test' , self .ch_callback_args , pass_args = True )
147- dp .add_handler (handler )
148-
149- message .text = '/test'
150- dp .process_update (Update (0 , message = message ))
151- assert self .test_flag
152-
153- self .test_flag = False
154- message .text = '/test@{}' .format (message .bot .username )
155- dp .process_update (Update (0 , message = message ))
156- assert self .test_flag
157-
158- self .test_flag = False
159- message .text = '/test one two'
160- dp .process_update (Update (0 , message = message ))
161- assert self .test_flag
162-
163- self .test_flag = False
164- message .text = '/test@{} one two' .format (message .bot .username )
165- dp .process_update (Update (0 , message = message ))
166- assert self .test_flag
167-
168- def test_newline (self , dp , message ):
169- handler = CommandHandler ('test' , self .callback_basic )
170- dp .add_handler (handler )
160+ def test_pass_args (self , dp , message , prefixes ):
161+ for p in prefixes :
162+ handler = CommandHandler (
163+ 'test' ,
164+ lambda bot , update , args : self .ch_callback_args (bot , update , args , p ),
165+ pass_args = True ,
166+ prefix = p
167+ )
168+ dp .add_handler (handler )
169+
170+ self .test_flag = False
171+ message .text = '{}test' .format (p )
172+ dp .process_update (Update (0 , message = message ))
173+ assert self .test_flag
174+
175+ self .test_flag = False
176+ message .text = '{}test@{}' .format (p , message .bot .username )
177+ dp .process_update (Update (0 , message = message ))
178+ assert self .test_flag
179+
180+ self .test_flag = False
181+ message .text = '{}test one two' .format (p )
182+ dp .process_update (Update (0 , message = message ))
183+ assert self .test_flag
184+
185+ self .test_flag = False
186+ message .text = '{}test@{} one two' .format (p , message .bot .username )
187+ dp .process_update (Update (0 , message = message ))
188+ assert self .test_flag
189+
190+ dp .remove_handler (handler )
191+
192+ def test_newline (self , dp , message , prefixes ):
193+ for p in prefixes :
194+ handler = CommandHandler ('test' , self .callback_basic , prefix = p )
195+ dp .add_handler (handler )
196+
197+ message .text = '{}test\n foobar' .format (p )
198+ assert handler .check_update (Update (0 , message ))
199+ dp .process_update (Update (0 , message ))
200+ assert self .test_flag
201+
202+ dp .remove_handler (handler )
203+
204+ def test_single_char (self , message ):
205+ # Regression test for
206+ # https://github.com/python-telegram-bot/python-telegram-bot/issues/871
171207
172- message .text = '/test\n foobar'
173- assert handler .check_update (Update (0 , message ))
174- dp .process_update (Update (0 , message ))
175- assert self .test_flag
208+ message .text = 'a'
176209
177- def test_single_char (self , dp , message ):
178- # Regression test for https://github.com/python-telegram-bot/python-telegram-bot/issues/871
179- handler = CommandHandler ('test' , self .callback_basic )
180- dp .add_handler (handler )
210+ normal_handler = CommandHandler ('test' , self .callback_basic )
211+ assert not normal_handler .check_update (Update (0 , message ))
181212
182- message . text = 'a'
183- assert not handler .check_update (Update (0 , message ))
213+ empty_prefix_handler = CommandHandler ( 'test' , self . callback_basic , prefix = '' )
214+ assert not empty_prefix_handler .check_update (Update (0 , message ))
184215
185- def test_single_slash (self , dp , message ):
186- # Regression test for https://github.com/python-telegram-bot/python-telegram-bot/issues/871
187- handler = CommandHandler ('test' , self .callback_basic )
188- dp .add_handler (handler )
216+ def test_single_prefix (self , dp , message , prefixes ):
217+ for p in prefixes :
218+ # Regression test for
219+ # https://github.com/python-telegram-bot/python-telegram-bot/issues/871
220+ handler = CommandHandler ('test' , self .callback_basic , prefix = p )
221+ dp .add_handler (handler )
189222
190- message .text = '/'
191- assert not handler .check_update (Update (0 , message ))
223+ # Note: In praxis, it is not possible to send empty messages.
224+ # We will test this case nonetheless
225+ message .text = p
226+ assert not handler .check_update (Update (0 , message ))
227+ dp .remove_handler (handler )
192228
193229 def test_pass_user_or_chat_data (self , dp , message ):
194230 handler = CommandHandler ('test' , self .callback_data_1 , pass_user_data = True )
0 commit comments