diff --git a/koala/cogs/announce/__init__.py b/koala/cogs/announce/__init__.py index bcc0d1f7..9a9043cf 100644 --- a/koala/cogs/announce/__init__.py +++ b/koala/cogs/announce/__init__.py @@ -1,3 +1,8 @@ -from . import utils, db, log, models -from .cog import Announce, setup -from .announce_message import AnnounceMessage \ No newline at end of file +from . import api, cog, db, log, models, utils +from .announce_message import AnnounceMessage +from .cog import Announce + + +def setup(bot): + cog.setup(bot) + api.setup(bot) \ No newline at end of file diff --git a/koala/cogs/announce/api.py b/koala/cogs/announce/api.py new file mode 100644 index 00000000..66045672 --- /dev/null +++ b/koala/cogs/announce/api.py @@ -0,0 +1,56 @@ +# Futures +# Built-in/Generic Imports +# Libs +from http.client import BAD_REQUEST, CREATED, OK + +import discord +from aiohttp import web +from discord.ext.commands import Bot + +from koala.rest.api import build_response, parse_request +from koala.utils import convert_iso_datetime + +# Own modules +from . import cog +from .log import logger + +# Constants +ANNOUNCE_ENDPOINT = 'announce' + +ANNOUNCE_STATUS= 'announce_status' # GET + + +class AnnounceEndpoint: + """ + The API endpoints for AnnounceCog + """ + + def __init__(self, bot): + self._bot = bot + + def register(self, app): + """ + Register the routes for the given application + todo: review aiohttp 'views' and see if they are a better idea + :param app: The aiohttp.web.Application (likely of the sub app) + :return: app + """ + app.add_routes([web.get('/{endpoint}'.format(endpoint=ANNOUNCE_STATUS), self.get_announce_is_enabled)]) + return app + + + @parse_request + async def get_announce_is_enabled(guild): + return await cog.announce_is_enabled(guild) + + +def setup(bot: Bot): + """ + Load this cog to the KoalaBot. + :param bot: the bot client for KoalaBot + """ + sub_app = web.Application() + endpoint = AnnounceEndpoint(bot) + endpoint.register(sub_app) + getattr(bot, "koala_web_app").add_subapp('/{extension}'.format(extension=ANNOUNCE_ENDPOINT), sub_app) + logger.info("Announce API is ready.") diff --git a/koala/cogs/announce/cog.py b/koala/cogs/announce/cog.py index e8c1f9ad..178a073f 100644 --- a/koala/cogs/announce/cog.py +++ b/koala/cogs/announce/cog.py @@ -11,10 +11,12 @@ from koala.colours import KOALA_GREEN from koala.db import insert_extension from koala.utils import extract_id, wait_for_message + from .announce_message import AnnounceMessage from .db import AnnounceDBManager from .log import logger -from .utils import ANNOUNCE_SEPARATION_DAYS, SECONDS_IN_A_DAY, MAX_MESSAGE_LENGTH +from .utils import (ANNOUNCE_SEPARATION_DAYS, MAX_MESSAGE_LENGTH, + SECONDS_IN_A_DAY) def announce_is_enabled(ctx): diff --git a/koala/cogs/announce/db.py b/koala/cogs/announce/db.py index 99394df4..39e09336 100644 --- a/koala/cogs/announce/db.py +++ b/koala/cogs/announce/db.py @@ -3,6 +3,7 @@ # Own modules from koala.db import session_manager + from .models import GuildUsage # Libs diff --git a/koala/cogs/announce/models.py b/koala/cogs/announce/models.py index b032c739..f31c2b53 100644 --- a/koala/cogs/announce/models.py +++ b/koala/cogs/announce/models.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Integer, ForeignKey +from sqlalchemy import Column, ForeignKey, Integer from koala.db import setup from koala.models import mapper_registry diff --git a/tests/cogs/announce/conftest.py b/tests/cogs/announce/conftest.py new file mode 100644 index 00000000..bc7cd0da --- /dev/null +++ b/tests/cogs/announce/conftest.py @@ -0,0 +1,13 @@ +import pytest +from aiohttp import web +from discord.ext.commands import Bot + +from koala.cogs.announce.api import AnnounceEndpoint + + +@pytest.fixture(autouse=True) +def setup_attributes(bot: Bot): + app = web.Application() + endpoint = AnnounceEndpoint(bot) + endpoint.register(app) + setattr(bot, "koala_web_app", app) \ No newline at end of file diff --git a/tests/cogs/announce/test_api.py b/tests/cogs/announce/test_api.py new file mode 100644 index 00000000..70609596 --- /dev/null +++ b/tests/cogs/announce/test_api.py @@ -0,0 +1,25 @@ +from http.client import BAD_REQUEST, CREATED, OK, UNPROCESSABLE_ENTITY + +# Libs +import discord +import pytest +from aiohttp import web + +import koalabot +from koala.cogs.announce.api import AnnounceEndpoint +from koala.db import get_all_available_guild_extensions +from koala.rest.api import parse_request + + +@pytest.fixture +def api_client(bot: discord.ext.commands.Bot, aiohttp_client, loop ): + app = web.Application() + endpoint = AnnounceEndpoint(bot) + app = endpoint.register(app) + return loop.run_until_complete(aiohttp_client(app)) + +# Check if announce cog is enabled +async def test_is_announce_cog_enabled(api_client): + resp = await api_client.get('/announce_status?guild=1') + assert resp.status == OK + assert await resp.json() == True \ No newline at end of file diff --git a/tests/cogs/base/test_core.py b/tests/cogs/base/test_core.py index e550ee14..ceca35d6 100644 --- a/tests/cogs/base/test_core.py +++ b/tests/cogs/base/test_core.py @@ -208,7 +208,6 @@ async def test_list_enabled_extensions(bot: commands.Bot): @mock.patch("koalabot.ENABLED_COGS", ["announce"]) @pytest.mark.asyncio async def test_get_extensions(bot: commands.Bot): - koalabot.load_all_cogs() guild: discord.Guild = dpytest.get_config().guilds[0] resp = core.get_all_available_guild_extensions(guild.id) print(resp)