Remove Windows-specific files and configurations for the rental income tracker project, including CMakeLists, resource files, and generated plugin registrants. This cleanup eliminates unnecessary dependencies and prepares the project for a more streamlined build process.

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-20 09:45:12 +01:00
parent 1eb8f90fa1
commit e10cde6fb9
97 changed files with 177 additions and 3729 deletions
+135
View File
@@ -0,0 +1,135 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:http/http.dart' as http;
import 'package:rental_income_tracker/models/app_settings.dart';
import 'package:rental_income_tracker/models/monthly_rent_record.dart';
import 'package:rental_income_tracker/services/notification_service.dart';
import 'package:rental_income_tracker/services/open_exchange_service.dart';
import 'package:rental_income_tracker/services/storage_service.dart';
import 'package:rental_income_tracker/state/rent_controller.dart';
class _FakeStorageService extends StorageService {
AppSettings _settings = AppSettings.defaults();
Map<String, MonthlyRentRecord> _records = <String, MonthlyRentRecord>{};
@override
Future<AppSettings> loadSettings() async => _settings;
@override
Future<void> saveSettings(AppSettings settings) async {
_settings = settings;
}
@override
Future<Map<String, MonthlyRentRecord>> loadRecords() async =>
Map<String, MonthlyRentRecord>.from(_records);
@override
Future<void> saveRecords(Map<String, MonthlyRentRecord> records) async {
_records = Map<String, MonthlyRentRecord>.from(records);
}
}
class _FakeExchangeService extends ForexRateApiService {
_FakeExchangeService() : super(httpClient: http.Client(), apiKey: 'test-key');
@override
Future<ForexConversionResult> convertUsdToSek({
required DateTime estDate,
required double amount,
}) async {
return ForexConversionResult(quote: 10, result: amount * 10);
}
}
class _RecordedMonth {
_RecordedMonth(this.year, this.month);
final int year;
final int month;
}
class _RecordingNotificationService extends NotificationService {
_RecordingNotificationService() : super((_) async {});
final List<_RecordedMonth> scheduled = <_RecordedMonth>[];
final List<_RecordedMonth> cancelled = <_RecordedMonth>[];
var cancelAllCount = 0;
@override
Future<void> initialize() async {}
@override
Future<void> processPendingActions() async {}
@override
Future<void> scheduleForMonth({
required int year,
required int month,
required int quietHourStart,
required int fallbackHour,
}) async {
scheduled.add(_RecordedMonth(year, month));
}
@override
Future<void> cancelForMonth(int year, int month) async {
cancelled.add(_RecordedMonth(year, month));
}
@override
Future<void> cancelAll() async {
cancelAllCount++;
}
}
void main() {
group('notification scheduling', () {
test('setOccupied(true) schedules multiple future months', () async {
final notifications = _RecordingNotificationService();
final controller = RentController(
storageService: _FakeStorageService(),
exchangeService: _FakeExchangeService(),
notificationService: notifications,
);
await controller.setOccupied(true);
expect(notifications.cancelAllCount, 1);
expect(notifications.scheduled.length, greaterThanOrEqualTo(12));
final now = DateTime.now();
expect(
notifications.scheduled.any(
(entry) => entry.year == now.year && entry.month == now.month,
),
isTrue,
);
final nextMonth = DateTime(now.year, now.month + 1, 1);
expect(
notifications.scheduled.any(
(entry) =>
entry.year == nextMonth.year && entry.month == nextMonth.month,
),
isTrue,
);
});
test(
'setOccupied(false) cancels notifications and does not reschedule',
() async {
final notifications = _RecordingNotificationService();
final controller = RentController(
storageService: _FakeStorageService(),
exchangeService: _FakeExchangeService(),
notificationService: notifications,
);
await controller.setOccupied(false);
expect(notifications.cancelAllCount, 1);
expect(notifications.scheduled, isEmpty);
},
);
});
}