aboutsummaryrefslogtreecommitdiffstats
path: root/tests/helpers.py (unfollow)
Commit message (Collapse)AuthorLines
2020-05-25Expose the redis port to the hostGravatar MarkKoz-0/+2
Useful for those that run redis with docker-compose but not the bot. The bot on the host won't have access to the Docker network in such case so the port must be exposed.
2020-05-25Improve output of section name in config validation subtestsGravatar MarkKoz-1/+1
2020-05-25Support validating collection types for constantsGravatar MarkKoz-8/+32
This is a simple validation that only check the type of the collection. It does not validate the types inside the collection because that has proven to be quite complex.
2020-05-24Add support for Union type annotations for constantsGravatar MarkKoz-12/+19
Note that `Optional[x]` is just an alias for `Union[None, x]` so this effectively supports `Optional` too. This was especially troublesome because the redis password must be unset/None in order to avoid authentication, but the test would complain that `None` isn't a `str`. Setting to an empty string would pass the test but then make redis authenticate and fail.
2020-05-24Improve error and error testing for incrementGravatar Leon Sandøy-1/+9
Changed a RuntimeError to a KeyError (thanks @MarkKoz), and also added some tests to ensure that the right errors are raised whenever this method is used incorrectly.
2020-05-24Add an option to use fakeredis in Bot.Gravatar Leon Sandøy-48/+66
Without this option, all contributors would need to set up a Redis server in order to run the bot. But with use_fakeredis set to True, this is no longer necessary because it will just set up a fakeredis redis pool instead of trying to contact an actual server. This is more than good enough for most local testing purposes, since data persistence across restarts isn't really relevant for them. This also means we need to move fakeredis into our real dependency list instead of having it as a dev dependency, so there's a minor change for that as well. I also made a small kaizen change to sort all the dependencies in the Pipfile alphabetically.
2020-05-24MockBot needs to be aware of redis_readyGravatar Leon Sandøy-1/+1
Forgot to update the additional_spec_asyncs when changing the name of this Bot attribute to be public.
2020-05-24Add logging to the RedisCache.Gravatar Leon Sandøy-3/+39
Mostly trace and exception logging.
2020-05-24Rename Bot._redis_ready to Bot.redis_readyGravatar Leon Sandøy-4/+4
It's a public attribute, we're accessing it from RedisCache.
2020-05-24Add .increment and .decrement methods.Gravatar Leon Sandøy-0/+69
Sometimes, we just want to store a counter in the cache. In this case, it is convenient to have a single method that will allow us to increment or decrement this counter. These methods allow you to decrement or increment floats and integers by an specified amount. By default, it'll increment or decrement by 1. Since this involves several API requests, we create an asyncio.Lock so that we don't end up with race conditions.
2020-05-24Make .items return ItemsView instead of AsyncIterGravatar Leon Sandøy-9/+23
There really was no compelling reason why this method should return an AsyncIterator or than that `async for items in cache.items()` has nice readability, but there were a few concerns. One is a concern about race conditions raised by @SebastiaanZ, and @MarkKoz raised a concern that it was misleading to have an AsyncIterator that only "pretended" to be lazy. To address these concerns, I've refactored it to return a regular ItemsView instead. I also improved the docstring, and fixed the relevant tests.
2020-05-24Better RuntimeErrors.Gravatar Leon Sandøy-2/+14
We provide suggestions for how to solve these problems now.
2020-05-24Improves various docstrings and comments.Gravatar Leon Sandøy-10/+27
Thanks to @MarkKoz for suggesting most of these in their code review.
2020-05-24Refactor the nice prefix/type strings to constantsGravatar Leon Sandøy-31/+19
It's leaner to just move that code out of the class and up to the module level as constants. This commit also renames ValidRedisType to RedisType.
2020-05-24len(prefix) instead of hardcoding 2Gravatar Leon Sandøy-1/+1
Co-authored-by: Mark <[email protected]>
2020-05-24use __name__ for type list Gravatar Leon Sandøy-1/+1
Instead of relying on __str__ representation, we'll use the __name__ dunder. Co-authored-by: Mark <[email protected]>
2020-05-23Show a warning when redis pool isn't closedGravatar MarkKoz-0/+5
2020-05-23Remove redis session mock from MockBotGravatar MarkKoz-16/+0
It's not feasible to mock it because all the commands return futures rather than being coroutines, so they cannot automatically be turned into AsyncMocks. Furthermore, no code should ever use the redis session directly besides RedisCache. Since the tests for RedisCache already use fakeredis, there's no use in trying to mock redis in MockBot.
2020-05-23DRY approach to typestring prefix resolutionGravatar Leon Sandøy-15/+60
Thanks to @kwzrd for this idea, basically we're making a constant with the typestring prefixes and iterating that in all our converters. These converter functions will also now raise TypeErrors if we try to convert something that isn't in this constants list. I've also added a new test that tests this functionality.
2020-05-23Don't rely on HDEL ignoring keys for .popGravatar Leon Sandøy-2/+21
Previously we would try to .delete keys that did not exist if a default was provided when calling .pop. This is okay to do (because HDEL will just ignore any attempts to delete non-existing calls), but it does add an additional pointless API call to Redis, so I've added some validation as a small optimization. This also adds a few additional lines of documentation as requested by @SebastiaanZ in their review.
2020-05-23Fix typo in test_to_dict docstringGravatar Leon Sandøy-1/+1
2020-05-23Update exception message Gravatar Leon Sandøy-1/+4
This was incorrectly suggesting the user needed to create an instance of RedisCache, when in fact it is the parent that needs to be instantiated. Co-authored-by: Sebastiaan Zeeff <[email protected]>
2020-05-23CI needs REDIS_PASSWORD to pass testsGravatar Leon Sandøy-0/+1
2020-05-23Moving the Redis session creation to Bot._recreateGravatar Leon Sandøy-2/+5
2020-05-23Unbreak the error_handlerGravatar Leon Sandøy-1/+1
2020-05-23Better docstring for RedisCache.containsGravatar Leon Sandøy-1/+5
2020-05-23Better docstring for RedisCacheGravatar Leon Sandøy-1/+31
2020-05-23Complete asyncified test suite for RedisCacheGravatar Leon Sandøy-94/+112
This commit just alters existing code to work with the new interface, and with async. All tests are passing successfully.
2020-05-23Finish asyncifying RedisCache methodsGravatar Leon Sandøy-16/+34
- All methods will now do a validation check - Complete interface spec added to class: - .update - .clear - .pop - .to_dict - .length - .contains - .delete - .get - .set
2020-05-23Finish .set and .get, and add tests.Gravatar Leon Sandøy-25/+85
The .set and .get will accept ints, floats, and strings. These will be converted into "typestrings", which is basically just a simple format that's been invented for this object. For example, an int looks like `b"i|2423"`. Note how it is still stored as a bytestring (like everything in Redis), but because of this prefix we are able to coerce it into the type we want on the way out of the db.
2020-05-22Use autospecced mocks in MockBot for the stats and aiohttp sessionGravatar MarkKoz-0/+4
This will help catch anything that tries to get/set an attribute/method which doesn't exist. It'll also catch missing/too many parameters being passed to methods.
2020-05-22Properly mock the redis pool in MockBotGravatar MarkKoz-9/+19
Because some of the redis pool/connection methods return futures rather than being coroutines, the redis pool had to be mocked using the CustomMockMixin so it could take advantage of `additional_spec_asyncs` to use AsyncMocks for these future-returning methods.
2020-05-22Fix unawaited coro warning when instantiating Bot for MockBot's specGravatar MarkKoz-10/+14
The fix is to mock the loop and pass it to the Bot. It will then set it as `self.loop` rather than trying to get an event loop from asyncio. The `create_task` patch has been moved to this loop mock rather than being done in MockBot to ensure that it applies to anything calling it when instantiating the Bot.
2020-05-22Improve aiohttp context manager mocking in snekbox testsGravatar MarkKoz-3/+12
I'm not sure how it even managed to work before. It was calling the `post` coroutine (without specifying a URL) and then changing `__aenter__`. Now, a separate mock is created for the context manager and the `post` simply returns that mocked context manager.
2020-05-22Fix assertion for `create_task` in duck pond testsGravatar MarkKoz-1/+1
The assertion wasn't using the assertion method. Furthermore, it was testing a non-existent function `create_loop` rather than `create_task`.
2020-05-22Set up async testbedGravatar Leon Sandøy-198/+135
2020-05-22Eval Stats: Replaced `elif` with `else` on icon checkGravatar ks129-1/+1
Co-authored-by: Mark <[email protected]>
2020-05-22Opens a Redis connection in the Bot class.Gravatar Leon Sandøy-3/+20
This global connection is the one we will be using in RedisCache to power all our commands. This also ensures that connection is closed when the bot starts its shutdown process.
2020-05-22Replace redis-py with aioredis.Gravatar Leon Sandøy-60/+104
2020-05-22Add the REDIS_PASSWORD environment variableGravatar Leon Sandøy-137/+115
In production, we will need this password to make a connection to Redis.
2020-05-19Stats: Fix docstringsGravatar ks129-2/+2
Co-authored-by: Joseph Banks <[email protected]>
2020-05-19Stats: Fixed stat namesGravatar ks129-7/+7
Co-authored-by: Joseph Banks <[email protected]>
2020-05-18Add Steam gift card scam to domain blacklistGravatar S. Co1-0/+2
2020-05-19[bug] Adjustment to changes in #941, return message sent by webhook so ↵Gravatar Joseph Banks-1/+1
publish can take place
2020-05-17Add the REDIS_PASSWORD environment variableGravatar Leon Sandøy-6/+17
In production, we will need this password to make a connection to Redis.
2020-05-17Changes discord-py to discord.py in PipfileGravatar Leon Sandøy-7/+15
The `discord-py` package is no longer the official release, and so making this change silences some warnings about deprecation.
2020-05-17Fix incomplete variable renamingGravatar decorator-factory-1/+1
2020-05-17Rename `string` to `greeting`Gravatar decorator-factory-10/+10
2020-05-17Use `Command`-object for `send_help`Gravatar Sebastiaan Zeeff-21/+21
As @mathsman5133 pointed out, it's better to use the `Command`-instance we typically already have in the current context than to rely on parsing the qualified name again. The invocation is now done as: `await ctx.send_help(ctx.command)`
2020-05-17Add a note on user-defined classesGravatar decorator-factory-1/+1