TF-2717 Write widget test for case recipient has expanded button

This commit is contained in:
dab246
2024-04-03 09:31:10 +07:00
committed by Dat H. Pham
parent 90ab1283d1
commit ec3953a6ed
3 changed files with 126 additions and 22 deletions
@@ -63,6 +63,7 @@ class RecipientComposerWidget extends StatefulWidget {
final EdgeInsetsGeometry? padding; final EdgeInsetsGeometry? padding;
final EdgeInsetsGeometry? margin; final EdgeInsetsGeometry? margin;
final OnEnableAllRecipientsInputAction? onEnableAllRecipientsInputAction; final OnEnableAllRecipientsInputAction? onEnableAllRecipientsInputAction;
final bool isTestingForWeb;
const RecipientComposerWidget({ const RecipientComposerWidget({
super.key, super.key,
@@ -70,6 +71,7 @@ class RecipientComposerWidget extends StatefulWidget {
required this.listEmailAddress, required this.listEmailAddress,
required this.imagePaths, required this.imagePaths,
required this.maxWidth, required this.maxWidth,
@visibleForTesting this.isTestingForWeb = false,
this.ccState = PrefixRecipientState.disabled, this.ccState = PrefixRecipientState.disabled,
this.bccState = PrefixRecipientState.disabled, this.bccState = PrefixRecipientState.disabled,
this.fromState = PrefixRecipientState.disabled, this.fromState = PrefixRecipientState.disabled,
@@ -157,7 +159,7 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
}, },
child: StatefulBuilder( child: StatefulBuilder(
builder: (context, stateSetter) { builder: (context, stateSetter) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb || widget.isTestingForWeb) {
return DragTarget<DraggableEmailAddress>( return DragTarget<DraggableEmailAddress>(
builder: (context, candidateData, rejectedData) { builder: (context, candidateData, rejectedData) {
return TagEditor<SuggestionEmailAddress>( return TagEditor<SuggestionEmailAddress>(
@@ -316,10 +318,11 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
), ),
const SizedBox(width: RecipientComposerWidgetStyle.space), const SizedBox(width: RecipientComposerWidgetStyle.space),
if (widget.prefix == PrefixEmailAddress.to) if (widget.prefix == PrefixEmailAddress.to)
if (PlatformInfo.isWeb) if (PlatformInfo.isWeb || widget.isTestingForWeb)
...[ ...[
if (widget.fromState == PrefixRecipientState.disabled) if (widget.fromState == PrefixRecipientState.disabled)
TMailButtonWidget.fromText( TMailButtonWidget.fromText(
key: Key('prefix_${widget.prefix.name}_recipient_from_button'),
text: AppLocalizations.of(context).from_email_address_prefix, text: AppLocalizations.of(context).from_email_address_prefix,
textStyle: RecipientComposerWidgetStyle.prefixButtonTextStyle, textStyle: RecipientComposerWidgetStyle.prefixButtonTextStyle,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
@@ -329,6 +332,7 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
), ),
if (widget.ccState == PrefixRecipientState.disabled) if (widget.ccState == PrefixRecipientState.disabled)
TMailButtonWidget.fromText( TMailButtonWidget.fromText(
key: Key('prefix_${widget.prefix.name}_recipient_cc_button'),
text: AppLocalizations.of(context).cc_email_address_prefix, text: AppLocalizations.of(context).cc_email_address_prefix,
textStyle: RecipientComposerWidgetStyle.prefixButtonTextStyle, textStyle: RecipientComposerWidgetStyle.prefixButtonTextStyle,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
@@ -338,6 +342,7 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
), ),
if (widget.bccState == PrefixRecipientState.disabled) if (widget.bccState == PrefixRecipientState.disabled)
TMailButtonWidget.fromText( TMailButtonWidget.fromText(
key: Key('prefix_${widget.prefix.name}_recipient_bcc_button'),
text: AppLocalizations.of(context).bcc_email_address_prefix, text: AppLocalizations.of(context).bcc_email_address_prefix,
textStyle: RecipientComposerWidgetStyle.prefixButtonTextStyle, textStyle: RecipientComposerWidgetStyle.prefixButtonTextStyle,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
@@ -347,20 +352,19 @@ class _RecipientComposerWidgetState extends State<RecipientComposerWidget> {
), ),
] ]
else if (PlatformInfo.isMobile) else if (PlatformInfo.isMobile)
...[ TMailButtonWidget.fromIcon(
TMailButtonWidget.fromIcon( key: Key('prefix_${widget.prefix.name}_recipient_expand_button'),
icon: _isAllRecipientInputEnabled icon: _isAllRecipientInputEnabled
? widget.imagePaths.icChevronUp ? widget.imagePaths.icChevronUp
: widget.imagePaths.icChevronDownOutline, : widget.imagePaths.icChevronDownOutline,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
iconSize: 24, iconSize: 24,
padding: const EdgeInsets.all(5), padding: const EdgeInsets.all(5),
iconColor: AppColor.colorLabelComposer, iconColor: AppColor.colorLabelComposer,
margin: RecipientComposerWidgetStyle.enableRecipientButtonMargin, margin: RecipientComposerWidgetStyle.enableRecipientButtonMargin,
onTapActionCallback: () => widget.onEnableAllRecipientsInputAction?.call(_isAllRecipientInputEnabled), onTapActionCallback: () => widget.onEnableAllRecipientsInputAction?.call(_isAllRecipientInputEnabled),
) )
] else if (PlatformInfo.isWeb || widget.isTestingForWeb)
else if (PlatformInfo.isWeb)
TMailButtonWidget.fromIcon( TMailButtonWidget.fromIcon(
icon: widget.imagePaths.icClose, icon: widget.imagePaths.icClose,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
@@ -31,6 +31,7 @@ class RecipientTagItemWidget extends StatelessWidget {
final List<EmailAddress> collapsedListEmailAddress; final List<EmailAddress> collapsedListEmailAddress;
final OnShowFullListEmailAddressAction? onShowFullAction; final OnShowFullListEmailAddressAction? onShowFullAction;
final OnDeleteTagAction? onDeleteTagAction; final OnDeleteTagAction? onDeleteTagAction;
final bool isTestingForWeb;
const RecipientTagItemWidget({ const RecipientTagItemWidget({
super.key, super.key,
@@ -40,6 +41,7 @@ class RecipientTagItemWidget extends StatelessWidget {
required this.currentListEmailAddress, required this.currentListEmailAddress,
required this.collapsedListEmailAddress, required this.collapsedListEmailAddress,
required this.imagePaths, required this.imagePaths,
@visibleForTesting this.isTestingForWeb = false,
this.isCollapsed = false, this.isCollapsed = false,
this.isLatestTagFocused = false, this.isLatestTagFocused = false,
this.isLatestEmail = false, this.isLatestEmail = false,
@@ -56,7 +58,7 @@ class RecipientTagItemWidget extends StatelessWidget {
child: Row( child: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
if (PlatformInfo.isWeb) if (PlatformInfo.isWeb || isTestingForWeb)
Flexible( Flexible(
child: Padding( child: Padding(
padding: EdgeInsetsDirectional.only( padding: EdgeInsetsDirectional.only(
@@ -163,7 +165,7 @@ class RecipientTagItemWidget extends StatelessWidget {
onTapActionCallback: () => onShowFullAction?.call(prefix), onTapActionCallback: () => onShowFullAction?.call(prefix),
borderRadius: RecipientTagItemWidgetStyle.radius, borderRadius: RecipientTagItemWidgetStyle.radius,
textStyle: RecipientTagItemWidgetStyle.labelTextStyle, textStyle: RecipientTagItemWidgetStyle.labelTextStyle,
padding: PlatformInfo.isWeb padding: PlatformInfo.isWeb || isTestingForWeb
? RecipientTagItemWidgetStyle.counterPadding ? RecipientTagItemWidgetStyle.counterPadding
: RecipientTagItemWidgetStyle.mobileCounterPadding, : RecipientTagItemWidgetStyle.mobileCounterPadding,
backgroundColor: AppColor.colorEmailAddressTag, backgroundColor: AppColor.colorEmailAddressTag,
@@ -174,7 +176,7 @@ class RecipientTagItemWidget extends StatelessWidget {
} }
EdgeInsetsGeometry? get _counterMargin { EdgeInsetsGeometry? get _counterMargin {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb || isTestingForWeb) {
return PlatformInfo.isCanvasKit return PlatformInfo.isCanvasKit
? RecipientTagItemWidgetStyle.webCounterMargin ? RecipientTagItemWidgetStyle.webCounterMargin
: RecipientTagItemWidgetStyle.webMobileCounterMargin; : RecipientTagItemWidgetStyle.webMobileCounterMargin;
@@ -1,5 +1,6 @@
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
@@ -149,7 +150,7 @@ void main() {
); );
}); });
testWidgets('RecipientComponentWidget should have all the components (PrefixLabel, RecipientTagItemWidget)', (tester) async { testWidgets('ToRecipientComponentWidget should have all the components (PrefixLabel, RecipientTagItemWidget)', (tester) async {
final listEmailAddress = <EmailAddress>[ final listEmailAddress = <EmailAddress>[
EmailAddress('test1', 'test1@example.com'), EmailAddress('test1', 'test1@example.com'),
]; ];
@@ -446,7 +447,7 @@ void main() {
expect(isExceededTextOverflow, equals(false)); expect(isExceededTextOverflow, equals(false));
}); });
testWidgets('RecipientComponentWidget should display prefix To label correctly when the locale is fr-FR', (tester) async { testWidgets('ToRecipientComponentWidget should display prefix To label correctly when the locale is fr-FR', (tester) async {
final listEmailAddress = <EmailAddress>[ final listEmailAddress = <EmailAddress>[
EmailAddress('test1', 'test1@example.com'), EmailAddress('test1', 'test1@example.com'),
]; ];
@@ -475,7 +476,7 @@ void main() {
expect(prefixRecipientComposerWidget.data, equals('À:')); expect(prefixRecipientComposerWidget.data, equals('À:'));
}); });
testWidgets('RecipientComponentWidget should display prefix To label correctly when the locale is vi-VN', (tester) async { testWidgets('ToRecipientComponentWidget should display prefix To label correctly when the locale is vi-VN', (tester) async {
final listEmailAddress = <EmailAddress>[ final listEmailAddress = <EmailAddress>[
EmailAddress('test1', 'test1@example.com'), EmailAddress('test1', 'test1@example.com'),
]; ];
@@ -503,5 +504,102 @@ void main() {
expect(prefixRecipientComposerWidget.data, equals('Đến:')); expect(prefixRecipientComposerWidget.data, equals('Đến:'));
}); });
testWidgets('ToRecipientComponentWidget should have all the components (PrefixLabel, RecipientTagItemWidget, ExpandButton) on mobile platform', (tester) async {
debugDefaultTargetPlatformOverride = TargetPlatform.android;
final listEmailAddress = <EmailAddress>[
EmailAddress('test1', 'test1@example.com'),
];
final widget = makeTestableWidget(
child: RecipientComposerWidget(
prefix: prefix,
listEmailAddress: listEmailAddress,
imagePaths: imagePaths,
maxWidth: 360,
keyTagEditor: keyEmailTagEditor,
),
);
await tester.pumpWidget(widget);
await tester.pumpAndSettle();
final prefixRecipientComposerWidgetFinder = find.byKey(Key('prefix_${prefix.name}_recipient_composer_widget'));
final recipientTagItemWidgetFinder = find.byKey(Key('recipient_tag_item_${prefix.name}_0'));
final Size prefixRecipientComposerWidgetSize = tester.getSize(prefixRecipientComposerWidgetFinder);
final Size recipientTagItemWidgetSize = tester.getSize(recipientTagItemWidgetFinder);
expect(prefixRecipientComposerWidgetFinder, findsOneWidget);
expect(recipientTagItemWidgetFinder, findsOneWidget);
log('recipient_composer_widget_test::main: PrefixLabelSize = $prefixRecipientComposerWidgetSize | TagSize = $recipientTagItemWidgetSize');
final recipientExpandButtonFinder = find.byKey(Key('prefix_${prefix.name}_recipient_expand_button'));
final Size recipientExpandButtonSize = tester.getSize(recipientExpandButtonFinder);
log('recipient_composer_widget_test::main: ExpandButtonSize = $recipientExpandButtonSize');
expect(recipientExpandButtonFinder, findsOneWidget);
final totalComponentsSize = prefixRecipientComposerWidgetSize.width
+ recipientTagItemWidgetSize.width
+ recipientExpandButtonSize.width;
log('recipient_composer_widget_test::main: totalComponentsSize = $totalComponentsSize');
expect(totalComponentsSize, lessThan(360));
debugDefaultTargetPlatformOverride = null;
});
testWidgets('ToRecipientComponentWidget should have all the components (PrefixLabel, RecipientTagItemWidget, FromButton, CCButton, BccButton) on web platform', (tester) async {
final listEmailAddress = <EmailAddress>[
EmailAddress('test1', 'test1@example.com'),
];
final widget = makeTestableWidget(
child: RecipientComposerWidget(
prefix: prefix,
listEmailAddress: listEmailAddress,
imagePaths: imagePaths,
maxWidth: 360,
keyTagEditor: keyEmailTagEditor,
isTestingForWeb: true,
),
);
await tester.pumpWidget(widget);
await tester.pumpAndSettle();
final prefixRecipientComposerWidgetFinder = find.byKey(Key('prefix_${prefix.name}_recipient_composer_widget'));
final recipientTagItemWidgetFinder = find.byKey(Key('recipient_tag_item_${prefix.name}_0'));
final Size prefixRecipientComposerWidgetSize = tester.getSize(prefixRecipientComposerWidgetFinder);
final Size recipientTagItemWidgetSize = tester.getSize(recipientTagItemWidgetFinder);
expect(prefixRecipientComposerWidgetFinder, findsOneWidget);
expect(recipientTagItemWidgetFinder, findsOneWidget);
log('recipient_composer_widget_test::main: PrefixLabelSize = $prefixRecipientComposerWidgetSize | TagSize = $recipientTagItemWidgetSize');
final recipientFromButtonFinder = find.byKey(Key('prefix_${prefix.name}_recipient_from_button'));
final recipientCcButtonFinder = find.byKey(Key('prefix_${prefix.name}_recipient_cc_button'));
final recipientBccButtonFinder = find.byKey(Key('prefix_${prefix.name}_recipient_bcc_button'));
final Size recipientFromButtonSize = tester.getSize(recipientFromButtonFinder);
final Size recipientCcButtonSize = tester.getSize(recipientCcButtonFinder);
final Size recipientBccButtonSize = tester.getSize(recipientBccButtonFinder);
log('recipient_composer_widget_test::main: FromButtonSize = $recipientFromButtonSize | CcButtonSize = $recipientCcButtonSize | BccButtonSize = $recipientBccButtonSize');
expect(recipientFromButtonFinder, findsOneWidget);
expect(recipientCcButtonFinder, findsOneWidget);
expect(recipientBccButtonFinder, findsOneWidget);
});
}); });
} }