mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 14:03:30 +00:00 
			
		
		
		
	bot docs: Simplify docs on writing bot tests.
These changes catch up to some recent improvements in the test system, plus I eliminate some unnecessary sections.
This commit is contained in:
		@@ -399,28 +399,30 @@ refactor them.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 Let's have a look at a simple test suite for the [`helloworld`](
 | 
					 Let's have a look at a simple test suite for the [`helloworld`](
 | 
				
			||||||
 https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots/helloworld)
 | 
					 https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots/helloworld)
 | 
				
			||||||
 bot (the actual test is written slightly more compact).
 | 
					 bot.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    from __future__ import absolute_import
 | 
					    from zulip_bots.test_lib import StubBotTestCase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    from zulip_bots.test_lib import BotTestCase  # The test system library
 | 
					    class TestHelpBot(StubBotTestCase):
 | 
				
			||||||
 | 
					        bot_name = "helloworld"  # type: str
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class TestHelloWorldBot(BotTestCase):
 | 
					        def test_bot(self) -> None:
 | 
				
			||||||
        bot_name = "helloworld"  # The bot's name (should be the name of the bot module to test).
 | 
					            dialog = [
 | 
				
			||||||
 | 
					                ('', 'beep boop'),
 | 
				
			||||||
 | 
					                ('help', 'beep boop'),
 | 
				
			||||||
 | 
					                ('foo', 'beep boop'),
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def test_bot(self): # A test case (must start with `test`)
 | 
					            self.verify_dialog(dialog)
 | 
				
			||||||
            # Messages we want to test and the expected bot responses.
 | 
					 | 
				
			||||||
            message_response_pairs = [("", "beep boop"),
 | 
					 | 
				
			||||||
                                      ("foo", "beep boop"),
 | 
					 | 
				
			||||||
                                      ("Hi, my name is abc", "beep boop")]
 | 
					 | 
				
			||||||
            self.check_expected_responses(message_response_pairs)  # Test the bot with our message_response_pair list.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
The `helloworld` bot replies with "beep boop" to every message @-mentioning it.
 | 
					The `helloworld` bot replies with "beep boop" to every message @-mentioning it.  We
 | 
				
			||||||
Note that our helper method `check_expected_responses` adds the @-mention for us - the only
 | 
					want our test to verify that the bot **actually** does that.
 | 
				
			||||||
thing we need to do is to specify the rest of the message and the expected response. In this
 | 
					
 | 
				
			||||||
case, we want to assert that the bot always replies with "beep boop". To do so, we specify
 | 
					Note that our helper method `verify_dialog` simulates the conversation for us, and
 | 
				
			||||||
several test messages ("", "foo", "Hi, my name is abc") and assert that the response is always
 | 
					we just need to set up a list of tuples with expected results.
 | 
				
			||||||
correct, which for this simple bot, means always sending a reply with the content "beep boop".
 | 
					
 | 
				
			||||||
 | 
					The best way to learn about bot tests is to read all the existing tests in the
 | 
				
			||||||
 | 
					`bots` subdirectories.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Testing your test
 | 
					### Testing your test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -430,8 +432,6 @@ Once you have written a test suite, you want to verify that everything works as
 | 
				
			|||||||
  https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots):
 | 
					  https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots):
 | 
				
			||||||
  `tools/test-bots <botname>`
 | 
					  `tools/test-bots <botname>`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* To run any test: `python -m unittest -v <package.bot_test>`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* To run all bot tests: `tools/test-bots`
 | 
					* To run all bot tests: `tools/test-bots`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Advanced testing
 | 
					### Advanced testing
 | 
				
			||||||
@@ -441,30 +441,20 @@ configuration files or interact with third-party APIs.
 | 
				
			|||||||
*The code for the bot testing library can be found [here](
 | 
					*The code for the bot testing library can be found [here](
 | 
				
			||||||
 https://github.com/zulip/python-zulip-api/blob/master/zulip_bots/zulip_bots/test_lib.py).*
 | 
					 https://github.com/zulip/python-zulip-api/blob/master/zulip_bots/zulip_bots/test_lib.py).*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Asserting individual messages
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    self.assert_bot_response(
 | 
					 | 
				
			||||||
        message = {'content': 'foo'},
 | 
					 | 
				
			||||||
        response = {'content': 'bar'},
 | 
					 | 
				
			||||||
        expected_method='send_reply'
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Use `assert_bot_response()` to test individual messages. Specify additional message
 | 
					 | 
				
			||||||
settings, such as the stream or subject, in the `message` and `response` dicts.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Testing bots with config files
 | 
					#### Testing bots with config files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Some bots, such as [Giphy](
 | 
					Some bots, such as [Giphy](
 | 
				
			||||||
https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots/giphy),
 | 
					https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots/giphy),
 | 
				
			||||||
support or require user configuration options to control how the bot works. To test such
 | 
					support or require user configuration options to control how the bot works.
 | 
				
			||||||
a bot, you can use the following helper method:
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    with self.mock_config_info({'entry': 'value'}):
 | 
					To test such a bot, you can use the following pattern:
 | 
				
			||||||
        # self.assert_bot_response(...)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
`mock_config_info()` mocks a bot's config file. All config files are specified in the
 | 
					    with self.mock_config_info(dict(api_key=12345)):
 | 
				
			||||||
.ini format, with one default section. The dict passed to `mock_config_info()` specifies
 | 
					        # self.verify_reply(...)
 | 
				
			||||||
the keys and values of that section.
 | 
					
 | 
				
			||||||
 | 
					`mock_config_info()` replaces the actual step of reading configuration from the file
 | 
				
			||||||
 | 
					system and gives your test "dummy data" instead.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Testing bots with internet access
 | 
					#### Testing bots with internet access
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -486,17 +476,6 @@ https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots
 | 
				
			|||||||
*Tip: You can use [requestb.in](http://requestb.in) or a similar tool to capture payloads from the
 | 
					*Tip: You can use [requestb.in](http://requestb.in) or a similar tool to capture payloads from the
 | 
				
			||||||
service your bot is interacting with.*
 | 
					service your bot is interacting with.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Testing bots that specify `initialize()`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Some bots, such as [Giphy](
 | 
					 | 
				
			||||||
https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots/giphy),
 | 
					 | 
				
			||||||
implement an `initialize()` method, which is executed on the startup of the bot. To test
 | 
					 | 
				
			||||||
such a bot, you can call its `initialize()` method with the following helper method:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    self.initialize_bot()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Calling `initialize_bot()` invokes the `initialize()` method specified by the bot.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### Examples
 | 
					#### Examples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Check out our [bots](https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots)
 | 
					Check out our [bots](https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user