54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
import pytest
|
|
from unittest.mock import patch, MagicMock
|
|
import asyncio
|
|
from gui_2 import App
|
|
|
|
@pytest.fixture
|
|
def app_instance():
|
|
with (
|
|
patch('gui_2.load_config', return_value={'ai': {}, 'projects': {}}),
|
|
patch('gui_2.save_config'),
|
|
patch('gui_2.project_manager'),
|
|
patch('gui_2.session_logger'),
|
|
patch('gui_2.immapp.run'),
|
|
patch.object(App, '_load_active_project'),
|
|
patch.object(App, '_fetch_models'),
|
|
patch.object(App, '_load_fonts'),
|
|
patch.object(App, '_post_init')
|
|
):
|
|
app = App()
|
|
app.active_tickets = []
|
|
app._loop = MagicMock()
|
|
yield app
|
|
|
|
def test_cb_ticket_retry(app_instance):
|
|
ticket_id = "test_ticket_1"
|
|
app_instance.active_tickets = [{"id": ticket_id, "status": "failed"}]
|
|
|
|
with patch('asyncio.run_coroutine_threadsafe') as mock_run_safe:
|
|
app_instance._cb_ticket_retry(ticket_id)
|
|
|
|
# Verify status update
|
|
assert app_instance.active_tickets[0]['status'] == 'todo'
|
|
|
|
# Verify event pushed
|
|
mock_run_safe.assert_called_once()
|
|
# First arg is the coroutine (event_queue.put), second is self._loop
|
|
args, _ = mock_run_safe.call_args
|
|
assert args[1] == app_instance._loop
|
|
|
|
def test_cb_ticket_skip(app_instance):
|
|
ticket_id = "test_ticket_1"
|
|
app_instance.active_tickets = [{"id": ticket_id, "status": "todo"}]
|
|
|
|
with patch('asyncio.run_coroutine_threadsafe') as mock_run_safe:
|
|
app_instance._cb_ticket_skip(ticket_id)
|
|
|
|
# Verify status update
|
|
assert app_instance.active_tickets[0]['status'] == 'skipped'
|
|
|
|
# Verify event pushed
|
|
mock_run_safe.assert_called_once()
|
|
args, _ = mock_run_safe.call_args
|
|
assert args[1] == app_instance._loop
|