1
0
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:
Eric Windmill
2024-09-27 18:49:27 -04:00
committed by GitHub
parent fcf2552cda
commit 46b5a26b26
326 changed files with 53272 additions and 0 deletions

View File

@@ -0,0 +1,73 @@
// 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:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:compass_app/ui/search_form/view_models/search_form_viewmodel.dart';
import '../../../../testing/fakes/repositories/fake_continent_repository.dart';
import '../../../../testing/fakes/repositories/fake_itinerary_config_repository.dart';
void main() {
group('SearchFormViewModel Tests', () {
late SearchFormViewModel viewModel;
setUp(() {
viewModel = SearchFormViewModel(
continentRepository: FakeContinentRepository(),
itineraryConfigRepository: FakeItineraryConfigRepository(),
);
});
test('Initial values are correct', () {
expect(viewModel.valid, false);
expect(viewModel.selectedContinent, null);
expect(viewModel.dateRange, null);
expect(viewModel.guests, 0);
});
test('Setting dateRange updates correctly', () {
final DateTimeRange newDateRange = DateTimeRange(
start: DateTime(2024, 1, 1),
end: DateTime(2024, 1, 31),
);
viewModel.dateRange = newDateRange;
expect(viewModel.dateRange, newDateRange);
});
test('Setting selectedContinent updates correctly', () {
viewModel.selectedContinent = 'CONTINENT';
expect(viewModel.selectedContinent, 'CONTINENT');
// Setting null should work
viewModel.selectedContinent = null;
expect(viewModel.selectedContinent, null);
});
test('Setting guests updates correctly', () {
viewModel.guests = 2;
expect(viewModel.guests, 2);
// Guests number should not be negative
viewModel.guests = -1;
expect(viewModel.guests, 0);
});
test('Set all values and save', () async {
expect(viewModel.valid, false);
viewModel.guests = 2;
viewModel.selectedContinent = 'CONTINENT';
final DateTimeRange newDateRange = DateTimeRange(
start: DateTime(2024, 1, 1),
end: DateTime(2024, 1, 31),
);
viewModel.dateRange = newDateRange;
expect(viewModel.valid, true);
await viewModel.updateItineraryConfig.execute();
expect(viewModel.updateItineraryConfig.completed, true);
});
});
}

View File

@@ -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');
});
});
}

View File

@@ -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);
});
});
}

View File

@@ -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);
});
});
}

View File

@@ -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);
});
});
}

View File

@@ -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);
});
});
}