| |
| """ |
| Testes para o Command Dispatcher (commands.py). |
| """ |
|
|
| import pytest |
| import asyncio |
| from unittest.mock import Mock, MagicMock, patch |
|
|
| from superezio_enterprise.commands import CommandDispatcher |
|
|
| |
| def sync_handler(arg1, kwarg1=None): |
| """Um handler síncrono de exemplo.""" |
| return f"sync: {arg1}, {kwarg1}" |
|
|
| async def async_handler(arg1, kwarg1=None): |
| """Um handler assíncrono de exemplo.""" |
| await asyncio.sleep(0.01) |
| return f"async: {arg1}, {kwarg1}" |
|
|
| @pytest.fixture |
| def dispatcher(): |
| """Fornece uma instância limpa do CommandDispatcher para cada teste.""" |
| |
| instance = CommandDispatcher() |
| instance._commands = {} |
| instance._register_default_commands() |
| return instance |
|
|
| def test_dispatcher_singleton(dispatcher): |
| """Testa se o CommandDispatcher segue o padrão singleton.""" |
| instance1 = dispatcher |
| instance2 = CommandDispatcher() |
| assert instance1 is instance2 |
|
|
| def test_register_command(dispatcher): |
| """Testa o registro de um novo comando.""" |
| assert "test:sync" not in dispatcher.list_commands() |
| dispatcher.register("test:sync", sync_handler) |
| assert "test:sync" in dispatcher.list_commands() |
|
|
| def test_register_overwrite_warning(dispatcher, caplog): |
| """Testa se um aviso é emitido ao sobrescrever um comando.""" |
| dispatcher.register("test:overwrite", sync_handler) |
| with caplog.at_level("WARNING"): |
| dispatcher.register("test:overwrite", async_handler) |
| assert "está sendo sobrescrito" in caplog.text |
|
|
| @pytest.mark.asyncio |
| async def test_dispatch_async_with_async_handler(dispatcher): |
| """Testa a execução assíncrona de um handler assíncrono.""" |
| dispatcher.register("test:async", async_handler) |
| result = await dispatcher.dispatch_async("test:async", "hello", kwarg1="world") |
| assert result == "async: hello, world" |
|
|
| @pytest.mark.asyncio |
| async def test_dispatch_async_with_sync_handler(dispatcher): |
| """Testa a execução assíncrona de um handler síncrono (via executor).""" |
| dispatcher.register("test:sync", sync_handler) |
| result = await dispatcher.dispatch_async("test:sync", "hello", kwarg1="world") |
| assert result == "sync: hello, world" |
|
|
| def test_dispatch_sync_with_sync_handler(dispatcher): |
| """Testa a execução síncrona de um handler síncrono.""" |
| dispatcher.register("test:sync", sync_handler) |
| result = dispatcher.dispatch_sync("test:sync", "hello", kwarg1="world") |
| assert result == "sync: hello, world" |
|
|
| def test_dispatch_sync_with_async_handler_raises_error(dispatcher): |
| """Testa se a execução síncrona de um handler assíncrono levanta um TypeError.""" |
| dispatcher.register("test:async", async_handler) |
| with pytest.raises(TypeError, match="Não é possível executar o comando assíncrono"): |
| dispatcher.dispatch_sync("test:async", "hello") |
|
|
| @pytest.mark.asyncio |
| async def test_dispatch_unknown_command_raises_error(dispatcher): |
| """Testa se a tentativa de despachar um comando desconhecido levanta KeyError.""" |
| with pytest.raises(KeyError, match="não está registrado"): |
| await dispatcher.dispatch_async("test:nonexistent") |
|
|
| with pytest.raises(KeyError, match="não está registrado"): |
| dispatcher.dispatch_sync("test:nonexistent") |
|
|
| def test_list_commands(dispatcher): |
| """Testa a listagem de comandos registrados.""" |
| dispatcher.register("cmd:b", sync_handler) |
| dispatcher.register("cmd:a", async_handler) |
| |
| commands = dispatcher.list_commands() |
| assert isinstance(commands, list) |
| assert "cmd:a" in commands |
| assert "cmd:b" in commands |
| assert "system:health_check" in commands |
| assert commands == sorted(commands) |
|
|