128 lines
4.4 KiB
Dart
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;
|
|
}
|