@@ -25,6 +25,77 @@ void main() {
2525 await tester.pumpAndSettle ();
2626 expect (find.text (errorTextField), findsOneWidget);
2727 });
28+ testWidgets (
29+ 'Should persist custom error when autovalidateMode is onUserInteraction' ,
30+ (tester) async {
31+ final textFieldKey = GlobalKey <FormBuilderFieldState >();
32+ const textFieldName = 'text' ;
33+ const errorTextField = 'custom error' ;
34+ final testWidget = FormBuilderTextField (
35+ name: textFieldName,
36+ key: textFieldKey,
37+ autovalidateMode: AutovalidateMode .onUserInteraction,
38+ );
39+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
40+
41+ // Set custom error
42+ textFieldKey.currentState? .invalidate (errorTextField);
43+ await tester.pumpAndSettle ();
44+ expect (find.text (errorTextField), findsOneWidget);
45+
46+ // Simulate framework call (e.g. build again)
47+ tester.binding.scheduleFrame ();
48+ await tester.pumpAndSettle ();
49+
50+ // Should still be there
51+ expect (find.text (errorTextField), findsOneWidget);
52+
53+ // Should clear when value changes
54+ await tester.enterText (find.byType (TextField ), 'test' );
55+ await tester.pumpAndSettle ();
56+ expect (find.text (errorTextField), findsNothing);
57+ },
58+ );
59+ });
60+
61+ group ('transformedValue -' , () {
62+ testWidgets ('Should return raw value when valueTransformer is null' , (
63+ tester,
64+ ) async {
65+ final textFieldKey = GlobalKey <FormBuilderFieldState >();
66+ const textFieldName = 'text' ;
67+ final testWidget = FormBuilderTextField (
68+ name: textFieldName,
69+ key: textFieldKey,
70+ );
71+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
72+
73+ final widgetFinder = find.byWidget (testWidget);
74+ await tester.enterText (widgetFinder, '123' );
75+ await tester.pumpAndSettle ();
76+
77+ expect (textFieldKey.currentState? .transformedValue, '123' );
78+ });
79+
80+ testWidgets (
81+ 'Should return transformed value when valueTransformer is provided' ,
82+ (tester) async {
83+ final textFieldKey = GlobalKey <FormBuilderFieldState >();
84+ const textFieldName = 'text' ;
85+ final testWidget = FormBuilderTextField (
86+ name: textFieldName,
87+ key: textFieldKey,
88+ valueTransformer: (text) => int .tryParse (text ?? '' ),
89+ );
90+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
91+
92+ final widgetFinder = find.byWidget (testWidget);
93+ await tester.enterText (widgetFinder, '123' );
94+ await tester.pumpAndSettle ();
95+
96+ expect (textFieldKey.currentState? .transformedValue, 123 );
97+ },
98+ );
2899 });
29100
30101 group ('isValid -' , () {
@@ -516,5 +587,39 @@ void main() {
516587 },
517588 );
518589 });
590+ group ('forceErrorText -' , () {
591+ testWidgets ('Should show error when forceErrorText is set' , (
592+ tester,
593+ ) async {
594+ const errorText = 'Force error message' ;
595+ final testWidget = FormBuilderTextField (
596+ name: 'text' ,
597+ forceErrorText: errorText,
598+ );
599+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
600+ await tester.pumpAndSettle ();
601+
602+ expect (find.text (errorText), findsOneWidget);
603+ });
604+
605+ testWidgets (
606+ 'Should override validator error when forceErrorText is set' ,
607+ (tester) async {
608+ const forceError = 'Force error' ;
609+ const validatorError = 'Validator error' ;
610+ final testWidget = FormBuilderTextField (
611+ name: 'text' ,
612+ forceErrorText: forceError,
613+ validator: (value) => validatorError,
614+ autovalidateMode: AutovalidateMode .always,
615+ );
616+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
617+ await tester.pumpAndSettle ();
618+
619+ expect (find.text (forceError), findsOneWidget);
620+ expect (find.text (validatorError), findsNothing);
621+ },
622+ );
623+ });
519624 });
520625}
0 commit comments