') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); test(e2e): skip anonymous-state tests when the server runs locally by sspickle · Pull Request #207 · vpython/glowscript · GitHub
Skip to content

test(e2e): skip anonymous-state tests when the server runs locally - #207

Merged
sspickle merged 1 commit into
masterfrom
fix/e2e-local-auth-skips
Aug 23, 2026
Merged

test(e2e): skip anonymous-state tests when the server runs locally#207
sspickle merged 1 commit into
masterfrom
fix/e2e-local-auth-skips

Conversation

@sspickle

Copy link
Copy Markdown
Collaborator

Three e2e tests fail against a local server, and cannot pass there.

ide/auth.py short-circuits identity when running locally:

defget_user_info():
ifroutes.is_running_locally():
return {'email': 'localuser@local.host'}

So a local server has no anonymous state — every request is that user. The three failures all follow from it:

testsymptomwhy
test_home_page_sign_in_linka.signin hiddenyou are signed in
test_api_login_unauthenticatednew_usernot_logged_inauthenticated, but no User record
test_docs_help_link_from_ideclick intercepted by ui-widget-overlaythe new-user dialog sits over the page

They now skip in local mode and still run against a deployed URL, where the assertions are meaningful. /api/login is the tell.

⚠️Not verified by me — I have no local glowscript server. Expect 21 passed, 3 skipped against http://localhost:8080.

Follow-up: the local-auth short-circuit is itself worth replacing with an auth emulator, so these paths can be exercised locally rather than skipped. The same hack exists in webvpython/flaskHost/src/auth.py:73.

ide/auth.py short-circuits identity for local servers:
def get_user_info():
if routes.is_running_locally():
return {'email': 'localuser@local.host'}
so a local server has NO anonymous state — every request is that user. Three
tests assert anonymous behaviour and therefore cannot pass locally:
test_home_page_sign_in_link a.signin is hidden (you are signed in)
test_api_login_unauthenticated /api/login returns new_user, not not_logged_in
test_docs_help_link_from_ide a jQuery-UI overlay (the new-user dialog)
intercepts the click
They now skip in that situation and still run against a deployed URL, where the
assertions mean something. /api/login is the tell: locally it reports new_user
for localuser@local.host, which has no User record.
This makes the local run honest rather than green-by-deletion; the underlying
hack is worth removing separately (see follow-up branch) so these paths can be
tested locally against an auth emulator instead of being skipped.
NOT VERIFIED BY ME — I have no local glowscript server. Expect 21 passed,
3 skipped against http://localhost:8080.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G7y9rTA1r8r8EhEnPSQenR
@sspickle
sspickle merged commit 744de98 into masterAug 23, 2026
@sspickle
sspickle deleted the fix/e2e-local-auth-skips branch August 23, 2026 22:29
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@sspickle