Skip to content

Commit

Permalink
CountdownPage tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Syutkin committed Jan 21, 2025
1 parent d386983 commit f6274a8
Show file tree
Hide file tree
Showing 2 changed files with 147 additions and 43 deletions.
85 changes: 42 additions & 43 deletions lib/src/feature/countdown/widget/countdown_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,52 +9,52 @@ class CountdownPage extends StatelessWidget {

@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(title: Text(Localization.current.I18nCountdown_countdown)),
body: BlocBuilder<CountdownBloc, CountdownState>(
builder: (context, state) {
final text = state.maybeMap(
working: (state) {
return state.tick.text;
},
orElse: () {
return '';
},
);
final number = state.maybeMap(
working: (state) {
return state.tick.number;
},
orElse: () {
return null;
},
);
appBar:
AppBar(title: Text(Localization.current.I18nCountdown_countdown)),
body: BlocBuilder<CountdownBloc, CountdownState>(
builder: (context, state) {
final text = state.maybeMap(
working: (state) {
return state.tick.text;
},
orElse: () {
return '';
},
);
final number = state.maybeMap(
working: (state) {
return state.tick.number;
},
orElse: () {
return null;
},
);

return Center(
child:
number == null
return Center(
child: number == null
? ConstrainedBox(
constraints: const BoxConstraints.tightFor(
width: double.infinity,
height: double.infinity,
),
child: FittedBox(
child: Padding(
padding: const EdgeInsets.all(8),
child: Text(text),
constraints: const BoxConstraints.tightFor(
width: double.infinity,
height: double.infinity,
),
),
)
child: FittedBox(
child: Padding(
padding: const EdgeInsets.all(8),
child: Text(text),
),
),
)
: OrientationBuilder(
builder: (context, orientation) {
return orientation == Orientation.portrait
? Column(children: _items(number, text))
: Row(children: _items(number, text));
},
),
);
},
),
);
builder: (context, orientation) {
return orientation == Orientation.portrait
? Column(children: _items(number, text))
: Row(children: _items(number, text));
},
),
);
},
),
);

List<Widget> _items(int? number, String text) {
return [
Expand All @@ -65,7 +65,6 @@ class CountdownPage extends StatelessWidget {
child: Padding(
padding: const EdgeInsets.all(8),
child: Text('${number ?? ""}'),
// child: Text('$number'),
),
),
),
Expand Down
105 changes: 105 additions & 0 deletions test/src/feature/countdown/widget/countdown_page_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import 'package:bloc_test/bloc_test.dart';
import 'package:entime/src/common/localization/localization.dart';
import 'package:entime/src/common/utils/extensions.dart';
import 'package:entime/src/feature/countdown/countdown.dart';
import 'package:entime/src/feature/countdown/model/tick.dart';
import 'package:entime/src/feature/database/database.dart';
import 'package:entime/src/feature/settings/bloc/settings_bloc.dart';
import 'package:entime/src/feature/settings/model/app_settings.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:mocktail/mocktail.dart';
import 'package:patrol_finders/patrol_finders.dart';
import 'package:entime/src/feature/countdown/widget/countdown_page.dart';

class MockCountdownBloc extends MockBloc<CountdownEvent, CountdownState>
implements CountdownBloc {}

void main() {
late CountdownBloc countdownBloc;
late int second;
late String text;
late int number;
late Tick tick;

Widget testWidget() {
initializeDateFormatting();
return MaterialApp(
localizationsDelegates: const [Localization.delegate],
supportedLocales: Localization.supportedLocales,
home: Material(
child: BlocProvider.value(
value: countdownBloc,
child: const CountdownPage(),
),
),
);
}

setUpAll(
() {
countdownBloc = MockCountdownBloc();
},
);

setUp(
() {
second = 0;
text = 'text';
number = 99;

tick = Tick(second: second, text: text, number: number);
when(() => countdownBloc.state)
.thenReturn(CountdownState.working(tick: tick));
},
);

group(
'CountdownPage tests',
() {
patrolWidgetTest('Initial build', (PatrolTester $) async {
await $.pumpWidgetAndSettle(testWidget());

expect($(Localization.current.I18nCountdown_countdown), findsOneWidget);
expect($(Center), findsOneWidget);
});

patrolWidgetTest('Initial bloc state', (PatrolTester $) async {
when(() => countdownBloc.state)
.thenReturn(const CountdownState.initial());
await $.pumpWidgetAndSettle(testWidget());

expect($(Row), findsNothing);
expect($(Column), findsNothing);
expect($(FittedBox), findsOneWidget);
expect($(''), findsOneWidget);
});

patrolWidgetTest(
'Working bloc state, landscape (default for test) orientation',
(PatrolTester $) async {
await $.pumpWidgetAndSettle(testWidget());

expect($(Row), findsOneWidget);
expect($(Column), findsNothing);
expect($(text), findsOneWidget);
expect($('$number'), findsOneWidget);
});

patrolWidgetTest('Working bloc state, portrait orientation',
(PatrolTester $) async {
$.tester.view.physicalSize = const Size(1024, 2400);
await $.pumpWidgetAndSettle(testWidget());

expect($(Row), findsNothing);
expect($(Column), findsOneWidget);
expect($(text), findsOneWidget);
expect($('$number'), findsOneWidget);
});
},
);
}

0 comments on commit f6274a8

Please sign in to comment.