6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit cac62949

AuthorNKL<nikolaj.king@gmail.com>
Date2024-12-17 14:41:39 +0100
added unit tests and update to models

Changed files

comwell_key_app/assets/translations/da-DK.json     |   4 +-
 .../authentication/authentication_repository.dart  |   2 +-
 .../lib/common/components/comwell_text_field.dart  |   6 +-
 .../lib/common/components/generic_dialog.dart      |   1 -
 comwell_key_app/lib/comwell_app.dart               |   3 +-
 .../components/hotel_list_item_view.dart           |   5 +-
 .../find_booking/components/hotel_tab_view.dart    |   6 +-
 .../lib/find_booking/find_booking_page.dart        |   3 +-
 comwell_key_app/lib/find_booking/loading_page.dart |   5 +-
 .../lib/key/repository/key_repository.dart         |   2 +-
 .../components/current_bookings_tab_view.dart      |   2 -
 .../lib/overview/cubit/overview_cubit.dart         |   8 +-
 comwell_key_app/lib/overview/models/booking.dart   |  22 ++-
 comwell_key_app/lib/overview/models/bookings.dart  |   6 +-
 .../lib/overview/models/payment_details.dart       |   7 +-
 .../lib/profile/cubit/profile_cubit.dart           |   2 +-
 .../lib/profile/cubit/profile_state.dart           |   2 +-
 .../cubit/profile_settings_cubit.dart              |   8 +-
 .../cubit/profile_settings_state.dart              |   2 +
 .../profile_settings_repository.dart               |   5 +-
 comwell_key_app/lib/services/api.dart              |  16 ++-
 .../interceptors/response_handle_interceptor.dart  |   6 +-
 comwell_key_app/lib/utils/locator.dart             |   2 +
 comwell_key_app/test/key_test/key_bloc_test.dart   |   6 +-
 .../test/overview_test/overview_cubic_test.dart    | 148 +++++++++++++++++++++
 .../overview_test/overview_repository_test.dart    | 108 +++++++++++++++
 .../profile_settings_cubit_test.dart               | 101 ++++++++++++++
 27 files changed, 436 insertions(+), 52 deletions(-)

Diff

diff --git a/comwell_key_app/assets/translations/da-DK.json b/comwell_key_app/assets/translations/da-DK.json
index e19f083d..1063f3d3 100644
--- a/comwell_key_app/assets/translations/da-DK.json
+++ b/comwell_key_app/assets/translations/da-DK.json
@@ -74,9 +74,6 @@
"booking_not_found_subtitle": "Den booking du leder efter, kunne ikke findes. \nHar du skrevet oplysningerne korrekt?",
"booking_not_found_button": "Prøv igen",
"booking_not_found_cancel": "Annuller",
-
-
- "get_bill": "Hent kvittering",
"save": "Gem",
"zipCode": "Postnummer",
"city": "By",
@@ -88,4 +85,5 @@
+
}
\ No newline at end of file
diff --git a/comwell_key_app/lib/authentication/authentication_repository.dart b/comwell_key_app/lib/authentication/authentication_repository.dart
index 18f18de1..cefd4d86 100644
--- a/comwell_key_app/lib/authentication/authentication_repository.dart
+++ b/comwell_key_app/lib/authentication/authentication_repository.dart
@@ -22,7 +22,7 @@ class AuthenticationRepository {
_controller.sink.add(AuthenticationStatus.authenticated);
}
- Future logOut() async{
+ Future<void> logOut() async{
await secureStorage.deleteAll();
_controller.sink.add(AuthenticationStatus.unauthenticated);
}
diff --git a/comwell_key_app/lib/common/components/comwell_text_field.dart b/comwell_key_app/lib/common/components/comwell_text_field.dart
index 9e1d6f27..789642b4 100644
--- a/comwell_key_app/lib/common/components/comwell_text_field.dart
+++ b/comwell_key_app/lib/common/components/comwell_text_field.dart
@@ -7,7 +7,7 @@ class ComwellTextField extends StatefulWidget {
final bool readOnly;
final TextEditingController controller;
- ComwellTextField({
+ const ComwellTextField({
super.key,
required this.fieldName,
required this.initialValue,
@@ -15,10 +15,10 @@ class ComwellTextField extends StatefulWidget {
required this.controller,
});
@override
- _ComwellTextFieldState createState() => _ComwellTextFieldState();
+ ComwellTextFieldState createState() => ComwellTextFieldState();
}
-class _ComwellTextFieldState extends State<ComwellTextField> {
+class ComwellTextFieldState extends State<ComwellTextField> {
late FocusNode _focusNode;
bool _isFocused = false;
diff --git a/comwell_key_app/lib/common/components/generic_dialog.dart b/comwell_key_app/lib/common/components/generic_dialog.dart
index 3a1f2371..c7443f19 100644
--- a/comwell_key_app/lib/common/components/generic_dialog.dart
+++ b/comwell_key_app/lib/common/components/generic_dialog.dart
@@ -1,6 +1,5 @@
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:flutter/material.dart';
-import 'package:easy_localization/easy_localization.dart';
class GenericDialog extends StatelessWidget {
final String title;
diff --git a/comwell_key_app/lib/comwell_app.dart b/comwell_key_app/lib/comwell_app.dart
index d432d711..cbb53e14 100644
--- a/comwell_key_app/lib/comwell_app.dart
+++ b/comwell_key_app/lib/comwell_app.dart
@@ -5,6 +5,7 @@ import 'package:comwell_key_app/home/home_repository.dart';
import 'package:comwell_key_app/key/bloc/key_bloc.dart';
import 'package:comwell_key_app/key/repository/key_repository.dart';
import 'package:comwell_key_app/overview/cubit/overview_cubit.dart';
+import 'package:comwell_key_app/overview/repository/overview_repository.dart';
import 'package:comwell_key_app/profile/cubit/profile_cubit.dart';
import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/profile_settings/cubit/profile_settings_cubit.dart';
@@ -58,7 +59,7 @@ final List<BlocProvider> blocProviderList = [
),
BlocProvider<OverviewCubit>(
lazy: true,
- create: (BuildContext context) => OverviewCubit(),
+ create: (BuildContext context) => OverviewCubit(locator<OverviewRepository>()),
),
BlocProvider<ProfileCubit>(
lazy: false,
diff --git a/comwell_key_app/lib/find_booking/components/hotel_list_item_view.dart b/comwell_key_app/lib/find_booking/components/hotel_list_item_view.dart
index 5482e9cf..25f038b8 100644
--- a/comwell_key_app/lib/find_booking/components/hotel_list_item_view.dart
+++ b/comwell_key_app/lib/find_booking/components/hotel_list_item_view.dart
@@ -1,9 +1,6 @@
import 'package:comwell_key_app/find_booking/models/hotel.dart';
-import 'package:comwell_key_app/overview/models/booking.dart';
-import 'package:comwell_key_app/routing/app_routes.dart';
-import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
-import 'package:go_router/go_router.dart';
+
class HotelListItemView extends StatelessWidget {
final Hotel hotel;
diff --git a/comwell_key_app/lib/find_booking/components/hotel_tab_view.dart b/comwell_key_app/lib/find_booking/components/hotel_tab_view.dart
index e83b6f32..9dcef0c6 100644
--- a/comwell_key_app/lib/find_booking/components/hotel_tab_view.dart
+++ b/comwell_key_app/lib/find_booking/components/hotel_tab_view.dart
@@ -1,10 +1,7 @@
import 'package:comwell_key_app/find_booking/components/hotel_list_item_view.dart';
import 'package:comwell_key_app/find_booking/models/hotel.dart';
-import 'package:comwell_key_app/overview/components/current_booking_list_item_view.dart';
-import 'package:comwell_key_app/overview/models/booking.dart';
-import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
-import 'package:flutter_svg/svg.dart';
+
class HotelTabView extends StatelessWidget {
List<Hotel> hotels;
@@ -16,7 +13,6 @@ class HotelTabView extends StatelessWidget {
@override
Widget build(BuildContext context) {
- final theme = Theme.of(context);
return ListView.builder(
shrinkWrap: true,
itemCount: hotels.length,
diff --git a/comwell_key_app/lib/find_booking/find_booking_page.dart b/comwell_key_app/lib/find_booking/find_booking_page.dart
index 936b73c0..d814b6cf 100644
--- a/comwell_key_app/lib/find_booking/find_booking_page.dart
+++ b/comwell_key_app/lib/find_booking/find_booking_page.dart
@@ -1,7 +1,6 @@
import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
import 'package:comwell_key_app/common/components/comwell_text_field.dart';
import 'package:comwell_key_app/overview/cubit/overview_cubit.dart';
-import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:easy_localization/easy_localization.dart';
@@ -50,7 +49,7 @@ class FindBookingPageState extends State<FindBookingPage>
Future<void> _findBooking(BuildContext context) async {
final OverviewCubit overviewCubit = BlocProvider.of<OverviewCubit>(context);
- final Booking? booking = await overviewCubit.findBooking(
+ await overviewCubit.findBooking(
_bookingReferenceController.text, _lastNameController.text);
// Navigate to the loading page
context.pushNamed(AppRoutes.loadingPage.name);
diff --git a/comwell_key_app/lib/find_booking/loading_page.dart b/comwell_key_app/lib/find_booking/loading_page.dart
index 593fe5ce..4b67cd4c 100644
--- a/comwell_key_app/lib/find_booking/loading_page.dart
+++ b/comwell_key_app/lib/find_booking/loading_page.dart
@@ -1,4 +1,3 @@
-import 'package:comwell_key_app/home/home_page.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
@@ -8,10 +7,10 @@ class LoadingPage extends StatefulWidget {
const LoadingPage({super.key});
@override
- _LoadingPageState createState() => _LoadingPageState();
+ LoadingPageState createState() => LoadingPageState();
}
-class _LoadingPageState extends State<LoadingPage> {
+class LoadingPageState extends State<LoadingPage> {
@override
void initState() {
super.initState();
diff --git a/comwell_key_app/lib/key/repository/key_repository.dart b/comwell_key_app/lib/key/repository/key_repository.dart
index 71d715c2..45452b0b 100644
--- a/comwell_key_app/lib/key/repository/key_repository.dart
+++ b/comwell_key_app/lib/key/repository/key_repository.dart
@@ -15,7 +15,7 @@ class KeyRepository {
required this.deviceInfoPlugin,
});
- Future<void> checkDeviceInfo() async {
+ Future checkDeviceInfo() async {
try {
if (Platform.isAndroid) {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
diff --git a/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart b/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart
index 5c751839..51cd1f7b 100644
--- a/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart
+++ b/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart
@@ -1,8 +1,6 @@
import 'package:comwell_key_app/overview/components/current_booking_list_item_view.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
-import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
-import 'package:flutter_svg/svg.dart';
class CurrentBookingsTabView extends StatelessWidget {
List<Booking> bookings;
diff --git a/comwell_key_app/lib/overview/cubit/overview_cubit.dart b/comwell_key_app/lib/overview/cubit/overview_cubit.dart
index 033c6da5..25ccfdc9 100644
--- a/comwell_key_app/lib/overview/cubit/overview_cubit.dart
+++ b/comwell_key_app/lib/overview/cubit/overview_cubit.dart
@@ -7,8 +7,8 @@ import 'package:equatable/equatable.dart';
part 'overview_state.dart';
class OverviewCubit extends Cubit<OverviewState> {
- final OverviewRepository overviewRepository = OverviewRepository();
- OverviewCubit() : super(OverviewInitial());
+ final OverviewRepository overviewRepository;
+ OverviewCubit(this.overviewRepository) : super(OverviewInitial());
Future<void> fetchBookings() async {
emit(OverviewLoading());
@@ -21,10 +21,6 @@ class OverviewCubit extends Cubit<OverviewState> {
}
}
- @override
- Future<void> close() {
- return super.close();
- }
Future<void> addBooking(Booking newBooking) async {
if (state is OverviewLoaded) {
diff --git a/comwell_key_app/lib/overview/models/booking.dart b/comwell_key_app/lib/overview/models/booking.dart
index 5627da64..552429d0 100644
--- a/comwell_key_app/lib/overview/models/booking.dart
+++ b/comwell_key_app/lib/overview/models/booking.dart
@@ -1,6 +1,7 @@
import 'package:comwell_key_app/overview/models/payment_details.dart';
+import 'package:equatable/equatable.dart';
-class Booking {
+class Booking extends Equatable {
final String id;
final String userId;
final String roomNumber;
@@ -87,6 +88,25 @@ class Booking {
throw Exception('Unknown booking status: $status');
}
}
+
+ @override
+ List<Object?> get props => [
+ id,
+ userId,
+ roomNumber,
+ startDate,
+ endDate,
+ status,
+ image,
+ hotelName,
+ roomType,
+ children,
+ adults,
+ hotelCode,
+ booker,
+ bookingDate,
+ paymentDetails,
+ ];
}
enum BookingStatus {
diff --git a/comwell_key_app/lib/overview/models/bookings.dart b/comwell_key_app/lib/overview/models/bookings.dart
index 1d2345b4..02e68037 100644
--- a/comwell_key_app/lib/overview/models/bookings.dart
+++ b/comwell_key_app/lib/overview/models/bookings.dart
@@ -1,6 +1,7 @@
import 'package:comwell_key_app/overview/models/booking.dart';
+import 'package:equatable/equatable.dart';
-class Bookings {
+class Bookings extends Equatable {
List<Booking> current;
List<Booking> past;
List<Booking> cancelled;
@@ -18,4 +19,7 @@ class Bookings {
cancelled: (json['cancelled'] as List<dynamic>).map<Booking>((dynamic e) => Booking.fromJson(e)).toList(),
);
}
+
+ @override
+ List<Object> get props => [current, past, cancelled];
}
\ No newline at end of file
diff --git a/comwell_key_app/lib/overview/models/payment_details.dart b/comwell_key_app/lib/overview/models/payment_details.dart
index 0ad8587f..ea9e1eb9 100644
--- a/comwell_key_app/lib/overview/models/payment_details.dart
+++ b/comwell_key_app/lib/overview/models/payment_details.dart
@@ -1,4 +1,6 @@
-class PaymentDetails {
+import 'package:equatable/equatable.dart';
+
+class PaymentDetails extends Equatable {
final String cardNumber;
final String cardHolder;
final String? expiryDate;
@@ -48,6 +50,9 @@ class PaymentDetails {
throw Exception('Unknown card type: $type');
}
}
+
+ @override
+ List<Object?> get props => [cardNumber, cardHolder, expiryDate, cvc, cardType, cardName];
}
enum CardType {
diff --git a/comwell_key_app/lib/profile/cubit/profile_cubit.dart b/comwell_key_app/lib/profile/cubit/profile_cubit.dart
index 2d435834..14cfecd3 100644
--- a/comwell_key_app/lib/profile/cubit/profile_cubit.dart
+++ b/comwell_key_app/lib/profile/cubit/profile_cubit.dart
@@ -10,6 +10,6 @@ class ProfileCubit extends Cubit<ProfileState> {
void deleteAllInfoOnLogOut() async {
- emit(ProfileDeleteAllInfo());
+ emit(ProfileLogOut());
}
}
diff --git a/comwell_key_app/lib/profile/cubit/profile_state.dart b/comwell_key_app/lib/profile/cubit/profile_state.dart
index 3f7e9f16..f412a994 100644
--- a/comwell_key_app/lib/profile/cubit/profile_state.dart
+++ b/comwell_key_app/lib/profile/cubit/profile_state.dart
@@ -9,4 +9,4 @@ sealed class ProfileState extends Equatable {
final class ProfileInitial extends ProfileState {}
-final class ProfileDeleteAllInfo extends ProfileState {}
+final class ProfileLogOut extends ProfileState {}
diff --git a/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart b/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart
index 084a0102..f72315d2 100644
--- a/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart
+++ b/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart
@@ -25,11 +25,9 @@ class ProfileSettingsCubit extends Cubit<ProfileSettingsState> {
void deleteProfile() async {
try {
- // Delete profile
- //await profileSettingsRepository.deleteProfile();
- //await authenticationRepository.logOut();
-
-
+ await profileSettingsRepository.deleteProfile();
+ await authenticationRepository.logOut();
+ emit(ProfileSettingsDeleted());
} catch (e) {
emit(ProfileSettingsError());
}
diff --git a/comwell_key_app/lib/profile_settings/cubit/profile_settings_state.dart b/comwell_key_app/lib/profile_settings/cubit/profile_settings_state.dart
index 5414bc88..ee20acb2 100644
--- a/comwell_key_app/lib/profile_settings/cubit/profile_settings_state.dart
+++ b/comwell_key_app/lib/profile_settings/cubit/profile_settings_state.dart
@@ -21,5 +21,7 @@ final class ProfileSettingsLoaded extends ProfileSettingsState {
}
final class ProfileSettingsError extends ProfileSettingsState {}
+
+final class ProfileSettingsDeleted extends ProfileSettingsState {}
diff --git a/comwell_key_app/lib/profile_settings/profile_settings_repository.dart b/comwell_key_app/lib/profile_settings/profile_settings_repository.dart
index 4a7cf767..734d0226 100644
--- a/comwell_key_app/lib/profile_settings/profile_settings_repository.dart
+++ b/comwell_key_app/lib/profile_settings/profile_settings_repository.dart
@@ -13,7 +13,10 @@ class ProfileSettingsRepository {
return null;
}
- Future<void> updateUser(User updatedUser) async {}
+ Future<void> updateUser(User updatedUser) async {
+ return api.updateUser(updatedUser);
+
+ }
Future<void> deleteProfile() {
return api.deleteProfile();
diff --git a/comwell_key_app/lib/services/api.dart b/comwell_key_app/lib/services/api.dart
index 402d7f70..a34507a7 100644
--- a/comwell_key_app/lib/services/api.dart
+++ b/comwell_key_app/lib/services/api.dart
@@ -1,3 +1,5 @@
+import 'package:comwell_key_app/common/const.dart';
+import 'package:comwell_key_app/profile_settings/model/user.dart';
import 'package:comwell_key_app/services/http_client.dart';
import 'package:dio/dio.dart';
@@ -55,6 +57,18 @@ class Api {
}
Future<void> deleteProfile() {
- return dio.post('/deleteProfile');
+ return dio.delete<void>('/Members/v1/DeleteGuest');
+ }
+
+ Future<void> updateUser(User updatedUser) {
+ return dio.post<void>(
+ '/Members/v1/UpdateGuestData',
+ data: {
+ 'addressStreet': updatedUser.address.street,
+ 'adressCity': updatedUser.address.city,
+ 'addressCountry': updatedUser.address.country,
+ 'addressZip': updatedUser.address.zipCode,
+ },
+ );
}
}
diff --git a/comwell_key_app/lib/services/interceptors/response_handle_interceptor.dart b/comwell_key_app/lib/services/interceptors/response_handle_interceptor.dart
index c6a96008..ca9f59c7 100644
--- a/comwell_key_app/lib/services/interceptors/response_handle_interceptor.dart
+++ b/comwell_key_app/lib/services/interceptors/response_handle_interceptor.dart
@@ -101,10 +101,6 @@ class ResponseHandleInterceptor extends Interceptor {
return newAccessToken;
}
- @override
- Future<dynamic> onError(
- DioException err, ErrorInterceptorHandler handler) async {
- return super.onError(err, handler);
- }
+
}
}
diff --git a/comwell_key_app/lib/utils/locator.dart b/comwell_key_app/lib/utils/locator.dart
index f6d69710..5f4b7d61 100644
--- a/comwell_key_app/lib/utils/locator.dart
+++ b/comwell_key_app/lib/utils/locator.dart
@@ -1,4 +1,5 @@
import 'package:comwell_key_app/key/repository/key_repository.dart';
+import 'package:comwell_key_app/overview/repository/overview_repository.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/foundation.dart';
import 'package:get_it/get_it.dart';
@@ -10,6 +11,7 @@ void setupLocator() {
if(!kIsWeb) {
locator.registerSingleton(SeosMobileKeysPlugin());
locator.registerFactory<KeyRepository>(() => KeyRepository(deviceInfoPlugin: locator<DeviceInfoPlugin>(), seosMobileKeysPlugin: locator<SeosMobileKeysPlugin>()));
+ locator.registerFactory<OverviewRepository>(() => OverviewRepository());
}
diff --git a/comwell_key_app/test/key_test/key_bloc_test.dart b/comwell_key_app/test/key_test/key_bloc_test.dart
index e9f4115a..e2bcd2e7 100644
--- a/comwell_key_app/test/key_test/key_bloc_test.dart
+++ b/comwell_key_app/test/key_test/key_bloc_test.dart
@@ -38,7 +38,7 @@ void main() {
'emits [KeyState.searchForKeys, KeyState.validKeys, KeyState.scanning, KeyState.openClosestReaderSuccess] when SearchForKeys and StartScanning are added',
build: () {
when(mockHomeRepository.refreshKeys()).thenAnswer((_) async => [mockMobileKeysKey]);
- when(mockKeyRepository.openClosestReader()).thenAnswer((_) async => {});
+ when(mockKeyRepository.checkDeviceInfo()).thenAnswer((_) async => {});
return keyBloc;
},
act: (bloc) {
@@ -50,7 +50,7 @@ void main() {
expect: () => [
KeyState.searchForKeys(),
KeyState.validKeys([mockMobileKeysKey]),
- KeyState.scanning(mockMobileKeysKey),
+ KeyState.scanning(),
// KeyState.openClosestReaderSuccess(), Not able to test this
],
);
@@ -74,7 +74,7 @@ void main() {
when(mockKeyRepository.checkDeviceInfo()).thenThrow(Exception('Device info error'));
return keyBloc;
},
- act: (bloc) => bloc.add(StartScanning(mockMobileKeysKey)),
+ act: (bloc) => bloc.add(const StartScanning()),
expect: () => [
KeyState.scanningError('Exception: Device info error'),
],
diff --git a/comwell_key_app/test/overview_test/overview_cubic_test.dart b/comwell_key_app/test/overview_test/overview_cubic_test.dart
new file mode 100644
index 00000000..52a90c0b
--- /dev/null
+++ b/comwell_key_app/test/overview_test/overview_cubic_test.dart
@@ -0,0 +1,148 @@
+import 'package:bloc_test/bloc_test.dart';
+import 'package:comwell_key_app/overview/models/payment_details.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:mocktail/mocktail.dart';
+import 'package:comwell_key_app/overview/cubit/overview_cubit.dart';
+import 'package:comwell_key_app/overview/models/booking.dart';
+import 'package:comwell_key_app/overview/models/bookings.dart';
+import 'package:comwell_key_app/overview/repository/overview_repository.dart';
+
+class MockOverviewRepository extends Mock implements OverviewRepository {}
+
+void main() {
+ late OverviewCubit overviewCubit;
+ late MockOverviewRepository mockOverviewRepository;
+
+ setUp(() {
+ mockOverviewRepository = MockOverviewRepository();
+ overviewCubit = OverviewCubit(mockOverviewRepository);
+ });
+
+ tearDown(() {
+ overviewCubit.close();
+ });
+
+ group('OverviewCubit', () {
+ blocTest<OverviewCubit, OverviewState>(
+ 'emits [OverviewLoading, OverviewLoaded] when fetchBookings is successful',
+ build: () {
+ when(() => mockOverviewRepository.fetchAllBookingsForUser('1'))
+ .thenAnswer((_) async => Bookings(
+ current: [Booking(
+ id: '1',
+ status: BookingStatus.current,
+ userId: '1',
+ roomNumber: '',
+ startDate: DateTime(2021, 10, 10),
+ endDate: DateTime(2021, 10, 10),
+ image: '',
+ hotelName: '',
+ roomType: '',
+ children: 2,
+ adults: 2,
+ hotelCode: '',
+ booker: '',
+ bookingDate: DateTime(2021, 10, 10),
+ paymentDetails: PaymentDetails(cardNumber: '1234414141', cardHolder: 'Nikolaj', expiryDate: '', cvc: '212', cardType: CardType.visa))],
+ past: [],
+ cancelled: [],
+ ));
+ return overviewCubit;
+ },
+ act: (cubit) => cubit.fetchBookings(),
+ expect: () => [
+ OverviewLoading(),
+ OverviewLoaded(
+ bookings: Bookings(
+ current: [Booking(
+ id: '1',
+ status: BookingStatus.current,
+ userId: '1',
+ roomNumber: '',
+ startDate: DateTime(2021, 10, 10),
+ endDate: DateTime(2021, 10, 10),
+ image: '',
+ hotelName: '',
+ roomType: '',
+ children: 2,
+ adults: 2,
+ hotelCode: '',
+ booker: '',
+ bookingDate: DateTime(2021, 10, 10),
+ paymentDetails: PaymentDetails(cardNumber: '1234414141', cardHolder: 'Nikolaj', expiryDate: '', cvc: '212', cardType: CardType.visa))],
+ past: [],
+ cancelled: [],
+ ),
+ ),
+ ],
+ );
+
+ blocTest<OverviewCubit, OverviewState>(
+ 'emits [OverviewLoading, OverviewError] when fetchBookings fails',
+ build: () {
+ when(() => mockOverviewRepository.fetchAllBookingsForUser(any()))
+ .thenThrow(Exception('Failed to fetch bookings'));
+ return overviewCubit;
+ },
+ act: (cubit) => cubit.fetchBookings(),
+ expect: () => [
+ OverviewLoading(),
+ OverviewError(error: 'Exception: Failed to fetch bookings'),
+ ],
+ );
+
+ blocTest<OverviewCubit, OverviewState>(
+ 'emits [OverviewLoaded] with updated bookings when addBooking is called',
+ build: () {
+ return overviewCubit;
+ },
+ seed: () => OverviewLoaded(
+ bookings: Bookings(
+ current: [],
+ past: [],
+ cancelled: [],
+ ),
+ ),
+ act: (cubit) => cubit.addBooking(Booking(
+ id: '1',
+ status: BookingStatus.current,
+ userId: '1',
+ roomNumber: '',
+ startDate: DateTime(2021, 10, 10),
+ endDate: DateTime(2021, 10, 10),
+ image: '',
+ hotelName: '',
+ roomType: '',
+ children: 2,
+ adults: 2,
+ hotelCode: '',
+ booker: '',
+ bookingDate: DateTime(2021, 10, 10),
+ paymentDetails: PaymentDetails(cardNumber: '1234414141', cardHolder: 'Nikolaj', expiryDate: '', cvc: '212', cardType: CardType.visa))),
+ expect: () => [
+ OverviewLoaded(
+ bookings: Bookings(
+ current: [Booking(
+ id: '1',
+ status: BookingStatus.current,
+ userId: '1',
+ roomNumber: '',
+ startDate: DateTime(2021, 10, 10),
+ endDate: DateTime(2021, 10, 10),
+ image: '',
+ hotelName: '',
+ roomType: '',
+ children: 2,
+ adults: 2,
+ hotelCode: '',
+ booker: '',
+ bookingDate: DateTime(2021, 10, 10),
+ paymentDetails: PaymentDetails(cardNumber: '1234414141', cardHolder: 'Nikolaj', expiryDate: '', cvc: '212', cardType: CardType.visa))],
+ past: [],
+ cancelled: [],
+ ),
+ ),
+ ],
+ );
+ });
+}
\ No newline at end of file
diff --git a/comwell_key_app/test/overview_test/overview_repository_test.dart b/comwell_key_app/test/overview_test/overview_repository_test.dart
new file mode 100644
index 00000000..1c879677
--- /dev/null
+++ b/comwell_key_app/test/overview_test/overview_repository_test.dart
@@ -0,0 +1,108 @@
+import 'package:comwell_key_app/overview/models/payment_details.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:mocktail/mocktail.dart';
+import 'package:comwell_key_app/overview/models/booking.dart';
+import 'package:comwell_key_app/overview/models/bookings.dart';
+import 'package:comwell_key_app/overview/repository/overview_repository.dart';
+
+class MockOverviewRepository extends Mock implements OverviewRepository {}
+
+void main() {
+ late OverviewRepository overviewRepository;
+
+ setUp(() {
+ overviewRepository = MockOverviewRepository();
+ });
+
+ group('OverviewRepository', () {
+ test('fetchAllBookingsForUser returns Bookings', () async {
+ final userId = '1';
+ final bookings = Bookings(
+ current: [
+ Booking(
+ id: '1',
+ status: BookingStatus.current,
+ userId: userId,
+ roomNumber: '101',
+ startDate: DateTime.now(),
+ endDate: DateTime.now().add(const Duration(days: 1)),
+ image: 'image_url',
+ hotelName: 'Hotel Name',
+ roomType: 'Deluxe',
+ children: 2,
+ adults: 2,
+ hotelCode: 'H001',
+ booker: 'John Doe',
+ bookingDate: DateTime.now(),
+ paymentDetails: PaymentDetails(
+ cardNumber: '1234567890123456',
+ cardHolder: 'John Doe',
+ expiryDate: '12/23',
+ cvc: '123',
+ cardType: CardType.visa,
+ ),
+ ),
+ ],
+ past: [],
+ cancelled: [],
+ );
+
+ when(() => overviewRepository.fetchAllBookingsForUser(userId))
+ .thenAnswer((_) async => bookings);
+
+ final result = await overviewRepository.fetchAllBookingsForUser(userId);
+
+ expect(result, bookings);
+ verify(() => overviewRepository.fetchAllBookingsForUser(userId)).called(1);
+ });
+
+ test('findBooking returns Booking', () async {
+ final bookingReference = '1';
+ final lastName = 'Doe';
+ final booking = Booking(
+ id: '1',
+ status: BookingStatus.current,
+ userId: '1',
+ roomNumber: '101',
+ startDate: DateTime.now(),
+ endDate: DateTime.now().add(const Duration(days: 1)),
+ image: 'image_url',
+ hotelName: 'Hotel Name',
+ roomType: 'Deluxe',
+ children: 2,
+ adults: 2,
+ hotelCode: 'H001',
+ booker: 'John Doe',
+ bookingDate: DateTime.now(),
+ paymentDetails: PaymentDetails(
+ cardNumber: '1234567890123456',
+ cardHolder: 'John Doe',
+ expiryDate: '12/23',
+ cvc: '123',
+ cardType: CardType.visa,
+ ),
+ );
+
+ when(() => overviewRepository.findBooking(bookingReference, lastName))
+ .thenAnswer((_) async => booking);
+
+ final result = await overviewRepository.findBooking(bookingReference, lastName);
+
+ expect(result, booking);
+ verify(() => overviewRepository.findBooking(bookingReference, lastName)).called(1);
+ });
+
+ test('findBooking returns null when booking is not found', () async {
+ final bookingReference = '1';
+ final lastName = 'Doe';
+
+ when(() => overviewRepository.findBooking(bookingReference, lastName))
+ .thenAnswer((_) async => null);
+
+ final result = await overviewRepository.findBooking(bookingReference, lastName);
+
+ expect(result, isNull);
+ verify(() => overviewRepository.findBooking(bookingReference, lastName)).called(1);
+ });
+ });
+}
\ No newline at end of file
diff --git a/comwell_key_app/test/profile_settings_test/profile_settings_cubit_test.dart b/comwell_key_app/test/profile_settings_test/profile_settings_cubit_test.dart
new file mode 100644
index 00000000..e9b1af28
--- /dev/null
+++ b/comwell_key_app/test/profile_settings_test/profile_settings_cubit_test.dart
@@ -0,0 +1,101 @@
+import 'package:bloc_test/bloc_test.dart';
+import 'package:comwell_key_app/authentication/authentication_repository.dart';
+import 'package:comwell_key_app/profile_settings/model/address.dart';
+import 'package:comwell_key_app/profile_settings/model/user.dart';
+import 'package:comwell_key_app/profile_settings/profile_settings_repository.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:mocktail/mocktail.dart';
+import 'package:comwell_key_app/profile_settings/cubit/profile_settings_cubit.dart';
+
+
+class MockProfileSettingsRepository extends Mock implements ProfileSettingsRepository {}
+class MockAuthenticationRepository extends Mock implements AuthenticationRepository {}
+
+void main() {
+ late ProfileSettingsCubit profileSettingsCubit;
+ late MockProfileSettingsRepository mockProfileSettingsRepository;
+ late MockAuthenticationRepository mockAuthenticationRepository;
+
+ setUp(() {
+ mockProfileSettingsRepository = MockProfileSettingsRepository();
+ mockAuthenticationRepository = MockAuthenticationRepository();
+ profileSettingsCubit = ProfileSettingsCubit(profileSettingsRepository: mockProfileSettingsRepository, authenticationRepository: mockAuthenticationRepository);
+ });
+
+ tearDown(() {
+ profileSettingsCubit.close();
+ });
+
+ group('ProfileSettingsCubit', () {
+ final user = User(
+ id: '1',
+ firstName: 'John',
+ lastName: 'Doe',
+ email: 'john.doe@example.com',
+ phone: '1234567890',
+ address: Address(
+ street: '123 Main St',
+ city: 'Anytown',
+ zipCode: '12345',
+ country: 'USA',
+ ),
+ birthday: DateTime(1990, 1, 1), countryCode: '',
+ );
+
+ blocTest<ProfileSettingsCubit, ProfileSettingsState>(
+ 'emits [ProfileSettingsLoading, ProfileSettingsLoaded] when fetchProfileSettings is successful',
+ build: () {
+ when(() => mockProfileSettingsRepository.fetchProfileSettings())
+ .thenAnswer((_) async => user);
+ return profileSettingsCubit;
+ },
+ act: (cubit) => cubit.fetchProfileSettings(),
+ expect: () => [
+ ProfileSettingsLoading(),
+ ProfileSettingsLoaded(user),
+ ],
+ );
+
+ blocTest<ProfileSettingsCubit, ProfileSettingsState>(
+ 'emits [ProfileSettingsLoading, ProfileSettingsError] when fetchProfileSettings fails',
+ build: () {
+ when(() => mockProfileSettingsRepository.fetchProfileSettings())
+ .thenThrow(Exception('Failed to fetch profile settings'));
+ return profileSettingsCubit;
+ },
+ act: (cubit) => cubit.fetchProfileSettings(),
+ expect: () => [
+ ProfileSettingsLoading(),
+ ProfileSettingsError(),
+ ],
+ );
+
+ blocTest<ProfileSettingsCubit, ProfileSettingsState>(
+ 'emits [ProfileSettingsDeleted] when deleteProfile is successful',
+ build: () {
+ when(() => mockProfileSettingsRepository.deleteProfile())
+ .thenAnswer((_) async => {});
+ when(() => mockAuthenticationRepository.logOut())
+ .thenAnswer((_) async => {});
+ return profileSettingsCubit;
+ },
+ act: (cubit) => cubit.deleteProfile(),
+ expect: () => [
+ ProfileSettingsDeleted(),
+ ],
+ );
+
+ blocTest<ProfileSettingsCubit, ProfileSettingsState>(
+ 'emits [ProfileSettingsError] when deleteProfile fails',
+ build: () {
+ when(() => mockProfileSettingsRepository.deleteProfile())
+ .thenThrow(Exception('Failed to delete profile'));
+ return profileSettingsCubit;
+ },
+ act: (cubit) => cubit.deleteProfile(),
+ expect: () => [
+ ProfileSettingsError(),
+ ],
+ );
+ });
+}
\ No newline at end of file