@@ -323,6 +323,49 @@ def test_android_integration_uses_full_aosp_without_gms(self) -> None:
323323 android ,
324324 )
325325
326+ def test_android_blockly_smoke_reveals_ime_occluded_action (self ) -> None :
327+ suite = (
328+ REPO_ROOT / "app" / "integration_test" / "blockly_webview_suite.dart"
329+ ).read_text (encoding = "utf-8" )
330+
331+ enter_gpio = suite .index (
332+ "await tester.enterText("
333+ "find.widgetWithText(TextField, 'LED GPIO'), '17');"
334+ )
335+ required_snippets = (
336+ "final Finder replaceWorkspaceAction = find.byKey(" ,
337+ "kBlocksExampleReplaceWorkspaceButtonKey" ,
338+ "await tester.ensureVisible(replaceWorkspaceAction);" ,
339+ "expect(replaceWorkspaceAction.hitTestable(), findsOneWidget);" ,
340+ "await tester.tap(replaceWorkspaceAction);" ,
341+ )
342+ for snippet in required_snippets :
343+ self .assertTrue (
344+ snippet in suite ,
345+ f"missing Android Blockly interaction contract: { snippet } " ,
346+ )
347+
348+ define_action = suite .index (required_snippets [0 ], enter_gpio )
349+ action_key = suite .index (required_snippets [1 ], define_action )
350+ reveal_action = suite .index (
351+ required_snippets [2 ],
352+ action_key ,
353+ )
354+ hit_test = suite .index (
355+ required_snippets [3 ],
356+ reveal_action ,
357+ )
358+ tap_action = suite .index (
359+ required_snippets [4 ],
360+ hit_test ,
361+ )
362+
363+ self .assertLess (enter_gpio , define_action )
364+ self .assertLess (define_action , action_key )
365+ self .assertLess (action_key , reveal_action )
366+ self .assertLess (reveal_action , hit_test )
367+ self .assertLess (hit_test , tap_action )
368+
326369 def test_workflow_has_no_adjacent_duplicate_shell_key (self ) -> None :
327370 workflow = (REPO_ROOT / ".github" / "workflows" / "ci.yml" ).read_text (
328371 encoding = "utf-8"
0 commit comments