From 580fa2e49913e68412eae51840fa73aeb2e9fa36 Mon Sep 17 00:00:00 2001 From: Ramzan Bekbulatov Date: Sun, 1 Aug 2021 00:05:21 +0300 Subject: [PATCH] Allow empty and zero parts in CallbackData (#646) * enh: allow empty parts in CallbackData * enh: allow zero parts in CallbackData * new: tests for CallbackData --- aiogram/utils/callback_data.py | 4 --- tests/test_utils/test_callback_data.py | 39 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 tests/test_utils/test_callback_data.py diff --git a/aiogram/utils/callback_data.py b/aiogram/utils/callback_data.py index d44fa5b9..34ba8b71 100644 --- a/aiogram/utils/callback_data.py +++ b/aiogram/utils/callback_data.py @@ -33,8 +33,6 @@ class CallbackData: raise ValueError("Prefix can't be empty") if sep in prefix: raise ValueError(f"Separator {sep!r} can't be used in prefix") - if not parts: - raise TypeError('Parts were not passed!') self.prefix = prefix self.sep = sep @@ -64,8 +62,6 @@ class CallbackData: if value is not None and not isinstance(value, str): value = str(value) - if not value: - raise ValueError(f"Value for part {part!r} can't be empty!'") if self.sep in value: raise ValueError(f"Symbol {self.sep!r} is defined as the separator and can't be used in parts' values") diff --git a/tests/test_utils/test_callback_data.py b/tests/test_utils/test_callback_data.py new file mode 100644 index 00000000..c337c527 --- /dev/null +++ b/tests/test_utils/test_callback_data.py @@ -0,0 +1,39 @@ +import pytest + +from aiogram.types import CallbackQuery +from aiogram.utils.callback_data import CallbackData + + +class TestCallbackData: + @pytest.mark.asyncio + async def test_cb(self): + cb = CallbackData('simple', 'action') + assert cb.new('x') == 'simple:x' + assert cb.new(action='y') == 'simple:y' + assert cb.new('') == 'simple:' + + assert (await cb.filter().check(CallbackQuery(data='simple:'))) == {'callback_data': {'@': 'simple', 'action': ''}} + assert (await cb.filter().check(CallbackQuery(data='simple:x'))) == {'callback_data': {'@': 'simple', 'action': 'x'}} + assert (await cb.filter(action='y').check(CallbackQuery(data='simple:x'))) is False + + @pytest.mark.asyncio + async def test_cb_double(self): + cb = CallbackData('double', 'pid', 'action') + assert cb.new('123', 'x') == 'double:123:x' + assert cb.new(pid=456, action='y') == 'double:456:y' + assert cb.new('', 'z') == 'double::z' + assert cb.new('789', '') == 'double:789:' + + assert (await cb.filter().check(CallbackQuery(data='double::'))) == {'callback_data': {'@': 'double', 'pid': '', 'action': ''}} + assert (await cb.filter().check(CallbackQuery(data='double:x:'))) == {'callback_data': {'@': 'double', 'pid': 'x', 'action': ''}} + assert (await cb.filter().check(CallbackQuery(data='double::y'))) == {'callback_data': {'@': 'double', 'pid': '', 'action': 'y'}} + assert (await cb.filter(action='x').check(CallbackQuery(data='double:123:x'))) == {'callback_data': {'@': 'double', 'pid': '123', 'action': 'x'}} + + @pytest.mark.asyncio + async def test_cb_zero(self): + cb = CallbackData('zero') + assert cb.new() == 'zero' + + assert (await cb.filter().check(CallbackQuery(data='zero'))) == {'callback_data': {'@': 'zero'}} + assert (await cb.filter().check(CallbackQuery(data='zero:'))) is False + assert (await cb.filter().check(CallbackQuery(data='bla'))) is False