mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-10-29 01:02:25 +01:00
refactor(email): move emailLibrary.js into static/js/emailLibrary/
The email library was 11,375 lines in one file, the second-largest JS module in the repo. `static/js/emailLibrary/` already held four extracted helpers, so the package existed; the bulk of the code just was not in it. The implementation moves to `emailLibrary/index.js` and the old path becomes a re-export wrapper. Five call sites import that path, four of them dynamically with a `?v=` string, and `sw.js` caches URLs verbatim, so a wrapper is what makes the move need no coordinated edit to any of them. The test side is the part worth reviewing. 58 tests read `static/js/emailLibrary.js` as text. Pointing them at `emailLibrary/index.js` would buy one move and break again on the next one, which is exactly what happened to the stylesheet tests (they now go through `tests/helpers/stylesheets.py`). So the same shape: `tests/helpers/js_modules.py` reads the whole package, and assertions stop caring which module a function sits in. `tests/test_email_library_module_graph_js.py` is new. This frontend has no module-graph validation, and a package fails in ways a single file cannot: a wrapper that drops an export is `undefined` at call time rather than an error at load time, and a module that reads a `const` across an import cycle throws only when that module is entered first. It pins the wrapper's surface against the entry module's, evaluates every module on its own in a browser, and requires both import paths to hand out one instance. It also caught a live gap while being written: `emailLibrary/replyRecipients.js` is imported by `emailInbox.js`, an app shell module, and was never in the `sw.js` precache.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import sqlite3
|
||||
from email.message import EmailMessage
|
||||
from tests.helpers.js_modules import email_library_source
|
||||
|
||||
|
||||
def test_attachment_filename_is_part_of_ui_index_search(tmp_path, monkeypatch):
|
||||
@@ -89,7 +90,7 @@ def test_forwarding_filters_signature_assets_and_mobile_export_stops_bubbling():
|
||||
|
||||
|
||||
def test_attachment_open_spins_icon_only():
|
||||
library = open("static/js/emailLibrary.js", encoding="utf-8").read()
|
||||
library = email_library_source()
|
||||
start = library.index("reader.querySelectorAll('.email-attachment-open')")
|
||||
end = library.index("reader.querySelectorAll('.email-attachment-download')", start)
|
||||
handler = library[start:end]
|
||||
@@ -109,7 +110,7 @@ def test_move_document_creates_destination_before_adopting_it():
|
||||
|
||||
|
||||
def test_deferred_attachment_check_shows_feedback_and_repairs_stale_card_icon():
|
||||
library = open("static/js/emailLibrary.js", encoding="utf-8").read()
|
||||
library = email_library_source()
|
||||
start = library.index("function _loadDeferredAttachmentsIntoReader")
|
||||
end = library.index('\n// "Open in new tab"', start)
|
||||
loader = library[start:end]
|
||||
@@ -159,7 +160,7 @@ def test_attachment_cache_backfill_preserves_message_id(tmp_path, monkeypatch):
|
||||
|
||||
|
||||
def test_single_email_tag_has_no_more_control():
|
||||
library = open("static/js/emailLibrary.js", encoding="utf-8").read()
|
||||
library = email_library_source()
|
||||
group = library[library.index("function _emailTagGroupHtml("):library.index("function _fitEmailCardTags(")]
|
||||
assert "if (visible.length === 1) return visible[0];" in group
|
||||
assert "if (visible.length === 2) return visible.join('');" in group
|
||||
@@ -167,7 +168,7 @@ def test_single_email_tag_has_no_more_control():
|
||||
|
||||
|
||||
def test_email_folder_and_filter_pickers_treat_their_buttons_as_inside_clicks():
|
||||
library = open("static/js/emailLibrary.js", encoding="utf-8").read()
|
||||
library = email_library_source()
|
||||
|
||||
assert library.count(
|
||||
"bindMenuDismiss(menu, finishClose, e => !picker.contains(e.target))"
|
||||
@@ -177,7 +178,7 @@ def test_email_folder_and_filter_pickers_treat_their_buttons_as_inside_clicks():
|
||||
|
||||
def test_empty_reply_has_two_editable_rows_and_reply_survives_compact_toolbar():
|
||||
inbox = open("static/js/emailInbox.js", encoding="utf-8").read()
|
||||
library = open("static/js/emailLibrary.js", encoding="utf-8").read()
|
||||
library = email_library_source()
|
||||
|
||||
assert "<p><br></p><p><br></p>\\n" in inbox
|
||||
fit_start = library.index("function _fitReaderActions")
|
||||
|
||||
Reference in New Issue
Block a user