88 lines
3.1 KiB
Dart
88 lines
3.1 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:fuel_tax_tracker/services/app_state.dart';
|
|
import 'package:fuel_tax_tracker/services/database_service.dart';
|
|
import 'package:path_provider_platform_interface/path_provider_platform_interface.dart';
|
|
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
|
|
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
|
|
|
|
/// Covers the "pay to remove ads for a year" entitlement outside of the
|
|
/// merge SQL itself (see db_merge_test.dart for that): [DatabaseService]'s
|
|
/// storage round-trip, and [AppState.adsCurrentlyDisabled]'s pure
|
|
/// expiry-comparison logic.
|
|
void main() {
|
|
group('DatabaseService ad-free entitlement storage', () {
|
|
late Directory tempDir;
|
|
late DatabaseService database;
|
|
|
|
setUpAll(() {
|
|
sqfliteFfiInit();
|
|
databaseFactory = databaseFactoryFfi;
|
|
});
|
|
|
|
setUp(() async {
|
|
tempDir = await Directory.systemTemp.createTemp('ad_free_entitlement_test_');
|
|
PathProviderPlatform.instance = _FakePathProviderPlatform(tempDir.path);
|
|
database = DatabaseService();
|
|
await database.init();
|
|
});
|
|
|
|
tearDown(() async {
|
|
await database.rawDb.close();
|
|
await tempDir.delete(recursive: true);
|
|
});
|
|
|
|
test('getAdFreeUntil is null before any purchase is recorded', () async {
|
|
expect(await database.getAdFreeUntil(), isNull);
|
|
});
|
|
|
|
test('setAdFreeUntil then getAdFreeUntil round-trips the value', () async {
|
|
final until = DateTime.utc(2027, 8, 13);
|
|
final now = DateTime.utc(2026, 8, 13);
|
|
|
|
await database.setAdFreeUntil(until, now);
|
|
|
|
expect(await database.getAdFreeUntil(), until);
|
|
});
|
|
|
|
test('setAdFreeUntil overwrites a previous value rather than adding a row', () async {
|
|
await database.setAdFreeUntil(DateTime.utc(2027, 1, 1), DateTime.utc(2026, 1, 1));
|
|
await database.setAdFreeUntil(DateTime.utc(2028, 1, 1), DateTime.utc(2027, 1, 1));
|
|
|
|
final rows = await database.rawDb.query('ad_free_entitlement');
|
|
expect(rows, hasLength(1));
|
|
expect(await database.getAdFreeUntil(), DateTime.utc(2028, 1, 1));
|
|
});
|
|
});
|
|
|
|
group('AppState.adsCurrentlyDisabled', () {
|
|
test('false when no entitlement has ever been recorded', () {
|
|
final appState = AppState();
|
|
expect(appState.adsCurrentlyDisabled, isFalse);
|
|
});
|
|
|
|
test('true when the entitlement date is in the future', () {
|
|
final appState = AppState();
|
|
appState.adFreeUntil = DateTime.now().toUtc().add(const Duration(days: 30));
|
|
expect(appState.adsCurrentlyDisabled, isTrue);
|
|
});
|
|
|
|
test('false once the entitlement date is in the past (the year lapsed)', () {
|
|
final appState = AppState();
|
|
appState.adFreeUntil = DateTime.now().toUtc().subtract(const Duration(days: 1));
|
|
expect(appState.adsCurrentlyDisabled, isFalse);
|
|
});
|
|
});
|
|
}
|
|
|
|
class _FakePathProviderPlatform extends PathProviderPlatform with MockPlatformInterfaceMixin {
|
|
final String tempPath;
|
|
_FakePathProviderPlatform(this.tempPath);
|
|
|
|
@override
|
|
Future<String?> getApplicationDocumentsPath() async => tempPath;
|
|
|
|
@override
|
|
Future<String?> getTemporaryPath() async => tempPath;
|
|
}
|