159 lines
5.4 KiB
Dart
159 lines
5.4 KiB
Dart
import 'dart:convert';
|
|
import 'dart:io';
|
|
|
|
import 'package:christian_period_tracker/models/scripture.dart';
|
|
import 'package:christian_period_tracker/models/user_profile.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:hive_flutter/hive_flutter.dart';
|
|
import 'package:path_provider_platform_interface/path_provider_platform_interface.dart';
|
|
import 'package:mockito/mockito.dart';
|
|
import 'mocks.mocks.dart'; // Generated mock file
|
|
|
|
void main() {
|
|
TestWidgetsFlutterBinding.ensureInitialized();
|
|
|
|
group('Scripture', () {
|
|
test('fromJson creates a valid Scripture object', () {
|
|
final json = {
|
|
"verses": {
|
|
"esv": "Test verse",
|
|
},
|
|
"reference": "Test 1:1",
|
|
};
|
|
final scripture = Scripture.fromJson(json);
|
|
expect(scripture.reference, "Test 1:1");
|
|
expect(scripture.getVerse(BibleTranslation.esv), "Test verse");
|
|
});
|
|
});
|
|
|
|
group('ScriptureDatabase', () {
|
|
late ScriptureDatabase database;
|
|
late String testPath;
|
|
|
|
setUpAll(() async {
|
|
// Initialize path_provider_platform_interface for testing
|
|
// This is a common pattern for mocking platform-specific plugins in tests.
|
|
PathProviderPlatform.instance = _MockPathProviderPlatform();
|
|
testPath = '${Directory.current.path}/test_hive_temp';
|
|
|
|
// Ensure the directory exists
|
|
final Directory tempDir = Directory(testPath);
|
|
if (!await tempDir.exists()) {
|
|
await tempDir.create(recursive: true);
|
|
}
|
|
|
|
// Create and configure the mock BibleXmlParser
|
|
final mockBibleXmlParser = MockBibleXmlParser();
|
|
when(mockBibleXmlParser.getVerseFromAsset(any, any))
|
|
.thenAnswer((invocation) async {
|
|
final String reference = invocation.positionalArguments[1];
|
|
// Return a mock verse based on the reference for testing purposes
|
|
return 'Mock Verse for $reference';
|
|
});
|
|
|
|
// Mock the rootBundle for JSON assets (XML assets are now handled by mockBibleXmlParser)
|
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
|
.setMockMessageHandler(
|
|
'flutter/assets',
|
|
(ByteData? message) async {
|
|
final String key = utf8.decode(message!.buffer.asUint8List());
|
|
if (key == 'assets/scriptures.json' ||
|
|
key == 'assets/scriptures_optimized.json') {
|
|
final json = {
|
|
"menstrual": [
|
|
{
|
|
"verses": {"esv": "Menstrual verse"},
|
|
"reference": "Menstrual 1:1",
|
|
"applicablePhases": ["menstrual"]
|
|
}
|
|
],
|
|
"follicular": [
|
|
{
|
|
"verses": {"esv": "Follicular verse"},
|
|
"reference": "Follicular 1:1",
|
|
"applicablePhases": ["follicular"]
|
|
}
|
|
],
|
|
"ovulation": [
|
|
{
|
|
"verses": {"esv": "Ovulation verse"},
|
|
"reference": "Ovulation 1:1",
|
|
"applicablePhases": ["ovulation"]
|
|
}
|
|
],
|
|
"luteal": [
|
|
{
|
|
"verses": {"esv": "Luteal verse"},
|
|
"reference": "Luteal 1:1",
|
|
"applicablePhases": ["luteal"]
|
|
}
|
|
],
|
|
"husband": [
|
|
{
|
|
"verses": {"esv": "Husband verse"},
|
|
"reference": "Husband 1:1",
|
|
"applicablePhases": ["husband"]
|
|
}
|
|
],
|
|
"womanhood": [
|
|
{
|
|
"verses": {"esv": "Womanhood verse"},
|
|
"reference": "Womanhood 1:1",
|
|
"applicableContexts": ["womanhood"]
|
|
}
|
|
],
|
|
"contextual": {
|
|
"pain": [
|
|
{
|
|
"verses": {"esv": "Pain verse"},
|
|
"reference": "Pain 1:1",
|
|
"applicableContexts": ["pain"]
|
|
}
|
|
]
|
|
}
|
|
};
|
|
return utf8.encode(jsonEncode(json)).buffer.asByteData();
|
|
}
|
|
return null; // Return null for other asset requests not explicitly mocked
|
|
},
|
|
);
|
|
|
|
Hive.init(testPath);
|
|
Hive.registerAdapter(ScriptureAdapter()); // Register your adapter
|
|
Hive.registerAdapter(
|
|
BibleTranslationAdapter()); // Register BibleTranslationAdapter
|
|
database = ScriptureDatabase(
|
|
bibleXmlParser: mockBibleXmlParser); // Instantiate with mock
|
|
await database.loadScriptures();
|
|
});
|
|
|
|
tearDownAll(() async {
|
|
await Hive.close();
|
|
await Directory(testPath).delete(recursive: true);
|
|
});
|
|
|
|
test('getScriptureForPhase returns the correct scripture', () {
|
|
final scripture = database.getScriptureForPhase('menstrual');
|
|
expect(scripture.reference, "Menstrual 1:1");
|
|
});
|
|
|
|
test('getHusbandScripture returns a husband scripture', () {
|
|
final scripture = database.getHusbandScripture();
|
|
expect(scripture.applicablePhases, contains('husband'));
|
|
});
|
|
});
|
|
}
|
|
|
|
class _MockPathProviderPlatform extends PathProviderPlatform {
|
|
@override
|
|
Future<String?> getApplicationSupportPath() async {
|
|
return '${Directory.current.path}/test_hive_temp';
|
|
}
|
|
|
|
@override
|
|
Future<String?> getApplicationDocumentsPath() async {
|
|
return '${Directory.current.path}/test_hive_temp';
|
|
}
|
|
}
|