@@ -1173,6 +1173,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
11731173 await page . goto ( `${ server . baseUrl } /tools/object-vector-studio-v2/index.html` , { waitUntil : "networkidle" } ) ;
11741174 await expect ( page . locator ( "body.tools-platform-tool-page[data-tool-id='object-vector-studio-v2']" ) ) . toBeVisible ( ) ;
11751175 await expect ( page . locator ( "[data-tool-starter-header]" ) ) . toContainText ( "Object Vector Studio V2" ) ;
1176+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K O b j e c t V e c t o r S t u d i o V 2 s c h e m a c o n t r a c t l o a d e d f r o m \/ t o o l s \/ s c h e m a s \/ t o o l s \/ o b j e c t - v e c t o r - s t u d i o - v 2 \. s c h e m a \. j s o n \. / ) ;
11761177 await expect ( page . locator ( '[data-launch-mode-nav="tool"]' ) ) . toBeVisible ( ) ;
11771178 await expect ( page . locator ( '[data-launch-mode-nav="tool"] button' ) ) . toHaveText ( [ "Import" , "Copy JSON" , "Export" ] ) ;
11781179 await expect ( page . locator ( '[data-launch-mode-nav="workspace"]' ) ) . toBeHidden ( ) ;
@@ -1210,6 +1211,21 @@ test.describe("Workspace Manager V2 bootstrap", () => {
12101211 await expect ( page . locator ( "#objectVectorStudioV2ObjectTiles" ) ) . toContainText ( "No objects loaded" ) ;
12111212 await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toHaveText ( "{}" ) ;
12121213
1214+ const unknownRootPayloadPath = testInfo . outputPath ( "object-vector-unknown-root.json" ) ;
1215+ await writeFile ( unknownRootPayloadPath , JSON . stringify ( {
1216+ palette : {
1217+ id : "arcade-primary" ,
1218+ swatches : [
1219+ { id : "white" , value : "#ffffff" }
1220+ ]
1221+ } ,
1222+ objects : [ ] ,
1223+ unexpected : true
1224+ } , null , 2 ) , "utf8" ) ;
1225+ await page . locator ( "#objectVectorStudioV2ImportJsonInput" ) . setInputFiles ( unknownRootPayloadPath ) ;
1226+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / F A I L O b j e c t V e c t o r S t u d i o V 2 s c h e m a v a l i d a t i o n f a i l e d f r o m i m p o r t : o b j e c t - v e c t o r - u n k n o w n - r o o t \. j s o n : r o o t \. u n e x p e c t e d i s n o t a l l o w e d \. / ) ;
1227+ await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toHaveText ( "{}" ) ;
1228+
12131229 const invalidShapePayloadPath = testInfo . outputPath ( "object-vector-invalid-shape.json" ) ;
12141230 await writeFile ( invalidShapePayloadPath , JSON . stringify ( {
12151231 palette : {
@@ -1238,7 +1254,7 @@ test.describe("Workspace Manager V2 bootstrap", () => {
12381254 ]
12391255 } , null , 2 ) , "utf8" ) ;
12401256 await page . locator ( "#objectVectorStudioV2ImportJsonInput" ) . setInputFiles ( invalidShapePayloadPath ) ;
1241- await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / F A I L O b j e c t V e c t o r S t u d i o V 2 s c h e m a v a l i d a t i o n f a i l e d f r o m i m p o r t : o b j e c t - v e c t o r - i n v a l i d - s h a p e \. j s o n : r o o t \. o b j e c t s \[ 0 \] \. s h a p e s \[ 0 \] \. t y p e m u s t b e o n e o f r e c t a n g l e , c i r c l e , e l l i p s e , l i n e , p o l y g o n , a r c , t e x t \. / ) ;
1257+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / F A I L O b j e c t V e c t o r S t u d i o V 2 s c h e m a v a l i d a t i o n f a i l e d f r o m i m p o r t : o b j e c t - v e c t o r - i n v a l i d - s h a p e \. j s o n : r o o t \. o b j e c t s \[ 0 \] \. s h a p e s \[ 0 \] m u s t m a t c h e x a c t l y o n e O b j e c t V e c t o r S t u d i o V 2 s h a p e s c h e m a \. / ) ;
12421258 await expect ( page . locator ( "#objectVectorStudioV2ObjectTiles" ) ) . toContainText ( "No objects loaded" ) ;
12431259 await expect ( page . locator ( "#objectVectorStudioV2JsonDetails" ) ) . toHaveText ( "{}" ) ;
12441260
@@ -1374,6 +1390,35 @@ test.describe("Workspace Manager V2 bootstrap", () => {
13741390 await expect ( page . locator ( "#objectVectorStudioV2RenderSurface" ) ) . toHaveAttribute ( "viewBox" , "0 0 320 220" ) ;
13751391 await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / O K V i e w p o r t r e s e t t o 1 0 0 % a t o r i g i n \. / ) ;
13761392
1393+ await page . evaluate ( ( ) => {
1394+ Object . defineProperty ( navigator , "clipboard" , {
1395+ configurable : true ,
1396+ value : {
1397+ async writeText ( text ) {
1398+ sessionStorage . setItem ( "object-vector-studio-v2.copied-json" , text ) ;
1399+ }
1400+ }
1401+ } ) ;
1402+ } ) ;
1403+ await page . locator ( "#objectVectorStudioV2CopyJsonButton" ) . click ( ) ;
1404+ const copiedPayload = await page . evaluate ( ( ) => JSON . parse ( sessionStorage . getItem ( "object-vector-studio-v2.copied-json" ) ) ) ;
1405+ expect ( copiedPayload . selection . selectedObjectId ) . toBe ( "object-1" ) ;
1406+ expect ( copiedPayload . selection . selectedShapeId ) . toBe ( "rectangle-1" ) ;
1407+ expect ( copiedPayload . viewport . zoom ) . toBe ( 1 ) ;
1408+ expect ( copiedPayload . export . format ) . toBe ( "json" ) ;
1409+ const copiedSchemaValidation = await page . evaluate ( ( payload ) => window . __objectVectorStudioV2App . schemaService . validatePayload ( payload ) , copiedPayload ) ;
1410+ expect ( copiedSchemaValidation ) . toEqual ( { errors : [ ] , ok : true , payload : copiedPayload } ) ;
1411+
1412+ const downloadPromise = page . waitForEvent ( "download" ) ;
1413+ await page . locator ( "#objectVectorStudioV2ExportJsonButton" ) . click ( ) ;
1414+ const download = await downloadPromise ;
1415+ const exportPath = testInfo . outputPath ( "object-vector-export.json" ) ;
1416+ await download . saveAs ( exportPath ) ;
1417+ const exportedPayload = JSON . parse ( await readFile ( exportPath , "utf8" ) ) ;
1418+ expect ( exportedPayload . selection . selectedShapeIds ) . toContain ( "rectangle-1" ) ;
1419+ const exportedSchemaValidation = await page . evaluate ( ( payload ) => window . __objectVectorStudioV2App . schemaService . validatePayload ( payload ) , exportedPayload ) ;
1420+ expect ( exportedSchemaValidation ) . toEqual ( { errors : [ ] , ok : true , payload : exportedPayload } ) ;
1421+
13771422 await page . locator ( '[data-object-id="object-2"]' ) . click ( ) ;
13781423 await expect ( page . locator ( '[data-object-id="object-2"]' ) ) . toHaveAttribute ( "aria-pressed" , "true" ) ;
13791424 await expect ( page . locator ( "#objectVectorStudioV2ObjectDetails" ) ) . toContainText ( "Object 2" ) ;
@@ -1465,6 +1510,14 @@ test.describe("Workspace Manager V2 bootstrap", () => {
14651510 expect ( fullscreenLayout . centerWidth ) . toBeGreaterThan ( 300 ) ;
14661511 expect ( fullscreenLayout . centerHeight ) . toBeGreaterThan ( 300 ) ;
14671512
1513+ await page . evaluate ( ( ) => {
1514+ sessionStorage . setItem ( "workspace.tools.object-vector-studio-v2" , JSON . stringify ( { objects : [ ] } ) ) ;
1515+ } ) ;
1516+ await page . goto ( `${ server . baseUrl } /tools/object-vector-studio-v2/index.html?launch=workspace&fromTool=workspace-manager-v2&hostContextId=object-vector-v2-missing-palette&workspaceMode=uat` , { waitUntil : "networkidle" } ) ;
1517+ await expect ( page . locator ( "#statusLog" ) ) . toHaveValue ( / F A I L O b j e c t V e c t o r S t u d i o V 2 s c h e m a v a l i d a t i o n f a i l e d f r o m w o r k s p a c e \. t o o l s \. o b j e c t - v e c t o r - s t u d i o - v 2 : r o o t \. p a l e t t e i s r e q u i r e d \. / ) ;
1518+ await page . evaluate ( ( ) => {
1519+ sessionStorage . removeItem ( "workspace.tools.object-vector-studio-v2" ) ;
1520+ } ) ;
14681521 await page . goto ( `${ server . baseUrl } /tools/object-vector-studio-v2/index.html?launch=workspace&fromTool=workspace-manager-v2&hostContextId=object-vector-v2-shell&workspaceMode=uat` , { waitUntil : "networkidle" } ) ;
14691522 await expect ( page . locator ( '[data-launch-mode-nav="tool"]' ) ) . toBeHidden ( ) ;
14701523 await expect ( page . locator ( '[data-launch-mode-nav="workspace"] button' ) ) . toHaveText ( [ "Return to Workspace" ] ) ;
0 commit comments