feat(gui): Implement manual ticket queue management with priority, multi-select, and drag-drop reordering
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import pytest
|
||||
from unittest.mock import patch
|
||||
from src.models import Ticket
|
||||
|
||||
def test_ticket_priority_default():
|
||||
@@ -35,3 +36,74 @@ def test_ticket_from_dict_default_priority():
|
||||
}
|
||||
ticket = Ticket.from_dict(data)
|
||||
assert ticket.priority == "medium"
|
||||
|
||||
class TestBulkOperations:
|
||||
def test_bulk_execute(self, mock_app):
|
||||
mock_app.active_tickets = [
|
||||
{"id": "T1", "status": "todo"},
|
||||
{"id": "T2", "status": "todo"},
|
||||
{"id": "T3", "status": "todo"}
|
||||
]
|
||||
mock_app.ui_selected_tickets = {"T1", "T3"}
|
||||
|
||||
with patch.object(mock_app.controller, "_push_mma_state_update") as mock_push:
|
||||
mock_app.bulk_execute()
|
||||
assert mock_app.active_tickets[0]["status"] == "ready"
|
||||
assert mock_app.active_tickets[1]["status"] == "todo"
|
||||
assert mock_app.active_tickets[2]["status"] == "ready"
|
||||
mock_push.assert_called_once()
|
||||
|
||||
def test_bulk_skip(self, mock_app):
|
||||
mock_app.active_tickets = [
|
||||
{"id": "T1", "status": "todo"},
|
||||
{"id": "T2", "status": "todo"}
|
||||
]
|
||||
mock_app.ui_selected_tickets = {"T1"}
|
||||
|
||||
with patch.object(mock_app.controller, "_push_mma_state_update") as mock_push:
|
||||
mock_app.bulk_skip()
|
||||
assert mock_app.active_tickets[0]["status"] == "completed"
|
||||
assert mock_app.active_tickets[1]["status"] == "todo"
|
||||
mock_push.assert_called_once()
|
||||
|
||||
def test_bulk_block(self, mock_app):
|
||||
mock_app.active_tickets = [
|
||||
{"id": "T1", "status": "todo"},
|
||||
{"id": "T2", "status": "todo"}
|
||||
]
|
||||
mock_app.ui_selected_tickets = {"T1", "T2"}
|
||||
|
||||
with patch.object(mock_app.controller, "_push_mma_state_update") as mock_push:
|
||||
mock_app.bulk_block()
|
||||
assert mock_app.active_tickets[0]["status"] == "blocked"
|
||||
assert mock_app.active_tickets[1]["status"] == "blocked"
|
||||
mock_push.assert_called_once()
|
||||
|
||||
class TestReorder:
|
||||
def test_reorder_ticket_valid(self, mock_app):
|
||||
mock_app.active_tickets = [
|
||||
{"id": "T1", "depends_on": []},
|
||||
{"id": "T2", "depends_on": []},
|
||||
{"id": "T3", "depends_on": ["T1"]}
|
||||
]
|
||||
with patch.object(mock_app.controller, "_push_mma_state_update") as mock_push:
|
||||
# Move T1 to index 1: [T2, T1, T3]. T3 depends on T1. T1 index 1 < T3 index 2. VALID.
|
||||
mock_app._reorder_ticket(0, 1)
|
||||
assert mock_app.active_tickets[0]["id"] == "T2"
|
||||
assert mock_app.active_tickets[1]["id"] == "T1"
|
||||
assert mock_app.active_tickets[2]["id"] == "T3"
|
||||
mock_push.assert_called_once()
|
||||
|
||||
def test_reorder_ticket_invalid(self, mock_app):
|
||||
mock_app.active_tickets = [
|
||||
{"id": "T1", "depends_on": []},
|
||||
{"id": "T2", "depends_on": ["T1"]}
|
||||
]
|
||||
with patch.object(mock_app.controller, "_push_mma_state_update") as mock_push:
|
||||
# Move T1 after T2: [T2, T1]. T2 depends on T1, but T1 is now at index 1 while T2 is at index 0.
|
||||
# Violation: dependency T1 (index 1) is not before T2 (index 0).
|
||||
mock_app._reorder_ticket(0, 1)
|
||||
# Should NOT change
|
||||
assert mock_app.active_tickets[0]["id"] == "T1"
|
||||
assert mock_app.active_tickets[1]["id"] == "T2"
|
||||
mock_push.assert_not_called()
|
||||
|
||||
Reference in New Issue
Block a user