Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/live_mem/static/js/bank.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ function renderBankTabs() {

async function selectBank(filename) {
app.currentBankFile = filename;
const requestedSpaceId = app.spaceId;
const requestedFilename = filename;

// Mettre à jour les onglets actifs
document.querySelectorAll('.bank-tab').forEach(t => {
Expand All @@ -52,14 +54,16 @@ async function selectBank(filename) {
el.innerHTML = '<div class="empty-state">Loading…</div>';

try {
const r = await apiLoadBankFile(app.spaceId, filename);
const r = await apiLoadBankFile(requestedSpaceId, requestedFilename);
if (app.spaceId !== requestedSpaceId || app.currentBankFile !== requestedFilename) return;
if (r.status === 'ok' && r.content) {
el.innerHTML = `<div class="md-content">${md(r.content)}</div>`;
} else {
el.innerHTML = `<div class="empty-state">❌ ${esc(r.message||'Error')}</div>`;
}
} catch (e) {
if (e.message !== 'Unauthorized') {
if (app.spaceId !== requestedSpaceId || app.currentBankFile !== requestedFilename) return;
el.innerHTML = `<div class="empty-state">❌ ${esc(e.message)}</div>`;
}
}
Expand Down
33 changes: 33 additions & 0 deletions tests/test_live_ui_bank_race_guard.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from pathlib import Path
import re


ROOT = Path(__file__).resolve().parents[1]
BANK_JS = ROOT / "src" / "live_mem" / "static" / "js" / "bank.js"


def _select_bank_body() -> str:
source = BANK_JS.read_text()
match = re.search(r"async function selectBank\(filename\) \{(?P<body>.*?)\n\}", source, re.S)
assert match, "selectBank(filename) not found in bank.js"
return match.group("body")


def test_select_bank_uses_captured_space_and_filename_for_load():
body = _select_bank_body()

assert "const requestedSpaceId = app.spaceId;" in body
assert "const requestedFilename = filename;" in body
assert "apiLoadBankFile(requestedSpaceId, requestedFilename)" in body


def test_select_bank_drops_stale_responses_before_rendering():
body = _select_bank_body()
stale_guard = (
"app.spaceId !== requestedSpaceId "
"|| app.currentBankFile !== requestedFilename"
)

assert stale_guard in body
assert body.index(stale_guard) < body.index('el.innerHTML = `<div class="md-content">')
assert body.rindex(stale_guard) < body.rindex('el.innerHTML = `<div class="empty-state">❌')