8f4ae8ad31
Defer exchange chart generation to a background thread and save via XHR so fill-from-trade no longer blocks on full page reload. Co-authored-by: Cursor <cursoragent@cursor.com>
56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
from unittest import TestCase
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from lib.instance.journal_chart_async_lib import (
|
|
request_wants_journal_ajax,
|
|
schedule_journal_exchange_chart,
|
|
)
|
|
|
|
|
|
class _FakeHeaders(dict):
|
|
def get(self, key, default=None):
|
|
for k, v in self.items():
|
|
if str(k).lower() == str(key).lower():
|
|
return v
|
|
return default
|
|
|
|
|
|
class JournalChartAsyncLibTests(TestCase):
|
|
def test_request_wants_journal_ajax_xhr(self):
|
|
req = MagicMock()
|
|
req.headers = _FakeHeaders({"X-Requested-With": "XMLHttpRequest"})
|
|
req.form = {}
|
|
self.assertTrue(request_wants_journal_ajax(req))
|
|
|
|
def test_request_wants_journal_ajax_form(self):
|
|
req = MagicMock()
|
|
req.headers = _FakeHeaders({})
|
|
req.form = {"ajax": "1"}
|
|
self.assertTrue(request_wants_journal_ajax(req))
|
|
|
|
def test_request_wants_journal_ajax_plain(self):
|
|
req = MagicMock()
|
|
req.headers = _FakeHeaders({"Accept": "text/html"})
|
|
req.form = {}
|
|
self.assertFalse(request_wants_journal_ajax(req))
|
|
|
|
@patch("lib.instance.journal_chart_async_lib.threading.Thread")
|
|
def test_schedule_starts_daemon_thread(self, mock_thread_cls):
|
|
thread = MagicMock()
|
|
mock_thread_cls.return_value = thread
|
|
schedule_journal_exchange_chart(
|
|
entry_id="abc123",
|
|
exchange_symbol="BTC/USDT:USDT",
|
|
title_prefix="t",
|
|
journal_tfs=["5m", "15m"],
|
|
journal_limit=100,
|
|
marker_payload={},
|
|
upload_folder="/tmp",
|
|
generate_chart_fn=MagicMock(),
|
|
get_db_fn=MagicMock(),
|
|
)
|
|
mock_thread_cls.assert_called_once()
|
|
kwargs = mock_thread_cls.call_args.kwargs
|
|
self.assertTrue(kwargs.get("daemon"))
|
|
thread.start.assert_called_once()
|