Files
rely/test/features/ai_digest/ai_digest_repository_test.dart
2026-05-18 20:33:54 +02:00

128 lines
4.4 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:relationship_saver/app/data/relationship_repository.dart';
import 'package:relationship_saver/app/data/storage/local_data_store_in_memory.dart';
import 'package:relationship_saver/app/data/storage/local_data_store_provider.dart';
import 'package:relationship_saver/app/state/local_data_state.dart';
import 'package:relationship_saver/features/ai_digest/domain/ai_digest_models.dart';
import 'package:relationship_saver/features/ideas/domain/idea_models.dart';
import 'package:relationship_saver/features/reminders/application/reminder_scheduler.dart';
import 'package:relationship_saver/features/reminders/application/reminder_scheduler_provider.dart';
import 'package:relationship_saver/features/sync/data/storage/sync_state_store_in_memory.dart';
import 'package:relationship_saver/features/sync/data/storage/sync_state_store_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
setUp(() {
SharedPreferences.setMockInitialValues(<String, Object>{});
});
test('accepting gift draft creates idea and marks draft accepted', () async {
final ProviderContainer container = _createContainer();
addTearDown(container.dispose);
final String personId = await _addTestPerson(container);
await container
.read(localRepositoryProvider.notifier)
.saveAiSuggestionDrafts(<AiSuggestionDraft>[
AiSuggestionDraft(
id: 'ai-1',
personId: personId,
kind: AiSuggestionKind.giftIdea,
title: 'Coffee sampler',
details: 'Small local roaster pack.',
suggestedAt: DateTime(2026, 5, 16),
confidence: 0.8,
status: AiSuggestionStatus.pending,
sourceRunId: 'run-1',
),
]);
await container
.read(localRepositoryProvider.notifier)
.acceptAiSuggestionDraft('ai-1');
final LocalDataState after = await container.read(
localRepositoryProvider.future,
);
expect(after.aiSuggestionDrafts.single.status, AiSuggestionStatus.accepted);
expect(
after.ideas.any(
(RelationshipIdea idea) =>
idea.personId == personId &&
idea.type == IdeaType.gift &&
idea.title == 'Coffee sampler',
),
isTrue,
);
});
test('dismissing draft does not create local artifacts', () async {
final ProviderContainer container = _createContainer();
addTearDown(container.dispose);
final String personId = await _addTestPerson(container);
final LocalDataState initial = await container.read(
localRepositoryProvider.future,
);
final int ideaCount = initial.ideas.length;
await container
.read(localRepositoryProvider.notifier)
.saveAiSuggestionDrafts(<AiSuggestionDraft>[
AiSuggestionDraft(
id: 'ai-2',
personId: personId,
kind: AiSuggestionKind.eventIdea,
title: 'Museum afternoon',
details: 'Pick a quiet exhibit.',
suggestedAt: DateTime(2026, 5, 16),
confidence: 0.7,
status: AiSuggestionStatus.pending,
sourceRunId: 'run-1',
),
]);
await container
.read(localRepositoryProvider.notifier)
.dismissAiSuggestionDraft('ai-2');
final LocalDataState after = await container.read(
localRepositoryProvider.future,
);
expect(
after.aiSuggestionDrafts.single.status,
AiSuggestionStatus.dismissed,
);
expect(after.ideas.length, ideaCount);
});
}
ProviderContainer _createContainer() {
return ProviderContainer(
overrides: [
localDataStoreProvider.overrideWithValue(InMemoryLocalDataStore()),
syncStateStoreProvider.overrideWithValue(InMemorySyncStateStore()),
reminderSchedulerProvider.overrideWithValue(
const NoopReminderScheduler(),
),
],
);
}
Future<String> _addTestPerson(ProviderContainer container) async {
await container.read(localRepositoryProvider.future);
await container
.read(localRepositoryProvider.notifier)
.addPerson(
name: 'Taylor Quinn',
relationship: 'Friend',
notes: '',
tags: const <String>[],
);
final LocalDataState state = await container.read(
localRepositoryProvider.future,
);
return state.people.single.id;
}