File size: 3,336 Bytes
ff2a0f1 6ba5297 ff2a0f1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import asyncio,json,os
from datetime import datetime,timezone
from urllib.parse import parse_qs,urlparse
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser=await p.chromium.launch(headless=True,executable_path=os.environ.get('CHROMIUM_EXECUTABLE','/opt/pw-browsers/chromium-1234/chrome-linux64/chrome'),args=['--no-sandbox'])
page=await browser.new_page(viewport={'width':1440,'height':1000})
errors=[];calls=[]
page.on('pageerror',lambda e:errors.append(str(e)))
await page.clock.set_fixed_time(datetime(2026,9,6,20,tzinfo=timezone.utc))
await page.add_init_script("localStorage.setItem('sidereal-site',JSON.stringify({name:'Bern',lat:46.948,lon:7.4474,elevation:540}))")
async def route(r):
calls.append(r.request.url);n=len(calls)
if n==1:
await r.fulfill(status=503,json={'detail':'Gaia archive temporarily unavailable.'});return
params={k:float(v[0]) for k,v in parse_qs(urlparse(r.request.url).query).items()}
sid='111' if n==2 else '222'
star={'id':'gaia'+sid,'gaiaId':sid,'hip':'','name':'Gaia DR3 '+sid,'named':False,'source':'Gaia DR3','band':'G','epoch':2016,'ra':params['ra']/15,'dec':params['dec'],'mag':13.2,'dist':None,'spec':'','con':'','lum':None,'ci':None,'pmra':None,'pmdec':None,'x':0,'y':0,'z':0}
if n==2:await asyncio.sleep(2)
try:await r.fulfill(json={**params,'stars':[star],'truncated':False})
except Exception:pass # Aborted stale browser requests must not update the current field.
await page.route('**/api/stars/deep?*',route)
await page.goto(os.environ.get('SIDEREAL_TEST_URL','http://127.0.0.1:7866'),wait_until='networkidle')
slider=page.get_by_label('Faintest displayed star magnitude')
await slider.fill('14')
await page.get_by_role('button',name='ZOOM FOR FAINT STARS',exact=False).click()
await page.get_by_role('button',name='RETRY GAIA',exact=False).wait_for()
await page.get_by_role('button',name='RETRY GAIA',exact=False).click()
while len(calls)<2:await asyncio.sleep(.1)
await page.get_by_label('Observing date and time in Europe/Zurich').fill('2026-09-06T10:00')
await page.wait_for_function("document.querySelector('.deep-star-status')?.textContent.includes('Gaia field loaded')")
await asyncio.sleep(2.2)
await page.get_by_label('Search sky objects').fill('Gaia DR3 222')
assert await page.locator('.search-results button').count()==1
await page.get_by_label('Search sky objects').fill('Gaia DR3 111')
assert await page.get_by_text('No match in this catalogue.',exact=True).is_visible()
await page.get_by_label('Search sky objects').fill('')
before=len(calls)
await page.locator('.layer-row').first.get_by_role('checkbox').uncheck()
assert await slider.is_disabled()
await page.locator('.layer-row').first.get_by_role('checkbox').check()
await page.wait_for_function("document.querySelector('.deep-star-status')?.textContent.includes('Gaia field loaded')")
assert len(calls)==before,'Stars toggle should reuse cached field'
await slider.fill('7.5')
assert await page.locator('.deep-star-status').count()==0
assert not errors,errors
print('PASSED: explicit Gaia error, retry, stale-response cancellation after time change, layer toggle cache reuse, bright-only fallback, no browser errors.')
await browser.close()
asyncio.run(main())
|