| Commit message (Collapse) | Author | Age | Lines |
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
Creating a new object caused the assert to fail because different objects were used.
|
| | |
|
| |
|
|
| |
`assert_called_once_with` was being tested on call_args which always reported success.st.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
This allows us to use coroutines with await directly instead of asyncio.run
|
| | |
|
| |
|
|
|
|
| |
With the removal of the channel args,
it's no longer necessary to mention the channel in the command output.
Tests adjusted accordingly
|
| |
|
|
|
| |
Needless call args which were constant were kept in the test cases, resulting in redundant code,
the args were moved directly into the function call.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
| |
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.
|