Skip to content

Commit

Permalink
default group stack id
Browse files Browse the repository at this point in the history
  • Loading branch information
Tishka17 committed Dec 5, 2023
1 parent 6450c84 commit b6821e4
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 11 deletions.
1 change: 1 addition & 0 deletions example/subdialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
Data, Dialog, DialogManager, Window, StartMode,
setup_dialogs,
)
from aiogram_dialog.api.entities import GROUP_STACK_ID
from aiogram_dialog.tools import render_transitions, render_preview
from aiogram_dialog.widgets.input import MessageInput
from aiogram_dialog.widgets.kbd import (
Expand Down
4 changes: 2 additions & 2 deletions src/aiogram_dialog/api/entities/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"MediaAttachment", "MediaId",
"ShowMode", "StartMode",
"MarkupVariant", "NewMessage", "OldMessage", "UnknownText",
"AccessSettings", "DEFAULT_STACK_ID", "Stack",
"AccessSettings", "DEFAULT_STACK_ID", "GROUP_STACK_ID", "Stack",
"DIALOG_EVENT_NAME", "DialogAction", "DialogUpdateEvent",
"DialogStartEvent", "DialogSwitchEvent", "DialogUpdate",
]
Expand All @@ -16,7 +16,7 @@
from .media import MediaAttachment, MediaId
from .modes import ShowMode, StartMode
from .new_message import MarkupVariant, NewMessage, OldMessage, UnknownText
from .stack import AccessSettings, DEFAULT_STACK_ID, Stack
from .stack import AccessSettings, DEFAULT_STACK_ID, GROUP_STACK_ID, Stack
from .update_event import (
DIALOG_EVENT_NAME, DialogAction, DialogStartEvent, DialogSwitchEvent,
DialogUpdate, DialogUpdateEvent,
Expand Down
1 change: 1 addition & 0 deletions src/aiogram_dialog/api/entities/stack.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from .context import Context, Data

DEFAULT_STACK_ID = ""
GROUP_STACK_ID = "<->"
_STACK_LIMIT = 100
_ID_SYMS = string.digits + string.ascii_letters

Expand Down
19 changes: 10 additions & 9 deletions src/aiogram_dialog/context/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,18 @@ async def load_context(self, intent_id: str) -> Context:
data["state"] = self._state(data["state"])
return Context(**data)

def _default_access_settings(self, stack_id: str) -> AccessSettings:
if stack_id == DEFAULT_STACK_ID:
return AccessSettings(user_ids=[self.user_id])
else:
return AccessSettings(user_ids=[])

async def load_stack(self, stack_id: str = DEFAULT_STACK_ID) -> Stack:
stack_id = self._fixed_stack_id(stack_id)
data = await self.storage.get_data(
key=self._stack_key(stack_id),
)
fixed_stack_id = self._fixed_stack_id(stack_id)
data = await self.storage.get_data(self._stack_key(fixed_stack_id))
if not data:
if self.user_id:
default_access = AccessSettings(user_ids=[self.user_id])
else:
default_access = AccessSettings(user_ids=[])
return Stack(_id=stack_id, access_settings=default_access)
access_settings = self._default_access_settings(stack_id)
return Stack(_id=fixed_stack_id, access_settings=access_settings)

access_settings = self._parse_access_settings(
data.pop("access_settings"),
Expand Down
27 changes: 27 additions & 0 deletions tests/test_group.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import asyncio
from typing import Any

import pytest
Expand All @@ -8,6 +9,7 @@
from aiogram_dialog import (
Dialog, DialogManager, setup_dialogs, StartMode, Window,
)
from aiogram_dialog.api.entities import GROUP_STACK_ID
from aiogram_dialog.test_tools import BotClient, MockMessageManager
from aiogram_dialog.test_tools.keyboard import InlineButtonTextLocator
from aiogram_dialog.widgets.kbd import Button
Expand All @@ -29,6 +31,11 @@ async def start(event: Any, dialog_manager: DialogManager):
await dialog_manager.start(MainSG.start, mode=StartMode.RESET_STACK)


async def start_shared(event: Any, dialog_manager: DialogManager):
dialog_manager = dialog_manager.bg(stack_id=GROUP_STACK_ID)
await dialog_manager.start(MainSG.start, mode=StartMode.RESET_STACK)


@pytest.fixture()
def message_manager():
return MockMessageManager()
Expand Down Expand Up @@ -66,6 +73,7 @@ async def test_second_user(dp, client, second_client, message_manager):
)
assert not message_manager.sent_messages


@pytest.mark.asyncio
async def test_same_user(dp, client, message_manager):
dp.message.register(start, CommandStart())
Expand All @@ -74,9 +82,28 @@ async def test_same_user(dp, client, message_manager):
assert first_message.text == "stub"
message_manager.reset_history()
await client.send("test")
first_message = message_manager.one_message()
assert first_message.text == "stub"
message_manager.reset_history()
await client.click(
first_message, InlineButtonTextLocator("Button"),
)
first_message = message_manager.one_message()
assert first_message.text == "stub"


@pytest.mark.asyncio
async def test_shared_stack(dp, client, second_client, message_manager):
dp.message.register(start_shared, CommandStart())
await client.send("/start")
await asyncio.sleep(0.01) # synchronization workaround, fixme
first_message = message_manager.one_message()
assert first_message.text == "stub"
message_manager.reset_history()
await second_client.send("test")
assert not message_manager.sent_messages
await second_client.click(
first_message, InlineButtonTextLocator("Button"),
)
second_message = message_manager.one_message()
assert second_message.text == "stub"

0 comments on commit b6821e4

Please sign in to comment.