Add local preference signal scaffolding

This commit is contained in:
Rijad Zuzo
2026-02-22 23:19:49 +01:00
parent 058e2c1787
commit 8c79ba1345
4 changed files with 499 additions and 0 deletions
@@ -80,6 +80,84 @@ void main() {
expect(afterDelete.moments.length, beforeCount);
});
test('upserts inferred preference signals and updates status', () async {
final ProviderContainer container = _createContainer();
addTearDown(container.dispose);
final LocalDataState state = await container.read(
localRepositoryProvider.future,
);
final String personId = state.people.first.id;
final PersonPreferenceSignal first = await container
.read(localRepositoryProvider.notifier)
.upsertInferredPreferenceSignalObservation(
personId: personId,
key: 'drink:tea',
label: 'Tea',
category: 'drink',
polarity: PreferenceSignalPolarity.like,
confidence: 0.7,
sourceApp: 'whatsapp',
evidenceMessageId: 'sm-1',
evidenceSnippet: 'I prefer tea over coffee in the evening.',
);
final PersonPreferenceSignal second = await container
.read(localRepositoryProvider.notifier)
.upsertInferredPreferenceSignalObservation(
personId: personId,
key: 'drink:tea',
label: 'Tea',
category: 'drink',
polarity: PreferenceSignalPolarity.like,
confidence: 0.9,
sourceApp: 'imessage',
evidenceMessageId: 'sm-2',
evidenceSnippet: 'Tea sounds perfect after dinner.',
);
final LocalDataState afterUpsert = await container.read(
localRepositoryProvider.future,
);
final PersonPreferenceSignal signal = afterUpsert.preferenceSignals
.firstWhere((PersonPreferenceSignal item) => item.id == first.id);
expect(first.id, second.id);
expect(signal.personId, personId);
expect(signal.occurrenceCount, 2);
expect(signal.status, PreferenceSignalStatus.inferred);
expect(signal.confidence, closeTo(0.8, 0.001));
expect(signal.sourceApps, containsAll(<String>['whatsapp', 'imessage']));
expect(signal.evidenceMessageIds, containsAll(<String>['sm-1', 'sm-2']));
await container
.read(localRepositoryProvider.notifier)
.confirmPreferenceSignal(signal.id);
final LocalDataState afterConfirm = await container.read(
localRepositoryProvider.future,
);
expect(
afterConfirm.preferenceSignals
.firstWhere((PersonPreferenceSignal item) => item.id == signal.id)
.status,
PreferenceSignalStatus.confirmed,
);
await container
.read(localRepositoryProvider.notifier)
.dismissPreferenceSignal(signal.id);
final LocalDataState afterDismiss = await container.read(
localRepositoryProvider.future,
);
expect(
afterDismiss.preferenceSignals
.firstWhere((PersonPreferenceSignal item) => item.id == signal.id)
.status,
PreferenceSignalStatus.dismissed,
);
});
test(
'ingestSharedMessage auto-creates profile and reuses source link for follow-up messages',
() async {