mirror of https://github.com/flutter/samples.git
parent
8df115f2a7
commit
3a3a2857d9
@ -0,0 +1,145 @@
|
||||
import 'package:compass_app/config/dependencies.dart';
|
||||
import 'package:compass_app/data/repositories/auth/auth_repository.dart';
|
||||
import 'package:compass_app/main.dart';
|
||||
import 'package:compass_app/ui/activities/widgets/activities_screen.dart';
|
||||
import 'package:compass_app/ui/auth/login/widgets/login_screen.dart';
|
||||
import 'package:compass_app/ui/booking/widgets/booking_screen.dart';
|
||||
import 'package:compass_app/ui/core/ui/custom_checkbox.dart';
|
||||
import 'package:compass_app/ui/core/ui/home_button.dart';
|
||||
import 'package:compass_app/ui/home/widgets/home_screen.dart';
|
||||
import 'package:compass_app/ui/results/widgets/result_card.dart';
|
||||
import 'package:compass_app/ui/results/widgets/results_screen.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:compass_app/utils/result.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:integration_test/integration_test.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
// mocked AuthRepository to control the authentication state in the test and trigger UI changes.
|
||||
class TestAuthRepository extends AuthRepository {
|
||||
bool _authenticated = false;
|
||||
|
||||
@override
|
||||
Future<bool> get isAuthenticated => Future.value(_authenticated);
|
||||
|
||||
@override
|
||||
Future<Result<void>> login({
|
||||
required String email,
|
||||
required String password,
|
||||
}) async {
|
||||
_authenticated = true;
|
||||
notifyListeners();
|
||||
return const Result.ok(null);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Result<void>> logout() async {
|
||||
_authenticated = false;
|
||||
notifyListeners();
|
||||
return const Result.ok(null);
|
||||
}
|
||||
}
|
||||
|
||||
void main() {
|
||||
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
group('end-to-end booking flow', () {
|
||||
testWidgets(
|
||||
'starts logged out, creates itinerary, and go back to home screen',
|
||||
(tester) async {
|
||||
// clears data to ensure the app starts logged out, then logs in with a test auth repository.
|
||||
final sharedPreferences = await SharedPreferences.getInstance();
|
||||
await sharedPreferences.clear();
|
||||
final testAuthRepository = TestAuthRepository();
|
||||
|
||||
await tester.pumpWidget(
|
||||
MultiProvider(
|
||||
providers: [
|
||||
...providersLocal,
|
||||
ChangeNotifierProvider<AuthRepository>.value(
|
||||
value:
|
||||
testAuthRepository, // override the AuthRepository with our test implementation
|
||||
),
|
||||
],
|
||||
child: const MainApp(),
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Auth-gated entry with local data.
|
||||
expect(find.byType(LoginScreen), findsOneWidget);
|
||||
await tester.tap(find.text('Login'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.byType(HomeScreen), findsOneWidget);
|
||||
|
||||
// Select create new booking
|
||||
await tester.tap(find.byKey(const ValueKey(bookingButtonKey)));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.byType(SearchFormScreen), findsOneWidget);
|
||||
|
||||
// Search destinations screen
|
||||
await tester.tap(find.text('Europe'), warnIfMissed: false);
|
||||
|
||||
await tester.tap(find.text('Add Dates'));
|
||||
await tester.pumpAndSettle();
|
||||
final tomorrow = DateTime.now().add(const Duration(days: 1)).day;
|
||||
final nextDay = DateTime.now().add(const Duration(days: 2)).day;
|
||||
await tester.tap(find.text(tomorrow.toString()).first);
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text(nextDay.toString()).first);
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('Save'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Select guests
|
||||
await tester.tap(find.byKey(const ValueKey(addGuestsKey)));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Perform search and navigate to next screen
|
||||
await tester.tap(find.byKey(const ValueKey(searchFormSubmitButtonKey)));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Results Screen
|
||||
expect(find.byType(ResultsScreen), findsOneWidget);
|
||||
|
||||
// Select a destination
|
||||
final firstResultCardFinder = find.byType(ResultCard).first;
|
||||
expect(firstResultCardFinder, findsOneWidget);
|
||||
final selectedDestination = tester
|
||||
.widget<ResultCard>(firstResultCardFinder)
|
||||
.destination;
|
||||
await tester.tap(firstResultCardFinder);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// Activities Screen
|
||||
expect(find.byType(ActivitiesScreen), findsOneWidget);
|
||||
|
||||
// Select one activity
|
||||
await tester.tap(find.byType(CustomCheckbox).first);
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('1 selected'), findsOneWidget);
|
||||
|
||||
await tester.tap(find.byKey(const ValueKey(confirmButtonKey)));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.byType(BookingScreen), findsOneWidget);
|
||||
expect(find.text(selectedDestination.name), findsOneWidget);
|
||||
|
||||
// Verify booking is visible on Home.
|
||||
await tester.tap(find.byType(HomeButton).first);
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.byType(HomeScreen), findsOneWidget);
|
||||
expect(
|
||||
find.text(
|
||||
'${selectedDestination.name}, ${selectedDestination.continent}',
|
||||
),
|
||||
findsOneWidget,
|
||||
);
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
Loading…
Reference in new issue