// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';
import 'package:webdriver/async_io.dart';

// TODO(web): Migrate this test to a normal integration_test with a WidgetTester.

/// The following test is used as a simple smoke test for verifying Flutter
/// Framework and Flutter Web Engine integration.
void main() {
  group('Hello World App', () {
    final SerializableFinder titleFinder = find.byValueKey('title');

    late FlutterDriver driver;

    // Connect to the Flutter driver before running any tests.
    setUpAll(() async {
      driver = await FlutterDriver.connect();
    });

    // Close the connection to the driver after the tests have completed.
    tearDownAll(() async {
      driver.close();
    });

    test('title is correct', () async {
      expect(await driver.getText(titleFinder), 'Hello, world!');
    });

    test('enable accessibility', () async {
      await driver.setSemantics(true);

      // TODO(ianh): this delay violates our style guide. We should instead wait for a triggering event.
      await Future<void>.delayed(const Duration(seconds: 2));

      final WebElement? fltSemantics = await driver.webDriver.execute(
        'return document.querySelector("flt-glass-pane")?.shadowRoot.querySelector("flt-semantics")',
        <dynamic>[],
      ) as WebElement?;
      expect(fltSemantics, isNotNull);
    });
  });
}
