import 'package:mileograph_flutter/objects/objects.dart'; import 'package:mileograph_flutter/services/api_service.dart'; import 'package:mileograph_flutter/services/authservice.dart'; import 'package:mileograph_flutter/services/data_service.dart'; import 'package:mileograph_flutter/services/distance_unit_service.dart'; import 'test_data.dart'; class FakeApiService extends ApiService { FakeApiService({super.baseUrl = 'https://example.com'}); final Map getResponses = {}; final Map postResponses = {}; @override Future get( String endpoint, { Map? headers, bool includeAuth = true, bool allowRetry = true, }) async { return getResponses[endpoint]; } @override Future post( String endpoint, dynamic data, { Map? headers, bool includeAuth = true, bool allowRetry = true, }) async { return postResponses[endpoint] ?? {}; } } class FakeAuthService extends AuthService { FakeAuthService({ required super.api, this.userIdValue = 'user-123', this.usernameValue = 'railfan', this.fullNameValue = 'Alex Rider', this.isElevatedValue = true, this.isLoggedInValue = true, }); final String? userIdValue; final String? usernameValue; final String? fullNameValue; final bool isElevatedValue; final bool isLoggedInValue; @override bool get isLoggedIn => isLoggedInValue; @override String? get userId => userIdValue; @override String? get username => usernameValue; @override String? get fullName => fullNameValue; @override bool get isElevated => isElevatedValue; } class FakeDataService extends DataService { FakeDataService({ApiService? api}) : super(api: api ?? FakeApiService()); HomepageStats? homepageStatsValue; bool isHomepageLoadingValue = false; List tripsValue = []; List onThisDayValue = []; bool isOnThisDayLoadingValue = false; List classClearanceProgressValue = []; bool isClassClearanceProgressLoadingValue = false; List tractionValue = []; bool isTractionLoadingValue = false; bool tractionHasMoreValue = false; List latestLocoChangesValue = []; bool isLatestLocoChangesLoadingValue = false; bool latestLocoChangesHasMoreValue = false; List legsValue = []; bool isLegsLoadingValue = false; bool legsHasMoreValue = false; List tripDetailsValue = []; List tripListValue = []; bool isTripDetailsLoadingValue = false; List locoClassesValue = []; List eventFieldsValue = []; bool isEventFieldsLoadingValue = false; int pendingLocoCountValue = 0; double currentYearMileageValue = 0; @override HomepageStats? get homepageStats => homepageStatsValue; @override bool get isHomepageLoading => isHomepageLoadingValue; @override List get trips => tripsValue; @override List get onThisDay => onThisDayValue; @override bool get isOnThisDayLoading => isOnThisDayLoadingValue; @override List get classClearanceProgress => classClearanceProgressValue; @override bool get isClassClearanceProgressLoading => isClassClearanceProgressLoadingValue; @override List get traction => tractionValue; @override bool get isTractionLoading => isTractionLoadingValue; @override bool get tractionHasMore => tractionHasMoreValue; @override List get latestLocoChanges => latestLocoChangesValue; @override bool get isLatestLocoChangesLoading => isLatestLocoChangesLoadingValue; @override bool get latestLocoChangesHasMore => latestLocoChangesHasMoreValue; @override List get legs => legsValue; @override bool get isLegsLoading => isLegsLoadingValue; @override bool get legsHasMore => legsHasMoreValue; @override List get tripDetails => tripDetailsValue; @override List get tripList => tripListValue; @override bool get isTripDetailsLoading => isTripDetailsLoadingValue; @override List get locoClasses => locoClassesValue; @override List get eventFields => eventFieldsValue; @override bool get isEventFieldsLoading => isEventFieldsLoadingValue; @override int get pendingLocoCount => pendingLocoCountValue; @override double getMileageForCurrentYear() => currentYearMileageValue; @override Future fetchHomepageStats() async {} @override Future fetchOnThisDay({DateTime? date}) async {} Future fetchTripDetails() async {} Future fetchHadTraction({int offset = 0, int limit = 100}) async {} Future fetchLatestLocoChanges({ int limit = 100, int offset = 0, bool append = false, }) async {} Future fetchClassClearanceProgress({ int offset = 0, int limit = 20, bool append = false, bool onlyIncomplete = false, }) async {} @override Future fetchLegs({ int offset = 0, int limit = 100, String sortBy = 'date', int sortDirection = 0, String? dateRangeStart, String? dateRangeEnd, bool append = false, bool unallocatedOnly = false, List networkFilter = const [], }) async {} Future> fetchTripLocoStats(int tripId) async { return const []; } Future fetchTraction({ bool hadOnly = false, int offset = 0, int limit = 100, String? locoClass, String? locoNumber, bool mileageFirst = true, bool append = false, Map? filters, }) async {} Future> fetchClassList({bool force = false}) async { return locoClassesValue; } @override Future fetchEventFields({bool force = false}) async {} @override Future fetchPendingLocoCount() async {} @override Future fetchStationNetworks() async {} Future?> fetchClassStats(String locoClass) async { return TestData.classStats; } Future> fetchClassLeaderboard( String locoClass, { bool friends = false, }) async { return TestData.classLeaderboard; } } class FakeDistanceUnitService extends DistanceUnitService { FakeDistanceUnitService({this.unitOverride}); final DistanceUnit? unitOverride; @override DistanceUnit get unit => unitOverride ?? super.unit; @override String format( double miles, { int decimals = 1, bool includeUnit = true, }) { final formatter = DistanceFormatter(unitOverride ?? super.unit); return formatter.format(miles, decimals: decimals, includeUnit: includeUnit); } }