VulpesOS/tools/test-gaia-dialogs.py
OverSu 1311bed5e9 Release Preview 20 shared desktop, Android and Sargo updates
Restore Gaia settings and media workflows, extend native network adapters, and align the APK payload. Generate French/English changelogs and website entries from the simplified JSON source.

Validation: shared JS and Tundra unit tests; desktop workflows and persistence; signed APK payload parity; Sargo RAM and installed startup with boot readback. Android runtime qualification is recorded separately.
2026-10-13 00:19:45 +02:00

50 lines
3.6 KiB
Python

#!/usr/bin/env python3
"""Regression: visible Gaia errors and retained MMS composer, without real sends."""
import importlib.util,json,time
from marionette_client import Client
spec=importlib.util.spec_from_file_location('probe','tools/probe-desktop.py')
p=importlib.util.module_from_spec(spec);spec.loader.exec_module(p)
with Client(2857) as c:
p.register(c)
def ev(app,code):
result=p.evaluate(c,app,code,"/dialer/" if app=="communications" else "/")
assert 'value' in result,result
return result['value']
def wait(app,code):
for _ in range(100):
if p.evaluate(c,app,code,"/dialer/" if app=="communications" else "/").get('value'):return
time.sleep(.1)
raise AssertionError(code)
def visible(app,selector):
return ev(app,'''const f=document.querySelector(SELECTOR),s=f.querySelector('section'),m=f.querySelector('menu');
const r=s.getBoundingClientRect(),b=m.getBoundingClientRect(),v=f.getBoundingClientRect();
return {text:s.innerText,visible:r.top>=v.top && r.bottom<=b.top && r.right<=v.right && r.height>0,
section:r.toJSON(),menu:b.toJSON()};'''.replace('SELECTOR',json.dumps(selector)))
wait('system',"return document.body?.getAttribute('ready-state')==='fullyLoaded';")
ev('system','ScreenManager.turnScreenOn(true);if(Service.query("locked"))await Service.request("unlock",{forcibly:true});await VulpesCompat.call("apps.launch",{manifestURL:"http://communications.localhost:8765/manifest.webapp",entryPoint:"dialer"});return true;')
wait('communications','return !!window.CallHandler;')
time.sleep(1.5)
ev('communications','await new Promise(r=>LazyLoader.load("/shared/js/dialer/telephony_messages.js",r));TelephonyMessages.displayMessage("NoNetwork");return true;')
time.sleep(.5)
result=visible('communications','#confirmation-message');assert result['visible'] and result['text'],result
print('PASS: original Gaia network-error text stays above its buttons.',flush=True)
ev('communications','ConfirmDialog.hide();return true;')
ev('system','await VulpesCompat.call("apps.launch",{manifestURL:"http://sms.localhost:8765/manifest.webapp"});return true;')
wait('sms','return !!window.ConversationView && !!window.Compose;')
time.sleep(1.5)
ev('sms','''await Navigation.toPanel('thread-list');await Navigation.toPanel('composer');Compose.clear();ConversationView.recipients.length=0;
ConversationView.recipients.add({name:'5550199',number:'5550199',source:'manual'});Compose.append('MMS draft regression');
const canvas=document.createElement('canvas');canvas.width=16;canvas.height=16;canvas.getContext('2d').fillRect(0,0,16,16);
const blob=await new Promise(r=>canvas.toBlob(r,'image/png'));
Compose.append(new Attachment(blob,{name:'regression.png',isDraft:true}));return true;''')
wait('sms','return Compose.type==="mms";')
for lang in ['fr','en-US']:
ev('sms',f'document.documentElement.lang={json.dumps(lang)};document.getElementById("messages-send-button").click();return true;')
time.sleep(.3)
result=visible('sms','#vulpes-gaia-notice');assert result['visible'] and 'MMS' in result['text'],result
assert ('pas encore disponible' if lang=='fr' else 'not yet available') in result['text'],result
ev('sms','document.querySelector("#vulpes-gaia-notice button").click();return true;')
assert ev('sms','return Compose.type==="mms" && Compose.getText()==="MMS draft regression" && Compose.getContent().some(i=>i instanceof Attachment) && Navigation.isCurrentPanel("composer");')
print('PASS: French/English MMS notice visible; text, attachment and composer retained.',flush=True)
ev('sms','Compose.clear();ConversationView.recipients.length=0;return true;')
ev('system','dispatchEvent(new Event("home"));return true;')