@@ -49,4 +49,92 @@ test.describe('OpenPet browser preview', () => {
4949 await hitTarget . click ( { button : 'right' } ) ;
5050 await expect ( page . getByRole ( 'menuitem' , { name : 'Pause walking' } ) ) . toBeVisible ( ) ;
5151 } ) ;
52+
53+ test ( 'mocked Tauri pet drag starts only after movement threshold' , async ( { page } ) => {
54+ await page . addInitScript ( ( ) => {
55+ const calls : Array < { cmd : string ; args ?: unknown } > = [ ] ;
56+ let nextCallbackId = 1 ;
57+
58+ Object . defineProperty ( window , '__openPetTauriCalls' , {
59+ configurable : true ,
60+ value : calls ,
61+ } ) ;
62+
63+ Object . defineProperty ( window , '__TAURI_EVENT_PLUGIN_INTERNALS__' , {
64+ configurable : true ,
65+ value : {
66+ unregisterListener : ( ) => { } ,
67+ } ,
68+ } ) ;
69+
70+ Object . defineProperty ( window , '__TAURI_INTERNALS__' , {
71+ configurable : true ,
72+ value : {
73+ callbacks : { } ,
74+ convertFileSrc : ( filePath : string ) => filePath ,
75+ invoke : async ( cmd : string , args ?: unknown ) => {
76+ calls . push ( { cmd, args } ) ;
77+
78+ if ( cmd === 'plugin:event|listen' ) return nextCallbackId ++ ;
79+ if ( cmd === 'plugin:event|unlisten' ) return null ;
80+ if ( cmd === 'plugin:window|available_monitors' ) return [ ] ;
81+ if ( cmd === 'plugin:window|current_monitor' ) return null ;
82+ if ( cmd === 'plugin:window|primary_monitor' ) return null ;
83+ if ( cmd === 'plugin:window|cursor_position' ) return { x : 0 , y : 0 } ;
84+ if ( cmd === 'plugin:window|inner_position' ) return { x : 0 , y : 0 } ;
85+ if ( cmd === 'plugin:window|scale_factor' ) return 1 ;
86+ if ( cmd === 'plugin:window|set_ignore_cursor_events' ) return null ;
87+ if ( cmd === 'plugin:window|set_position' ) return null ;
88+ if ( cmd === 'plugin:window|set_size' ) return null ;
89+ if ( cmd === 'plugin:window|start_dragging' ) return null ;
90+
91+ throw new Error ( `Unhandled mocked Tauri command: ${ cmd } ` ) ;
92+ } ,
93+ metadata : {
94+ currentWebview : { label : 'pet' } ,
95+ currentWindow : { label : 'pet' } ,
96+ } ,
97+ transformCallback : ( ) => nextCallbackId ++ ,
98+ unregisterCallback : ( ) => { } ,
99+ } ,
100+ } ) ;
101+ } ) ;
102+ await page . goto ( '/?window=pet' ) ;
103+
104+ const hitTarget = page . getByTestId ( 'pet-hit-target' ) ;
105+ await expect ( hitTarget ) . toBeVisible ( ) ;
106+
107+ await hitTarget . click ( ) ;
108+ await expect
109+ . poll ( ( ) =>
110+ page . evaluate (
111+ ( ) =>
112+ ( window as typeof window & { __openPetTauriCalls : Array < { cmd : string } > } )
113+ . __openPetTauriCalls . filter ( ( call ) => call . cmd === 'plugin:window|start_dragging' )
114+ . length ,
115+ ) ,
116+ )
117+ . toBe ( 0 ) ;
118+
119+ const box = await hitTarget . boundingBox ( ) ;
120+ expect ( box ) . not . toBeNull ( ) ;
121+ const x = box ! . x + box ! . width / 2 ;
122+ const y = box ! . y + box ! . height / 2 ;
123+
124+ await page . mouse . move ( x , y ) ;
125+ await page . mouse . down ( ) ;
126+ await page . mouse . move ( x + 12 , y ) ;
127+ await page . mouse . up ( ) ;
128+
129+ await expect
130+ . poll ( ( ) =>
131+ page . evaluate (
132+ ( ) =>
133+ ( window as typeof window & { __openPetTauriCalls : Array < { cmd : string } > } )
134+ . __openPetTauriCalls . filter ( ( call ) => call . cmd === 'plugin:window|start_dragging' )
135+ . length ,
136+ ) ,
137+ )
138+ . toBeGreaterThan ( 0 ) ;
139+ } ) ;
52140} ) ;
0 commit comments