onedirve and google drive

This commit is contained in:
Courtney Arnold 2026-08-14 17:30:31 -05:00
parent a9bcec09b1
commit 901ec678a3
12 changed files with 373 additions and 29 deletions

View file

@ -0,0 +1,104 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:provider/provider.dart';
import 'package:fuel_tax_tracker/models/vehicle.dart';
import 'package:fuel_tax_tracker/screens/add_edit_vehicle_screen.dart';
import 'package:fuel_tax_tracker/screens/vehicle_detail_screen.dart';
import 'package:fuel_tax_tracker/services/app_state.dart';
/// Covers the "VIN already belongs to another vehicle" dialog on the Add
/// Vehicle form — [AddEditVehicleScreen] driven directly against an
/// [AppState] whose in-memory `vehicles` list is seeded by hand (no
/// database/cloud wiring needed, since the dialog only reads
/// [AppState.vehicleByVin]).
void main() {
final existingVehicle = Vehicle(
id: 'existing-id',
vin: '1FMPU18L1TLB51349',
nickname: 'Red Truck',
updatedAt: DateTime.utc(2026, 1, 1),
);
Future<AppState> pumpAddVehicleScreen(WidgetTester tester) async {
final appState = AppState()
..isLoading = false
..vehicles = [existingVehicle];
await tester.pumpWidget(
ChangeNotifierProvider.value(
value: appState,
child: const MaterialApp(home: AddEditVehicleScreen()),
),
);
return appState;
}
testWidgets('entering a VIN that already exists shows the dialog', (tester) async {
await pumpAddVehicleScreen(tester);
await tester.enterText(find.widgetWithText(TextFormField, 'VIN *'), existingVehicle.vin);
await tester.pumpAndSettle();
expect(find.text('Vehicle already exists'), findsOneWidget);
expect(
find.text(
'Vehicle with the VIN ${existingVehicle.vin} already exists, would you like to open that vehicle?',
),
findsOneWidget,
);
});
testWidgets('tapping No dismisses the dialog and stays on the create screen', (tester) async {
await pumpAddVehicleScreen(tester);
await tester.enterText(find.widgetWithText(TextFormField, 'VIN *'), existingVehicle.vin);
await tester.pumpAndSettle();
await tester.tap(find.widgetWithText(TextButton, 'No'));
await tester.pumpAndSettle();
expect(find.text('Vehicle already exists'), findsNothing);
expect(find.text('Add Vehicle'), findsWidgets);
expect(
find.text('A vehicle with VIN "${existingVehicle.vin}" already exists.'),
findsOneWidget,
reason: 'the field itself should be flagged invalid after declining to open the existing vehicle',
);
});
testWidgets('tapping Yes opens the existing vehicle', (tester) async {
await pumpAddVehicleScreen(tester);
await tester.enterText(find.widgetWithText(TextFormField, 'VIN *'), existingVehicle.vin);
await tester.pumpAndSettle();
await tester.tap(find.widgetWithText(TextButton, 'Yes'));
await tester.pumpAndSettle();
expect(find.byType(VehicleDetailScreen), findsOneWidget);
expect(find.text(existingVehicle.displayLabel), findsOneWidget);
expect(find.byType(AddEditVehicleScreen), findsNothing,
reason: 'the create screen should be popped, not left underneath');
});
testWidgets('editing a vehicle with its own VIN does not trigger the dialog', (tester) async {
final appState = AppState()
..isLoading = false
..vehicles = [existingVehicle];
await tester.pumpWidget(
ChangeNotifierProvider.value(
value: appState,
child: MaterialApp(home: AddEditVehicleScreen(vehicle: existingVehicle)),
),
);
// The field already starts pre-filled with its own VIN; nudge it to
// fire onChanged the same way a real edit would.
await tester.enterText(find.widgetWithText(TextFormField, 'VIN *'), existingVehicle.vin);
await tester.pumpAndSettle();
expect(find.text('Vehicle already exists'), findsNothing);
});
}