#!/usr/bin/env python3 """Comprueba perfiles abiertos e independientes en la instalación desechable mediante MCP.""" import json import os from urllib.parse import urlparse from pathlib import Path import runpy import unittest ROOT = Path(__file__).resolve().parent.parent BASE = runpy.run_path(str(ROOT / 'scripts/workplace-visual-map.test.py')) class ExpandedWorkstationProfilesTests(BASE['WorkplaceVisualMapTests']): @classmethod def setUpClass(cls): super().setUpClass() cls.output = cls.output.parents[1] / 'profiles-expanded' cls.output.mkdir(parents=True, exist_ok=True) evidence = cls.output / 'measurements.json' cls.evidence = json.loads(evidence.read_text()) if evidence.exists() else [] preview = os.environ.get('METIS_PROFILES_PREVIEW_ORIGIN') if preview: if urlparse(preview).hostname != 'localhost': raise RuntimeError('La preview debe pertenecer al entorno local desechable.') cls.origin = preview def test_all_profiles_and_independent_controls(self): self.tool('browser_resize', {'width':1440,'height':900}) self.map_ready(pending=True) self.code("await page.locator('[data-workstation-configurations]').nth(1).waitFor();return true;") values=self.code("const region=page.getByRole('region',{name:/^Personas y perfiles/});return {details:await region.locator('[data-workstation-configurations]').count(),open:await region.getByRole('button',{name:/Ocultar configuraciones de/}).count(),uniqueIds:await page.evaluate(()=>{const ids=[...document.querySelectorAll('[id]')].map(e=>e.id);return new Set(ids).size===ids.length}),targets:await region.getByRole('button',{name:/Ocultar configuraciones de/}).evaluateAll(buttons=>buttons.every(b=>document.getElementById(b.getAttribute('aria-controls'))))};") self.assertEqual(values['details'],2) self.assertEqual(values['open'],2) self.assertTrue(values['uniqueIds']) self.assertTrue(values['targets']) self.code("await page.getByRole('heading',{name:/^Personas y perfiles/}).scrollIntoViewIfNeeded();return true;") self.capture('all-profiles-open-1440') self.code("await page.getByRole('button',{name:'Ocultar configuraciones de Ángela · administración',exact:true}).click();return true;") self.assertEqual(self.code("return await page.locator('[data-workstation-configurations]').count();"),1) self.assertEqual(self.code("return await page.getByRole('button',{name:'Ocultar configuraciones de Íñigo · consultas de documentación',exact:true}).getAttribute('aria-expanded');"),'true') self.code("await page.getByRole('button',{name:'Mostrar configuraciones de Ángela · administración',exact:true}).press('Space');return true;") self.assertEqual(self.code("return await page.locator('[data-workstation-configurations]').count();"),2) first='[data-workstation-configurations='+json.dumps(self.fixture['primaryProfile'])+']' second='[data-workstation-configurations='+json.dumps(self.fixture['secondaryProfile'])+']' self.code("await page.locator("+json.dumps(first)+").getByRole('checkbox',{name:'Solo pendientes',exact:true}).check();return true;") self.assertFalse(self.code("return await page.locator("+json.dumps(second)+").getByRole('checkbox',{name:'Solo pendientes',exact:true}).isChecked();")) self.code("await page.getByRole('button',{name:'Ocultar configuraciones de Ángela · administración',exact:true}).click();await page.getByRole('button',{name:'Ver configuraciones pendientes',exact:true}).click();return true;") self.assertTrue(self.code("return await page.locator("+json.dumps(first)+").evaluate(e=>e===document.activeElement);")) self.assertTrue(self.code("return await page.locator("+json.dumps(second)+").isVisible();")) self.record('independent-controls',values) def test_complete_list_responsive(self): self.map_ready('dense',software=False) self.code("await page.locator('[data-workstation-configurations]').nth(49).waitFor();return true;") for width,height in [(1600,1000),(1440,900),(1280,900),(1024,768),(768,1024),(390,844)]: self.tool('browser_resize', {'width':width,'height':height}) self.code("await page.getByRole('heading',{name:/^Personas y perfiles/}).scrollIntoViewIfNeeded();return true;") values=self.code("return {width:await page.evaluate(()=>innerWidth),scrollWidth:await page.evaluate(()=>document.documentElement.scrollWidth),details:await page.locator('[data-workstation-configurations]').count(),open:await page.getByRole('button',{name:/Ocultar configuraciones de DASH-PROFILE/}).count()};") self.assertEqual(values['details'],50) self.assertEqual(values['open'],50) self.assertLessEqual(values['scrollWidth'],width) self.record('dense-'+str(width),values) self.capture('dense-profiles-'+str(width)) if __name__ == '__main__': unittest.main(defaultTest=['ExpandedWorkstationProfilesTests.test_all_profiles_and_independent_controls','ExpandedWorkstationProfilesTests.test_complete_list_responsive'])