aboutsummaryrefslogtreecommitdiffstats
path: root/tests (follow)
Commit message (Collapse)AuthorAgeLines
* Apply review comments to duckpond's unit testsGravatar Sebastiaan Zeeff2019-11-27-72/+128
| | | | | | | | https://github.com/python-discord/bot/pull/621 I've changed to unit tests according to the comments made on the issue. Most changes are straightforward enough, but, for context, see the PR linked above.
* Apply suggestions from code reviewGravatar Sebastiaan Zeeff2019-11-16-4/+3
| | | Co-Authored-By: Mark <[email protected]>
* Add unit tests with full coverage for `bot.cogs.duck_pond`Gravatar Sebastiaan Zeeff2019-11-15-159/+490
| | | | | This commit adds unit tests that provide a full branch coverage of the `bot.cogs.duck_pond` file.
* Add MockAsyncWebhook to mock `discord.Webhook` objectsGravatar Sebastiaan Zeeff2019-11-15-0/+21
| | | | | | | I have added a mock type to mock `discord.Webhook` instances. Note that the current type is specifically meant to mock webhooks that use an AsyncAdaptor and therefore has AsyncMock/coroutine mocks for the "maybe-coroutine" methods specified in the `discord.py` docs.
* Adjust MockReaction for new AsyncIteratorMock protocolGravatar Sebastiaan Zeeff2019-11-15-3/+1
| | | | | The new AsyncIteratorMock no longer needs an additional method to be used with a Mock object.
* Add MockUser to mock `discord.User` objectsGravatar Sebastiaan Zeeff2019-11-15-0/+19
| | | | | | | | I have added a special mock that follows the specifications of a `discord.User` instance. This is useful, since `Users` have less attributes available than `discord.Members`. Since this difference in availability of information can be important, we should not use a `MockMember` to mock a `discord.user`.
* Add `return_value` support and assertions to AsyncIteratorMockGravatar Sebastiaan Zeeff2019-11-15-4/+54
| | | | | | | | | | | The AsyncIteratorMock included in Python 3.8 will work similarly to the mocks of callabes. This means that it allows you to set the items it will yield using the `return_value` attribute. It will also have support for the common Mock-specific assertions. This commit introduces some backports of those features in a slightly simplified way to make the transition to Python 3.8 easier in the future.
* Add MockAttachment type and attachments default for MockMessageGravatar Sebastiaan Zeeff2019-11-14-1/+16
| | | | | | | | | | | | | As stated from the start, our intention is to add custom mock types as we need them for testing. While writing tests for DuckPond, I noticed that we did not have a mock type for Attachments, so I added one with this commit. In addition, I think it's a very sensible for MockMessage to have an empty list as a default value for the `attachements` attribute. This is equal to what `discord.Message` returns for a message without attachments and makes sure that if you don't explicitely add an attachment to a message, `MockMessage.attachments` tests as falsey.
* Add bot=False default value to MockMemberGravatar Sebastiaan Zeeff2019-11-14-1/+1
| | | | | | | | | | | | | | | | | By default, a mocked value is considered `truthy` in Python, like all non-empty/non-zero/non-None values in Python. This means that if an attribute is not explicitly set on a mock, it will evaluate at as truthy in a boolean context, since the mock will provide a truthy mocked value by default. This is not the best default value for the `bot` attribute of our MockMember type, since members are rarely bots. It makes much more intuitive sense to me to consider a member to not be a bot, unless we explicitly set `bot=True`. This commit sets that sensible default value that can be overwritten by passing `bot=False` to the constructor or setting the `object.bot` attribute to `False` after the creation of the mock.
* Merging in masterGravatar Leon Sandøy2019-11-13-144/+637
|\
| * Merge branch 'master' into unittest-helpers-improvementsGravatar scragly2019-11-14-0/+101
| |\
| | * Merge branch 'master' into unittest-linksGravatar Mark2019-11-08-13/+483
| | |\
| | * | Update docstring to use asterisks when referring to argument namesGravatar kwzrd2019-11-08-1/+1
| | | | | | | | | | | | Co-Authored-By: Kyle Stanley <[email protected]>
| | * | Add whitespace for readability, consistency & allureGravatar kwzrd2019-11-08-0/+1
| | | |
| | * | Adjust case to only test a single aspectGravatar kwzrd2019-11-02-1/+1
| | | |
| | * | Annotate unclear test cases with inline commentsGravatar kwzrd2019-11-02-2/+2
| | | |
| | * | Add two more test cases for links rule unit testGravatar kwzrd2019-11-01-0/+7
| | | |
| | * | Add unit test for links antispam ruleGravatar kwzrd2019-11-01-0/+93
| | | |
| * | | Prevent await warnings for MockBot's create_taskGravatar Sebastiaan Zeeff2019-11-13-1/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously, the coroutine object passed to `MockBot.loop.create_task` would trigger a `RuntimeWarning` for not being awaited as we do not actually create a task for it. To prevent these warnings, coroutine objects passed will now automatically be closed.
| * | | Prevent setting unknown attributes on d.py mocksGravatar Sebastiaan Zeeff2019-11-13-158/+101
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Our custom `discord.py` now follow the specifications of the object they are mocking more strictly by using the `spec_set` instead of the `spec` kwarg to initialize the specifications. This means that trying to set an attribute that does not follow the specifications will now also result in an `AttributeError`. To make sure we are not trying to set illegal attributes during the default initialization of the mock objects, I've changed the way we handle default values of parameters. This does introduce a breaking change: Instead of passing a `suffix_id`, the `id` attribute should now be passed using the exact name. `id`. This commit also makes sure existing tests follow this change.
| * | | Allow `name` attribute to be set during Mock initGravatar Sebastiaan Zeeff2019-11-13-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The `name` keyword argument has a special meaning for the default mockobjects provided by `unittest.mock`. This means that by default, the common d.py `name` attribute can't be set during initalization of one of our custom Mock-objects by passing it to the constructor. Since it's unlikely for us to make use of the special `name` feature of mocks and more likely to want to set the d.py `name` attribute, I added special handling of the `name` kwarg.
| * | | Prevent unwanted logging while running testsGravatar Sebastiaan Zeeff2019-11-13-1/+14
| | |/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously, logging messages would output to std.out. when running individual test files (instead of running the entire suite). To prevent this, I've added a `for`-loop to `tests.helpers` that sets the level of all registered loggers to `CRITICAL`. The reason for adding this to `tests.helpers` is simple: It's the most common file to be imported in individual tests, increasing the chance of the code being run for individual test files. A small downside of this way of handling logging is that when we are trying to assert logging messages are being emitted, we need to set the logger explicitly in the `self.assertLogs` context manager. This is a small downside, though, and probably good practice anyway. There was one test in `tests.bot.test_api` that did not do this, so I have changed this to make the test compatible with the new set-up.
| * | Merge branch 'master' into user-command-enhancementsGravatar scragly2019-11-04-0/+52
| |\ \
| * | | Enhance the output of the user commandGravatar Sebastiaan Zeeff2019-10-31-13/+431
| | |/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | https://github.com/python-discord/bot/issues/628 https://github.com/python-discord/bot/issues/339 This commit introduces several changes to the output of the `!user` command for moderation staff. The output for regular users has not changed. Changes: - When issued in a moderation channel, the infraction count of the user will now be broken down by type as described in #339. This allows moderators to get a quicker overview of someone's history by providing more information. The command will display the total number of infractions per type, with the number of active infractions in parentheses behind it if there are any. This change also means that there no longer a need for the `hidden` parameter: When issued in a moderation channel, hidden infractions are included by default; when issued outside of a mod channel, the command will be equal to what a regular user would get. In addition to broken-down infraction info, the command now also shows information about the nominations of a user when it's issued inside of a moderation channel. - The code has been refactored to smaller units that take care of a single action to make unit testing easier. I have included tests that cover the command and all of the new helper methods. Tests for the other methods/commands in the cog will be added in the specific issue calling for tests for this cog (#581) This commit closes #628 and closes #339
* | | Add tests for on_raw_reaction_add.Gravatar Leon Sandøy2019-11-12-14/+70
| | | | | | | | | | | | | | | | | | | | | Basically I suck at this and I can't get this return_value thing to work. I'll have Ves look at it to resolve it. As of right now, multiple tests are failing.
* | | Implement a mixed duck test.Gravatar Leon Sandøy2019-11-11-10/+20
| | | | | | | | | | | | | | | Also gets started setting up for the final tests, which will require more mockwork.
* | | Adding ducky count tests and a new AsyncIteratorMockGravatar Leon Sandøy2019-11-11-15/+93
| | |
* | | Test is_staff and has_green_checkmark.Gravatar Leon Sandøy2019-11-03-17/+35
| | |
* | | Resolving merge conflicts from masterGravatar Leon Sandøy2019-11-03-179/+256
|\ \ \ | | |/ | |/|
| * | Use `casefold` in some cases.Gravatar Johannes Christ2019-11-02-1/+4
| | |
| * | Write tests for `bot.utils`.Gravatar Johannes Christ2019-11-01-0/+49
| |/ | | | | | | Closes #604.
| * Update docstring and remove redundant attributeGravatar Sebastiaan Zeeff2019-10-30-4/+9
| | | | | | | | | | | | | | | | | | | | I accidentally forgot to update the docstring of `CustomMockMixin`, which changed quite dramatically in scope with the last commit. This commit remedies that. In addition, I inadvertently forgot to remove the `child_mock_type` class attribute from `MockRole`. Since it uses the default value, it is no longer necessary to specify it in the child class as well.
| * Enhance custom mock helpersGravatar Sebastiaan Zeeff2019-10-30-161/+150
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I have enhanced the custom mocks defined in `tests/helpers.py` in a couple of important ways. 1. Automatically create AsyncMock attributes using `inspect` Our previous approach, hard-coding AsynckMock attributes for all the coroutine function methods defined for the class we are trying to mock is prone to human error and not resilient against changes introduced in updates of the library we are using. Instead, I have now created a helper method in our `CustomMockMixin` (formerly `GetChildMockMixin`) that automatically inspects the spec instance we've passed for `coroutine functions` using the `inspect` module. It then sets the according attributes with instances of the AsyncMock class. There is one caveat: `discord.py` very rarely defines regular methods that return a coroutine object. Since the returned coroutine should still be awaited, these regular methods should also be mocked with an AsyncMock. However, since they are regular methods, `inspect` does not detect them and they have to be added manually. (The only case of this I've found so far is `Client.wait_for`.) 2. Properly set special attributes using `kwargs.get` As we want attributes that point to other discord.py objects to use our custom mocks (.e.g, `Message.author` should use `MockMember`), the `__init__` method of our custom mocks make sure to correctly instantiate these attributes. However, the way we previously did that means we can't instantiate the custom mock with a mock instance we provide, since this special instantiation would overwrite the custom object we'd passed. I've solved this by using `kwargs.get`, with a new mock as the default value. This makes sure we only create a new mock if we didn't pass a custom one: ```py class MockMesseage: def __init__(self, **kwargs): self.author = kwargs.get('author', MockMember()) ``` As you can see, we will only create a new MockMember if we did not pass an `author` argument. 3. Factoring out duplicate lines Since our `CustomMockMixin` is a parent to all of our custom mock types, it makes sense to use it to factor out common code of all of our custom mocks. I've made the following changes: - Set a default child mock type in the mixin. - Create an `__init__` that takes care of the `inspect` of point 1 This means we won't have to repeat this in all of the child classes. 4. Three new Mock types: Emoji, PartialEmoji, and Reaction I have added three more custom mocks: - MockEmoji - MockPartialEmoji - MockReaction
| * Change generation of child mocksGravatar Sebastiaan Zeeff2019-10-28-36/+67
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - https://docs.python.org/3/library/unittest.mock.html We previously used an override of the `__new__` method to prevent our custom mock types from instantiating their children with their own type instead of a general mock type like `MagicMock` or `Mock`. As it turns out, the Python documentation suggests another method of doing this that does not involve overriding `__new__`. This commit implements this new method to make sure we're using the idiomatic way of handling this. The suggested method is overriding the `_get_child_mock` method in the subclass. To make our code DRY, I've created a mixin that should come BEFORE the mock type we're subclassing in the MRO. --- In addition, I have also added this new mixin to our `AsyncMock` class to make sure that its `__call__` method returns a proper mock object after it has been awaited. This makes sure that subsequent attribute access on the returned object is mocked as expected.
* | Figure out which tests we need.Gravatar Leon Sandøy2019-10-31-0/+81
|/ | | | | | | This adds empty tests for all the tests I'd like to add to this pull request. It also adds a few more duckies to the emoji constant list, and adds a single line of clarification to the testing readme.
* Add test cases for in_channel_checkGravatar Atul Mishra2019-10-22-0/+8
|
* Merge branch 'master' into moderator-channel-checkGravatar Atul Mishra2019-10-22-1174/+2310
|\
| * Merge branch 'master' into unittest-migrationGravatar Sebastiaan Zeeff2019-10-15-0/+62
| |\ | | | | | | | | | | | | Resolving merge conflicts from master in `.gitignore` and `tests/helpers.py`.
| * | Remove empty tests.cogs folderGravatar Sebastiaan Zeeff2019-10-14-0/+0
| | |
| * | Make test_token_remover use our discord MocksGravatar Sebastiaan Zeeff2019-10-14-8/+5
| | | | | | | | | | | | | | | | | | | | | This commit replaces the standard MagicMocks by our specialized mocks for discord.py objects. It also adds the missing `channel` attribute to the `tests.helpers.MockMessage` mock and moves the file to the correct folder.
| * | Use `MockBot`.Gravatar Johannes Christ2019-10-14-3/+3
| | |
| * | Move the `token_remover` cog tests to `unittest`.Gravatar Johannes Christ2019-10-14-0/+139
| | |
| * | Merge branch 'unittest-migration' of github.com:python-discord/bot into ↵Gravatar Sebastiaan Zeeff2019-10-14-0/+26
| |\ \ | | | | | | | | | | | | unittest-migration
| | * | Migrate test_constants to unittestGravatar Sebastiaan Zeeff2019-10-14-0/+26
| | | | | | | | | | | | | | | | | | | | Migrates the `test_constants.py` file to unittest. As with the pytest version, there is not yet support to test container types.
| * | | Add more specialized Mocks to tests.helpersGravatar Sebastiaan Zeeff2019-10-14-181/+383
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit introduces some new Mock-types to the already existing Mock-types for discord.py objects. The total list is now: - MockGuild - MockRole - MockMember - MockBot - MockContext - MockTextChannel - MockMessage In addition, I've added all coroutines in the documentation for these discord.py objects as `AsyncMock` attributes to ease testing. Tests ensure that the attributes set for the Mocks exist for the actual discord.py objects as well.
| * | Remove empty tests.cogs folderGravatar Sebastiaan Zeeff2019-10-14-0/+0
| | |
| * | Merge branch 'cogs-security-unittest' into unittest-migrationGravatar Sebastiaan Zeeff2019-10-14-0/+59
| |\ \
| | * | Move test_security to tests.bot.cogsGravatar Sebastiaan Zeeff2019-10-14-0/+0
| | | |
| | * | Use `MockBot` and `MockContext`.Gravatar Johannes Christ2019-10-13-3/+3
| | | |
| | * | Move the `security` cog tests to `unittest`.Gravatar Johannes Christ2019-10-12-0/+59
| | | |