mirror of
https://github.com/flutter/samples.git
synced 2025-11-14 11:28:36 +00:00
Compass app (#2446)
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
// Copyright 2024 The Flutter team. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart';
|
||||
import 'package:compass_app/ui/search_form/widgets/search_form_continent.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import '../../../../testing/app.dart';
|
||||
import '../../../../testing/fakes/repositories/fake_continent_repository.dart';
|
||||
import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart';
|
||||
|
||||
void main() {
|
||||
group('SearchFormContinent widget tests', () {
|
||||
late SearchFormViewModel viewModel;
|
||||
|
||||
setUp(() {
|
||||
viewModel = SearchFormViewModel(
|
||||
continentRepository: FakeContinentRepository(),
|
||||
itineraryConfigRepository: FakeItineraryConfigRepository(),
|
||||
);
|
||||
});
|
||||
|
||||
loadWidget(WidgetTester tester) async {
|
||||
await testApp(tester, SearchFormContinent(viewModel: viewModel));
|
||||
}
|
||||
|
||||
testWidgets('Should load and select continent',
|
||||
(WidgetTester tester) async {
|
||||
await loadWidget(tester);
|
||||
expect(find.byType(SearchFormContinent), findsOneWidget);
|
||||
|
||||
// Select continent
|
||||
await tester.tap(find.text('CONTINENT'), warnIfMissed: false);
|
||||
|
||||
expect(viewModel.selectedContinent, 'CONTINENT');
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
// Copyright 2024 The Flutter team. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart';
|
||||
import 'package:compass_app/ui/search_form/widgets/search_form_date.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../../testing/app.dart';
|
||||
import '../../../../testing/fakes/repositories/fake_continent_repository.dart';
|
||||
import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart';
|
||||
|
||||
void main() {
|
||||
group('SearchFormDate widget tests', () {
|
||||
late SearchFormViewModel viewModel;
|
||||
|
||||
setUp(() {
|
||||
viewModel = SearchFormViewModel(
|
||||
continentRepository: FakeContinentRepository(),
|
||||
itineraryConfigRepository: FakeItineraryConfigRepository(),
|
||||
);
|
||||
});
|
||||
|
||||
loadWidget(WidgetTester tester) async {
|
||||
await testApp(tester, SearchFormDate(viewModel: viewModel));
|
||||
}
|
||||
|
||||
testWidgets('should display date in different month',
|
||||
(WidgetTester tester) async {
|
||||
await loadWidget(tester);
|
||||
expect(find.byType(SearchFormDate), findsOneWidget);
|
||||
|
||||
// Initial state
|
||||
expect(find.text('Add Dates'), findsOneWidget);
|
||||
|
||||
// Simulate date picker input:
|
||||
viewModel.dateRange = DateTimeRange(
|
||||
start: DateTime(2024, 6, 12), end: DateTime(2024, 7, 23));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('12 Jun - 23 Jul'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('should display date in same month',
|
||||
(WidgetTester tester) async {
|
||||
await loadWidget(tester);
|
||||
expect(find.byType(SearchFormDate), findsOneWidget);
|
||||
|
||||
// Initial state
|
||||
expect(find.text('Add Dates'), findsOneWidget);
|
||||
|
||||
// Simulate date picker input:
|
||||
viewModel.dateRange = DateTimeRange(
|
||||
start: DateTime(2024, 6, 12), end: DateTime(2024, 6, 23));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('12 - 23 Jun'), findsOneWidget);
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
// Copyright 2024 The Flutter team. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart';
|
||||
import 'package:compass_app/ui/search_form/widgets/search_form_guests.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../../testing/app.dart';
|
||||
import '../../../../testing/fakes/repositories/fake_continent_repository.dart';
|
||||
import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart';
|
||||
|
||||
void main() {
|
||||
group('SearchFormGuests widget tests', () {
|
||||
late SearchFormViewModel viewModel;
|
||||
|
||||
setUp(() {
|
||||
viewModel = SearchFormViewModel(
|
||||
continentRepository: FakeContinentRepository(),
|
||||
itineraryConfigRepository: FakeItineraryConfigRepository(),
|
||||
);
|
||||
});
|
||||
|
||||
loadWidget(WidgetTester tester) async {
|
||||
await testApp(tester, SearchFormGuests(viewModel: viewModel));
|
||||
}
|
||||
|
||||
testWidgets('Increase number of guests', (WidgetTester tester) async {
|
||||
await loadWidget(tester);
|
||||
expect(find.byType(SearchFormGuests), findsOneWidget);
|
||||
|
||||
// Initial state
|
||||
expect(find.text('0'), findsOneWidget);
|
||||
|
||||
await tester.tap(find.byKey(const ValueKey(addGuestsKey)));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('1'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('Decrease number of guests', (WidgetTester tester) async {
|
||||
await loadWidget(tester);
|
||||
expect(find.byType(SearchFormGuests), findsOneWidget);
|
||||
|
||||
// Initial state
|
||||
expect(find.text('0'), findsOneWidget);
|
||||
|
||||
await tester.tap(find.byKey(const ValueKey(removeGuestsKey)));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Should remain at 0
|
||||
expect(find.text('0'), findsOneWidget);
|
||||
|
||||
await tester.tap(find.byKey(const ValueKey(addGuestsKey)));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Increase to 1
|
||||
expect(find.text('1'), findsOneWidget);
|
||||
|
||||
await tester.tap(find.byKey(const ValueKey(removeGuestsKey)));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Back to 0
|
||||
expect(find.text('0'), findsOneWidget);
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
// Copyright 2024 The Flutter team. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'package:compass_app/data/repositories/auth/auth_repository.dart';
|
||||
import 'package:compass_app/data/repositories/itinerary_config/itinerary_config_repository.dart';
|
||||
import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart';
|
||||
import 'package:compass_app/ui/search_form/widgets/search_form_guests.dart';
|
||||
import 'package:compass_app/ui/search_form/widgets/search_form_screen.dart';
|
||||
import 'package:compass_app/ui/search_form/widgets/search_form_submit.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mocktail/mocktail.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../../../../testing/app.dart';
|
||||
import '../../../../testing/fakes/repositories/fake_auth_repository.dart';
|
||||
import '../../../../testing/fakes/repositories/fake_continent_repository.dart';
|
||||
import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart';
|
||||
import '../../../../testing/mocks.dart';
|
||||
|
||||
void main() {
|
||||
group('SearchFormScreen widget tests', () {
|
||||
late SearchFormViewModel viewModel;
|
||||
late MockGoRouter goRouter;
|
||||
|
||||
setUp(() {
|
||||
viewModel = SearchFormViewModel(
|
||||
continentRepository: FakeContinentRepository(),
|
||||
itineraryConfigRepository: FakeItineraryConfigRepository(),
|
||||
);
|
||||
goRouter = MockGoRouter();
|
||||
});
|
||||
|
||||
loadWidget(WidgetTester tester) async {
|
||||
await testApp(
|
||||
tester,
|
||||
ChangeNotifierProvider.value(
|
||||
value: FakeAuthRepository() as AuthRepository,
|
||||
child: Provider.value(
|
||||
value: FakeItineraryConfigRepository() as ItineraryConfigRepository,
|
||||
child: SearchFormScreen(viewModel: viewModel),
|
||||
),
|
||||
),
|
||||
goRouter: goRouter,
|
||||
);
|
||||
}
|
||||
|
||||
testWidgets('Should fill form and perform search',
|
||||
(WidgetTester tester) async {
|
||||
await loadWidget(tester);
|
||||
expect(find.byType(SearchFormScreen), findsOneWidget);
|
||||
|
||||
// Select continent
|
||||
await tester.tap(find.text('CONTINENT'), warnIfMissed: false);
|
||||
|
||||
// Select date
|
||||
viewModel.dateRange = DateTimeRange(
|
||||
start: DateTime(2024, 6, 12), end: DateTime(2024, 7, 23));
|
||||
|
||||
// Select guests
|
||||
await tester.tap(find.byKey(const ValueKey(addGuestsKey)));
|
||||
|
||||
// Refresh screen state
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Perform search
|
||||
await tester.tap(find.byKey(const ValueKey(searchFormSubmitButtonKey)));
|
||||
|
||||
// Should navigate to results screen
|
||||
verify(() => goRouter.go('/results')).called(1);
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
// Copyright 2024 The Flutter team. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart';
|
||||
import 'package:compass_app/ui/search_form/widgets/search_form_submit.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mocktail/mocktail.dart';
|
||||
|
||||
import '../../../../testing/app.dart';
|
||||
import '../../../../testing/fakes/repositories/fake_continent_repository.dart';
|
||||
import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart';
|
||||
import '../../../../testing/mocks.dart';
|
||||
|
||||
void main() {
|
||||
group('SearchFormSubmit widget tests', () {
|
||||
late SearchFormViewModel viewModel;
|
||||
late MockGoRouter goRouter;
|
||||
|
||||
setUp(() {
|
||||
viewModel = SearchFormViewModel(
|
||||
continentRepository: FakeContinentRepository(),
|
||||
itineraryConfigRepository: FakeItineraryConfigRepository(),
|
||||
);
|
||||
goRouter = MockGoRouter();
|
||||
});
|
||||
|
||||
loadWidget(WidgetTester tester) async {
|
||||
await testApp(
|
||||
tester,
|
||||
SearchFormSubmit(viewModel: viewModel),
|
||||
goRouter: goRouter,
|
||||
);
|
||||
}
|
||||
|
||||
testWidgets('Should be enabled and allow tap', (WidgetTester tester) async {
|
||||
await loadWidget(tester);
|
||||
expect(find.byType(SearchFormSubmit), findsOneWidget);
|
||||
|
||||
// Tap should not navigate
|
||||
await tester.tap(find.byKey(const ValueKey(searchFormSubmitButtonKey)));
|
||||
verifyNever(() => goRouter.go(any()));
|
||||
|
||||
// Fill in data
|
||||
viewModel.guests = 2;
|
||||
viewModel.selectedContinent = 'CONTINENT';
|
||||
final DateTimeRange newDateRange = DateTimeRange(
|
||||
start: DateTime(2024, 1, 1),
|
||||
end: DateTime(2024, 1, 31),
|
||||
);
|
||||
viewModel.dateRange = newDateRange;
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Perform search
|
||||
await tester.tap(find.byKey(const ValueKey(searchFormSubmitButtonKey)));
|
||||
|
||||
// Should navigate to results screen
|
||||
verify(() => goRouter.go('/results')).called(1);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user