blob: 85491d80c29dbd066cd82cc6f36ecc33d1b1e8cd [file] [log] [blame]
// 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' show Completer;
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'sensitive_content_utils.dart';
void main() {
const ContentSensitivity defaultContentSensitivitySetting = ContentSensitivity.autoSensitive;
tearDown(() {
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(
SystemChannels.sensitiveContent,
null,
);
});
testWidgets(
'while SensitiveContent widget is being registered, SizedBox.shrink is built initially, then child widget is built upon completion',
(WidgetTester tester) async {
final setContentSensitivityCompleter = Completer<void>();
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(
SystemChannels.sensitiveContent,
(MethodCall methodCall) {
if (methodCall.method == 'SensitiveContent.setContentSensitivity') {
return setContentSensitivityCompleter.future;
} else if (methodCall.method == 'SensitiveContent.getContentSensitivity') {
return Future<int>.value(defaultContentSensitivitySetting.index);
} else if (methodCall.method == 'SensitiveContent.isSupported') {
return Future<bool>.value(true);
} else {
return null;
}
},
);
final childWidget = Container();
await tester.pumpWidget(
SensitiveContent(sensitivity: ContentSensitivity.sensitive, child: childWidget),
);
expect(find.byWidget(childWidget), findsNothing);
final shrinkBox = tester.firstWidget(find.byType(SizedBox)) as SizedBox;
expect(shrinkBox.width, 0);
expect(shrinkBox.height, 0);
setContentSensitivityCompleter.complete();
// Two pumps to complete registration, then re-build SensitiveContent widget.
await tester.pump();
await tester.pump();
expect(find.byWidget(childWidget), findsOne);
expect(find.byType(SizedBox), findsNothing);
},
);
testWidgets(
'when SensitiveContent widget changes sensitivity, SizedBox.shrink is built initially, then child widget is built upon completion',
(WidgetTester tester) async {
final setContentSensitivityCompleter = Completer<void>();
var setContentSensitivityCall = 0;
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(
SystemChannels.sensitiveContent,
(MethodCall methodCall) {
if (methodCall.method == 'SensitiveContent.setContentSensitivity') {
setContentSensitivityCall++;
// Make second call to update content sensitivity awaits the Future for test.
if (setContentSensitivityCall == 2 && methodCall.arguments == 'autoSensitive') {
return setContentSensitivityCompleter.future;
}
return Future<void>.value();
} else if (methodCall.method == 'SensitiveContent.getContentSensitivity') {
return Future<int>.value(defaultContentSensitivitySetting.index);
} else if (methodCall.method == 'SensitiveContent.isSupported') {
return Future<bool>.value(true);
} else {
return null;
}
},
);
const scKey = Key('scKey');
final childWidget = Container();
await tester.pumpWidget(
ChangeContentSensitivityTester(
key: scKey,
initialContentSensitivity: ContentSensitivity.sensitive,
child: childWidget,
),
);
await tester.pump();
final ChangeContentSensitivityTesterState scState = tester
.firstState<ChangeContentSensitivityTesterState>(find.byKey(scKey));
scState.changeContentSensitivityTo(ContentSensitivity.autoSensitive);
await tester.pump();
expect(find.byWidget(childWidget), findsNothing);
final shrinkBox = tester.firstWidget(find.byType(SizedBox)) as SizedBox;
expect(shrinkBox.width, 0);
expect(shrinkBox.height, 0);
await tester.pump();
setContentSensitivityCompleter.complete();
// Two pumps to complete re-registration, then re-build SensitiveContent widget.
await tester.pump();
await tester.pump();
expect(find.byType(childWidget.runtimeType), findsOne);
expect(find.byType(SizedBox), findsNothing);
// Ensure setContentSensitivity was not called more than once upon re-registration.
expect(setContentSensitivityCall, 2);
},
);
}