// Copyright 2013 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.

// This file is a copy of `gapi_load_test.dart`, before it was migrated to the
// new `initWithParams` method, and is kept to ensure test coverage of the
// deprecated `init` method, until it is removed.

import 'dart:html' as html;

import 'package:flutter_test/flutter_test.dart';
import 'package:google_sign_in_platform_interface/google_sign_in_platform_interface.dart';
import 'package:google_sign_in_web/google_sign_in_web.dart';
import 'package:integration_test/integration_test.dart';

import 'gapi_mocks/gapi_mocks.dart' as gapi_mocks;
import 'src/test_utils.dart';

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  gapiUrl = toBase64Url(gapi_mocks.auth2InitSuccess(
      GoogleSignInUserData(email: 'test@test.com', id: '1234')));

  testWidgets('Plugin is initialized after GAPI fully loads and init is called',
      (WidgetTester tester) async {
    expect(
      html.querySelector('script[src^="data:"]'),
      isNull,
      reason: 'Mock script not present before instantiating the plugin',
    );
    final GoogleSignInPlugin plugin = GoogleSignInPlugin();
    expect(
      html.querySelector('script[src^="data:"]'),
      isNotNull,
      reason: 'Mock script should be injected',
    );
    expect(() {
      plugin.initialized;
    }, throwsStateError,
        reason:
            'The plugin should throw if checking for `initialized` before calling .init');
    await plugin.init(hostedDomain: '', clientId: '');
    await plugin.initialized;
    expect(
      plugin.initialized,
      completes,
      reason: 'The plugin should complete the future once initialized.',
    );
  });
}
