diff --git a/app/lib/blocs/dashbord_widgets_blocs/holiday_bloc.dart b/app/lib/blocs/dashbord_widgets_blocs/holiday_bloc.dart index 7ca22fa85..19c922bbb 100644 --- a/app/lib/blocs/dashbord_widgets_blocs/holiday_bloc.dart +++ b/app/lib/blocs/dashbord_widgets_blocs/holiday_bloc.dart @@ -26,6 +26,8 @@ class HolidayBloc extends BlocBase { final HolidayStateGateway stateGateway; Stream get userState => stateGateway.userState; + Stream get hasStateSelected => + userState.map((state) => state != null && state != StateEnum.notSelected); Future Function(StateEnum state) get changeState => stateGateway.changeState; diff --git a/app/lib/dashboard/dashboard_page.dart b/app/lib/dashboard/dashboard_page.dart index 83c6f7ec3..85efc47d5 100644 --- a/app/lib/dashboard/dashboard_page.dart +++ b/app/lib/dashboard/dashboard_page.dart @@ -134,7 +134,7 @@ class DashboardPageBody extends StatelessWidget { const _HomeworkSection(), _EventsSection(), _BlackboardSection(), - _HolidayCountdownSection(), + HolidayCountdownSection(), const SizedBox(height: 32) ], ), diff --git a/app/lib/dashboard/sections/holiday_countdown_section.dart b/app/lib/dashboard/sections/holiday_countdown_section.dart index 9f481c834..4644bc435 100644 --- a/app/lib/dashboard/sections/holiday_countdown_section.dart +++ b/app/lib/dashboard/sections/holiday_countdown_section.dart @@ -8,8 +8,9 @@ part of '../dashboard_page.dart'; -class _HolidayCountdownSection extends StatelessWidget { - const _HolidayCountdownSection({Key key}) : super(key: key); +@visibleForTesting +class HolidayCountdownSection extends StatelessWidget { + const HolidayCountdownSection({Key key}) : super(key: key); @override Widget build(BuildContext context) { @@ -21,11 +22,11 @@ class _HolidayCountdownSection extends StatelessWidget { child: Padding( padding: const EdgeInsets.fromLTRB(12, 0, 12, 12), child: CustomCard( + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 12), child: SizedBox( width: double.infinity, child: StreamBuilder( - stream: bloc.userState - .map((state) => state != StateEnum.notSelected), + stream: bloc.hasStateSelected, builder: (context, snapshot) { if (!snapshot.hasData) return Container(height: 50); final hasUserSelectedState = snapshot.data; @@ -56,9 +57,13 @@ class _HolidayCounter extends StatelessWidget { if (!snapshot.hasData) return const Center(child: AccentColorCircularProgressIndicator()); if (snapshot.data.isEmpty) return handleError(null); - return _HolidayText( - maxItems: 2, - holidayList: snapshot.data, + return DefaultTextStyle( + style: DefaultTextStyle.of(context).style, + textAlign: TextAlign.center, + child: _HolidayText( + maxItems: 2, + holidayList: snapshot.data, + ), ); }, ), @@ -142,6 +147,12 @@ class _HolidayText extends StatelessWidget { } } + final isFirstText = holidayList.first.slug == holiday.slug; + if (!isFirstText) { + // Add padding between the text widgets + widgetList.add(SizedBox(height: 4)); + } + widgetList.add(textWidget); }); return widgetList; diff --git a/app/test/dashboard/dashboard_page_test.dart b/app/test/dashboard/dashboard_page_test.dart new file mode 100644 index 000000000..30fbbfc62 --- /dev/null +++ b/app/test/dashboard/dashboard_page_test.dart @@ -0,0 +1,83 @@ +// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) +// Licensed under the EUPL-1.2-or-later. +// +// You may obtain a copy of the Licence at: +// https://joinup.ec.europa.eu/software/page/eupl +// +// SPDX-License-Identifier: EUPL-1.2 + +import 'dart:async'; +import 'dart:convert'; + +import 'package:bloc_provider/bloc_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:golden_toolkit/golden_toolkit.dart'; +import 'package:intl/intl.dart'; +import 'package:sharezone/blocs/dashbord_widgets_blocs/holiday_bloc.dart'; +import 'package:sharezone/dashboard/dashboard_page.dart'; +import 'package:sharezone/models/extern_apis/holiday.dart'; + +class FakeHolidayBloc extends Fake implements HolidayBloc { + StreamController hasStateSelectedController = StreamController(); + StreamController> holidaysController = StreamController(); + + @override + Stream> get holidays => holidaysController.stream; + + @override + Stream get hasStateSelected => hasStateSelectedController.stream; + + @override + void dispose() { + holidaysController.close(); + hasStateSelectedController.close(); + } +} + +void main() { + group('DashboardPage', () { + testGoldens('displays holiday card as excepted', (tester) async { + final holidayBloc = FakeHolidayBloc(); + addTearDown(holidayBloc.dispose); + + final now = DateTime.now(); + final firstHolidays = Holiday.fromJson(jsonEncode({ + "start": "${DateFormat('yyyy-MM-dd').format(now)}", + "end": "${now.year + 1}-02-01", + "year": now.year, + "stateCode": "HB", + "name": "winterferien, aber mit einem sehr langen Namen", + "slug": "winterferien 2022-2022-HB" + })); + + final secondHolidays = Holiday.fromJson(jsonEncode({ + "start": + "${DateFormat('yyyy-MM-dd').format(now.add(Duration(days: 20)))}", + "end": "${now.year + 1}-02-01", + "year": now.year, + "stateCode": "HB", + "name": "osterferien", + "slug": "osterferien 2022-2022-HB" + })); + + holidayBloc.holidaysController.add([firstHolidays, secondHolidays]); + holidayBloc.hasStateSelectedController.add(true); + + await tester.pumpWidget( + BlocProvider( + bloc: holidayBloc, + child: MaterialApp( + home: Scaffold( + body: Center( + child: HolidayCountdownSection(), + ), + ), + ), + ), + ); + + await multiScreenGolden(tester, 'holiday_card', devices: [Device.phone]); + }); + }); +} diff --git a/app/test/dashboard/goldens/holiday_card.phone.png b/app/test/dashboard/goldens/holiday_card.phone.png new file mode 100644 index 000000000..e186f2d60 Binary files /dev/null and b/app/test/dashboard/goldens/holiday_card.phone.png differ