blob: b1c1b028fea0d55057a5f2ead62c45f844504830 [file] [log] [blame]
// 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.
import 'dart:async';
import 'package:flutter_test/flutter_test.dart';
import 'package:google_identity_services_web/id.dart' as id;
import 'package:google_identity_services_web/src/js_interop/dom.dart';
import 'package:integration_test/integration_test.dart';
import 'package:js/js.dart';
import 'package:js/js_util.dart';
@JS('window')
external Object get domWindow;
void main() async {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
setUpAll(() async {
// Load web/mock-gis.js in the page
await installGisMock();
});
group('prompt', () {
testWidgets('supports a moment notification callback', (_) async {
id.initialize(id.IdConfiguration(client_id: 'testing_1-2-3'));
final StreamController<id.PromptMomentNotification> controller =
StreamController<id.PromptMomentNotification>();
id.prompt(allowInterop(controller.add));
final id.PromptMomentNotification moment = await controller.stream.first;
// These defaults are set in mock-gis.js
expect(moment.getMomentType(), id.MomentType.skipped);
expect(moment.getSkippedReason(), id.MomentSkippedReason.user_cancel);
});
testWidgets('calls config callback with credential response', (_) async {
const String expected = 'should_be_a_proper_jwt_token';
setMockCredentialResponse(expected);
final StreamController<id.CredentialResponse> controller =
StreamController<id.CredentialResponse>();
id.initialize(id.IdConfiguration(
client_id: 'testing_1-2-3',
callback: allowInterop(controller.add),
));
id.prompt();
final id.CredentialResponse response = await controller.stream.first;
expect(response.credential, expected);
});
});
}
/// Installs mock-gis.js in the page.
/// Returns a future that completes when the 'load' event of the script fires.
Future<void> installGisMock() {
final Completer<void> completer = Completer<void>();
final DomHtmlScriptElement script =
document.createElement('script') as DomHtmlScriptElement;
script.src = 'mock-gis.js';
setProperty(script, 'type', 'module');
callMethod(script, 'addEventListener', <Object>[
'load',
allowInterop((_) {
completer.complete();
})
]);
document.head.appendChild(script);
return completer.future;
}
void setMockCredentialResponse([String value = 'default_value']) {
callMethod(
_getGoogleAccountsId(),
'setMockCredentialResponse',
<Object>[value, 'auto'],
);
}
Object _getGoogleAccountsId() {
return _getDeepProperty<Object>(domWindow, 'google.accounts.id');
}
// Attempts to retrieve a deeply nested property from a jsObject (or die tryin')
T _getDeepProperty<T>(Object jsObject, String deepProperty) {
final List<String> properties = deepProperty.split('.');
return properties.fold(
jsObject,
(Object jsObj, String prop) => getProperty<Object>(jsObj, prop),
) as T;
}