|  | Commit message (Collapse) | Author | Age | Lines | 
|---|
| | 
| 
| 
| | `utils` instead and added `utils` before variables and function that was imported directly before. | 
| | |  | 
| | 
| 
| 
| | errors | 
| | |  | 
| | 
| 
| 
| | `test_send_private_embed`. | 
| | |  | 
| | 
| 
| 
| | `ctx.send` raising errors, added check for return values and `send_private_embed` call. | 
| | 
| 
| 
| | `ctx.send` raising errors, added check for return values and `send_private_embed` call. | 
| | 
| 
| 
| | `has_active_infraction` tests: `ctx.send` and `bot.api_client.get` calling. | 
| | 
| 
| 
| | instead creating new one | 
| | 
| 
| 
| | (`self.bot.api_client.get`) | 
| | |  | 
| | 
| 
| 
| | cases testing to test cases listing, added side_effect resetting. | 
| | 
| 
| 
| | created __init__.py for moderation tests | 
| | 
| 
| 
| | Fixed errors. | 
| | |  | 
| | |  | 
| | |  | 
| | |  | 
| | 
| 
| 
| | created new params for tests class | 
| | |  | 
| | 
| 
| | Previous regex utilized a `/`, which doesn't work for comparing against Windows paths, which use `\` | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | I've migrated the `tests/test_snekbox.py` file to use the new Python 3.8-style unittests instead of our old style using our custom Async mocks.
In particular, I had to make a few changes:
- Mocking the async post() context manager correctly
Since `ClientSession.post` returns an async context manager when called, we need to make sure to assign the return value to the __aenter__ method of whatever `post()` returns, not of `post` itself (i.e.. when it's not called).
- Use the new AsyncMock assert methods `assert_awaited_once` and `assert_awaited_once_with`
Objects of the new `unittest.mock.AsyncMock` class have special methods to assert what they were called with that also assert that specific coroutine object was awaited. This means we test two things in one: Whether or not it was called with the right arguments and whether or not the returned coroutine object was then awaited.
- Patch `functools.partial` as `partial` objects are compared by identity
When you create two partial functions of the same function, you'll end up with two different `partial` objects. Since `partial` objects are compared by identity, you can't compare a `partial` created in a test method to that created in the callable you're trying to test. They will always compare as `False`. Since we're not interested in actually creating `partial` objects, I've just patched `functools.partial` in the namespace of the module we're testing to make sure we can compare them. | 
| |\  
| | 
| | 
| | | I've resolved the merge conflict by confirming the deleted part of tests/helpers.py | 
| | |\ |  | 
| | | |\ |  | 
| | | | | |  | 
| | | | | 
| | | | 
| | | | 
| | | | | Unicode literals aren't really safe compared to code points | 
| | | | | 
| | | | 
| | | | 
| | | | | Two functions were created: send_eval and continue_eval, in order to facilitate testing. The corresponding tests are also changed in this commit. | 
| | | |\ \ |  | 
| | | | | | |  | 
| | | | | | |  | 
| | | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | | Because of the stripping, it should still be considered as empty
Co-Authored-By: Mark <[email protected]> | 
| | | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | | Reduce visual clutter
Co-Authored-By: Mark <[email protected]> | 
| | | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | | Reads better as separate lines
Co-Authored-By: Mark <[email protected]> | 
| | | | | | 
| | | | | 
| | | | | | Co-Authored-By: Mark <[email protected]> | 
| | | | | | |  | 
| | | | | | 
| | | | | 
| | | | | 
| | | | | | It can be used to test aiohttp request functions, since they are async context managers | 
| | |\ \ \ \  
| | | |_|/  
| | |/| |   
| | | | |   
| | | | | | # Conflicts:
#	bot/cogs/error_handler.py | 
| | | |\ \ \ |  | 
| | | | | | | |  | 
| | | |\ \ \ \ |  | 
| | | | | | | | |  | 
| | | | | | | | |  | 
| | |\ \ \ \ \ \  
| | | |_|/ / /  
| | |/| | | | |  | 
| | | |\ \ \ \ \  
| | | | |/ / /  
| | | |/| | | |  | 
| | | | |/ / /  
| | |/| | |   
| | | | | |   
| | | | | | | The function was only used in the since removed `Events` cog. | 
| | | |/ / /  
| |/| | | |  | 
| | | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | | The `_get_diff` method of TestSyncer class is mocked using an AsyncMock object. By default, when an AsyncMock object is called **and awaited**, it returns a child mock of the same time (another AsyncMock) according to the "the child is a like the parent" principle. This means that the _get_diff method will return an AsyncMock unless a different return_value is explicitly provided.
Because of that "child is like parent" behavior, this will happen in lines 194-196 of bot.cogs.sync.syncers (annotations added by me):
```
// `diff` will be a child AsyncMock as "child is like parent"
diff = await self._get_diff(guild)
// `diff._asdict` will be an AsyncMock as "child is like parent" and,
// after being called, it will return an unawaited coroutine object
// we assign the name `diff_dict`:
diff_dict = diff._asdict()
// `diff_dict` is still an unawaited coroutine object meaning that it
// doesn't have an `items()` method:
totals = {k: len(v) for k, v in diff_dict.items() if v is not None}
```
Original, unannotated: https://github.com/python-discord/bot/blob/c81a4d401ea434e98b0a1ece51d3d10f1a3ad226/bot/cogs/sync/syncers.py#L194-L196
This will lead to the following exception when running the tests:
```py
======================================================================
ERROR: test_sync_confirmation_context_redirect (tests.bot.cogs.sync.test_base.SyncerSyncTests) (ctx=None, author=<MockMember name='mock.user' spec_set='Member' id='140583452034864'>, message=None)
If ctx is given, a new message should be sent and author should be ctx's author.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/sebastiaan/pydis/repositories/bot/tests/bot/cogs/sync/test_base.py", line 348, in test_sync_confirmation_context_redirect
    await self.syncer.sync(guild, ctx)
  File "/home/sebastiaan/pydis/repositories/bot/bot/cogs/sync/syncers.py", line 196, in sync
    totals = {k: len(v) for k, v in diff_dict.items() if v is not None}
AttributeError: 'coroutine' object has no attribute 'items'
```
The solution is to assign an explicit return value so the parent mock doesn't "guess" and return an object of its own type. I previously did that by providing a specific `_Diff` object as the return value, but I should have gone with a `MagicMock` to signify that it's not an important return value; it's just something that needs to support/mimic the API we use on it. So that's what this commit adds. | 
| | | | | | 
| | | | | 
| | | | | 
| | | | | 
| | | | | | Autospec supports using AsyncMocks in 3.8 so there's no need to rely on
a subclass of CustomMockMixin for the async mocks. |