blob: f2b162d7ee1b48398166a8348e4b3da8c52cf350 [file] [log] [blame]
// Copyright 2023 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd.
import 'package:devtools_extensions/api.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('$DevToolsExtensionEvent', () {
test('parse', () {
var event = DevToolsExtensionEvent.parse({
'type': 'ping',
'data': {'foo': 'bar'},
});
expect(event.type, DevToolsExtensionEventType.ping);
expect(event.data, {'foo': 'bar'});
event = DevToolsExtensionEvent.parse({
'type': 'pong',
'data': {'baz': 'bob'},
});
expect(event.type, DevToolsExtensionEventType.pong);
expect(event.data, {'baz': 'bob'});
event = DevToolsExtensionEvent.parse({
'type': 'idk',
});
expect(event.type, DevToolsExtensionEventType.unknown);
expect(event.data, isNull);
});
test('tryParse', () {
var event = DevToolsExtensionEvent.tryParse({
'type': 'ping',
'data': {'foo': 'bar'},
});
expect(event, isNotNull);
event = DevToolsExtensionEvent.tryParse('bad input');
expect(event, isNull);
event = DevToolsExtensionEvent.tryParse({'more', 'bad', 'input'});
expect(event, isNull);
event = DevToolsExtensionEvent.tryParse({1: 'bad', 2: 'input'});
expect(event, isNull);
});
test('toJson', () {
var event = DevToolsExtensionEvent(DevToolsExtensionEventType.ping);
expect(event.toJson(), {'type': 'ping'});
event = DevToolsExtensionEvent(
DevToolsExtensionEventType.pong,
data: {'foo': 'bar'},
);
expect(event.toJson(), {
'type': 'pong',
'data': {'foo': 'bar'},
});
event = DevToolsExtensionEvent(
DevToolsExtensionEventType.unknown,
data: {'foo': 'bar'},
);
expect(event.toJson(), {
'type': 'unknown',
'data': {'foo': 'bar'},
});
});
});
group('$DevToolsExtensionEventType', () {
test('parses for expected values', () {
expect(
DevToolsExtensionEventType.from('ping'),
DevToolsExtensionEventType.ping,
);
expect(
DevToolsExtensionEventType.from('pong'),
DevToolsExtensionEventType.pong,
);
expect(
DevToolsExtensionEventType.from('forceReload'),
DevToolsExtensionEventType.forceReload,
);
expect(
DevToolsExtensionEventType.from('showNotification'),
DevToolsExtensionEventType.showNotification,
);
expect(
DevToolsExtensionEventType.from('showBannerMessage'),
DevToolsExtensionEventType.showBannerMessage,
);
expect(
DevToolsExtensionEventType.from('copyToClipboard'),
DevToolsExtensionEventType.copyToClipboard,
);
expect(
DevToolsExtensionEventType.from('vmServiceConnection'),
DevToolsExtensionEventType.vmServiceConnection,
);
expect(
DevToolsExtensionEventType.from('themeUpdate'),
DevToolsExtensionEventType.themeUpdate,
);
});
test('parses for unexpected values', () {
expect(
DevToolsExtensionEventType.from('PING'),
DevToolsExtensionEventType.unknown,
);
expect(
DevToolsExtensionEventType.from('pongg'),
DevToolsExtensionEventType.unknown,
);
});
test('supportedForDirection', () {
verifyEventDirection(
DevToolsExtensionEventType.ping,
(bidirectional: false, toDevTools: false, toExtension: true),
);
verifyEventDirection(
DevToolsExtensionEventType.pong,
(bidirectional: false, toDevTools: true, toExtension: false),
);
verifyEventDirection(
DevToolsExtensionEventType.forceReload,
(bidirectional: false, toDevTools: false, toExtension: true),
);
verifyEventDirection(
DevToolsExtensionEventType.vmServiceConnection,
(bidirectional: true, toDevTools: true, toExtension: true),
);
verifyEventDirection(
DevToolsExtensionEventType.themeUpdate,
(bidirectional: false, toDevTools: false, toExtension: true),
);
verifyEventDirection(
DevToolsExtensionEventType.showNotification,
(bidirectional: false, toDevTools: true, toExtension: false),
);
verifyEventDirection(
DevToolsExtensionEventType.showBannerMessage,
(bidirectional: false, toDevTools: true, toExtension: false),
);
verifyEventDirection(
DevToolsExtensionEventType.copyToClipboard,
(bidirectional: false, toDevTools: true, toExtension: false),
);
verifyEventDirection(
DevToolsExtensionEventType.unknown,
(bidirectional: true, toDevTools: true, toExtension: true),
);
});
});
group('$ShowNotificationExtensionEvent', () {
test('constructs for expected values', () {
final event = DevToolsExtensionEvent.parse({
'type': 'showNotification',
'data': {
'message': 'foo message',
},
});
final showNotificationEvent = ShowNotificationExtensionEvent.from(event);
expect(showNotificationEvent.message, 'foo message');
});
test('throws for unexpected values', () {
final event1 = DevToolsExtensionEvent.parse({
'type': 'showNotification',
'data': {
// Missing required fields.
},
});
expect(
() {
ShowNotificationExtensionEvent.from(event1);
},
throwsFormatException,
);
final event2 = DevToolsExtensionEvent.parse({
'type': 'showNotification',
'data': {
// Bad key.
'msg': 'foo message',
},
});
expect(
() {
ShowNotificationExtensionEvent.from(event2);
},
throwsFormatException,
);
final event3 = DevToolsExtensionEvent.parse({
'type': 'showNotification',
'data': {
// Bad value.
'message': false,
},
});
expect(
() {
ShowNotificationExtensionEvent.from(event3);
},
throwsFormatException,
);
final event4 = DevToolsExtensionEvent.parse({
// Wrong type.
'type': 'showBannerMessage',
'data': {
'message': 'foo message',
},
});
expect(
() {
ShowNotificationExtensionEvent.from(event4);
},
throwsAssertionError,
);
});
});
group('$ShowBannerMessageExtensionEvent', () {
test('constructs for expected values', () {
var event = DevToolsExtensionEvent.parse({
'type': 'showBannerMessage',
'data': {
'id': 'fooMessageId',
'message': 'foo message',
'bannerMessageType': 'warning',
'extensionName': 'foo',
},
});
var showBannerMessageEvent = ShowBannerMessageExtensionEvent.from(event);
expect(showBannerMessageEvent.messageId, 'fooMessageId');
expect(showBannerMessageEvent.message, 'foo message');
expect(showBannerMessageEvent.bannerMessageType, 'warning');
expect(showBannerMessageEvent.extensionName, 'foo');
expect(showBannerMessageEvent.ignoreIfAlreadyDismissed, true);
event = DevToolsExtensionEvent.parse({
'type': 'showBannerMessage',
'data': {
'id': 'blah',
'message': 'blah message',
'bannerMessageType': 'error',
'extensionName': 'blah',
'ignoreIfAlreadyDismissed': false,
},
});
showBannerMessageEvent = ShowBannerMessageExtensionEvent.from(event);
expect(showBannerMessageEvent.messageId, 'blah');
expect(showBannerMessageEvent.message, 'blah message');
expect(showBannerMessageEvent.bannerMessageType, 'error');
expect(showBannerMessageEvent.extensionName, 'blah');
expect(showBannerMessageEvent.ignoreIfAlreadyDismissed, false);
});
test('throws for unexpected values', () {
final event1 = DevToolsExtensionEvent.parse({
'type': 'showBannerMessage',
'data': {
// Missing required fields.
'extensionName': 'foo',
},
});
expect(
() {
ShowBannerMessageExtensionEvent.from(event1);
},
throwsFormatException,
);
final event2 = DevToolsExtensionEvent.parse({
'type': 'showBannerMessage',
'data': {
// Bad keys.
'bad_key': 'fooMessageId',
'messages': 'foo message',
'bannerMessageTypeee': 'warning',
'extension_name': 'foo',
},
});
expect(
() {
ShowBannerMessageExtensionEvent.from(event2);
},
throwsFormatException,
);
final event3 = DevToolsExtensionEvent.parse({
'type': 'showBannerMessage',
'data': {
// Bad values.
'id': 1,
'message': 'foo message',
'bannerMessageType': 2.0,
'extensionName': 'foo',
},
});
expect(
() {
ShowBannerMessageExtensionEvent.from(event3);
},
throwsFormatException,
);
final event4 = DevToolsExtensionEvent.parse({
// Wrong type.
'type': 'showNotification',
'data': {
'id': 'fooMessageId',
'message': 'foo message',
'bannerMessageType': 'warning',
'extensionName': 'foo',
},
});
expect(
() {
ShowBannerMessageExtensionEvent.from(event4);
},
throwsAssertionError,
);
});
});
group('$CopyToClipboardExtensionEvent', () {
test('constructs for expected values', () {
final event = DevToolsExtensionEvent.parse({
'type': 'copyToClipboard',
'data': {
'content': 'foo content',
'successMessage': 'foo success',
},
});
final copyToClipboardEvent = CopyToClipboardExtensionEvent.from(event);
expect(copyToClipboardEvent.content, 'foo content');
expect(copyToClipboardEvent.successMessage, 'foo success');
});
test('throws for unexpected values', () {
final event1 = DevToolsExtensionEvent.parse({
'type': 'copyToClipboard',
'data': {
// Missing required fields.
},
});
expect(
() {
CopyToClipboardExtensionEvent.from(event1);
},
throwsFormatException,
);
final event2 = DevToolsExtensionEvent.parse({
'type': 'copyToClipboard',
'data': {
// Bad key.
'msg': 'foo content',
'successMessage': 'foo success',
},
});
expect(
() {
CopyToClipboardExtensionEvent.from(event2);
},
throwsFormatException,
);
final event3 = DevToolsExtensionEvent.parse({
'type': 'copyToClipboard',
'data': {
// Bad value.
'content': false,
'successMessage': 'foo success',
},
});
expect(
() {
CopyToClipboardExtensionEvent.from(event3);
},
throwsFormatException,
);
final event4 = DevToolsExtensionEvent.parse({
// Wrong type.
'type': 'showBannerMessage',
'data': {
'content': 'foo content',
'successMessage': 'foo success',
},
});
expect(
() {
CopyToClipboardExtensionEvent.from(event4);
},
throwsAssertionError,
);
});
});
}
void verifyEventDirection(
DevToolsExtensionEventType type,
({bool bidirectional, bool toDevTools, bool toExtension}) expected,
) {
expect(
type.supportedForDirection(ExtensionEventDirection.bidirectional),
expected.bidirectional,
);
expect(
type.supportedForDirection(ExtensionEventDirection.toDevTools),
expected.toDevTools,
);
expect(
type.supportedForDirection(ExtensionEventDirection.toExtension),
expected.toExtension,
);
}