Skip to content

Commit

Permalink
test contact repo filter profile
Browse files Browse the repository at this point in the history
  • Loading branch information
LGro committed May 13, 2024
1 parent 5e5be95 commit 35e275d
Show file tree
Hide file tree
Showing 2 changed files with 147 additions and 49 deletions.
79 changes: 30 additions & 49 deletions lib/data/repositories/contacts.dart
Original file line number Diff line number Diff line change
Expand Up @@ -70,61 +70,42 @@ String contactDetailKey<T>(int i, T detail) {
return '';
}

List<T> filterContactDetailsList<T>(
List<T> values,
Map<String, List<String>> settings,
List<String> activeCircles,
) {
if (activeCircles.isEmpty) {
return [];
}
final updatedValues = Map<int, T>.from(values.asMap())
..removeWhere((i, e) => !(settings[contactDetailKey(i, e)]
?.asSet()
.intersectsWith(activeCircles.asSet()) ??
false));
return updatedValues.values.asList();
}

ContactDetails filterDetails(ContactDetails details,
ProfileSharingSettings settings, List<String> activeCircles) =>
ContactDetails(
// TODO: filter the names as well
displayName: details.displayName,
name: details.name,
phones: (details.phones.asMap()
..removeWhere((i, e) =>
(settings.phones[contactDetailKey(i, e)] ?? [])
.asSet()
.intersectsWith(activeCircles.asSet())))
.values
.asList(),
emails: (details.emails.asMap()
..removeWhere((i, e) =>
(settings.emails[contactDetailKey(i, e)] ?? [])
.asSet()
.intersectsWith(activeCircles.asSet())))
.values
.asList(),
addresses: (details.addresses.asMap()
..removeWhere((i, e) =>
(settings.addresses[contactDetailKey(i, e)] ?? [])
.asSet()
.intersectsWith(activeCircles.asSet())))
.values
.asList(),
organizations: (details.organizations.asMap()
..removeWhere((i, e) =>
(settings.organizations[contactDetailKey(i, e)] ?? [])
.asSet()
.intersectsWith(activeCircles.asSet())))
.values
.asList(),
websites: (details.websites.asMap()
..removeWhere((i, e) =>
(settings.websites[contactDetailKey(i, e)] ?? [])
.asSet()
.intersectsWith(activeCircles.asSet())))
.values
.asList(),
socialMedias: (details.socialMedias.asMap()
..removeWhere((i, e) =>
(settings.socialMedias[contactDetailKey(i, e)] ?? [])
.asSet()
.intersectsWith(activeCircles.asSet())))
.values
.asList(),
events: (details.events.asMap()
..removeWhere((i, e) =>
(settings.events[contactDetailKey(i, e)] ?? [])
.asSet()
.intersectsWith(activeCircles.asSet())))
.values
.asList(),
phones: filterContactDetailsList(
details.phones, settings.phones, activeCircles),
emails: filterContactDetailsList(
details.emails, settings.emails, activeCircles),
addresses: filterContactDetailsList(
details.addresses, settings.addresses, activeCircles),
organizations: filterContactDetailsList(
details.organizations, settings.organizations, activeCircles),
websites: filterContactDetailsList(
details.websites, settings.websites, activeCircles),
socialMedias: filterContactDetailsList(
details.socialMedias, settings.socialMedias, activeCircles),
events: filterContactDetailsList(
details.events, settings.events, activeCircles),
);

// TODO: Implement me; but maybe switch for address locations to a similar indexing scheme like with the other details for circles?
Expand Down
117 changes: 117 additions & 0 deletions test/data/repositories/contacts_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
// Copyright 2024 The Coagulate Authors. All rights reserved.
// SPDX-License-Identifier: MPL-2.0

import 'package:coagulate/data/models/coag_contact.dart';
import 'package:coagulate/data/models/contact_location.dart';
import 'package:coagulate/data/models/profile_sharing_settings.dart';
import 'package:coagulate/data/repositories/contacts.dart';
import 'package:flutter_contacts/flutter_contacts.dart';
import 'package:flutter_test/flutter_test.dart';

// TODO: Group tests
void main() {
test('contact detail key construction', () {
expect(contactDetailKey<Phone>(1, Phone('123', label: PhoneLabel.home)),
'1|home');
expect(
contactDetailKey<Phone>(
2, Phone('123', label: PhoneLabel.custom, customLabel: 'CUZTOM')),
'2|CUZTOM');
expect(
contactDetailKey<Organization>(
3, Organization(company: 'corp', title: 'CEO')),
'3|corp');
});

test('filter details list, no active circles', () {
final filtered = filterContactDetailsList<Phone>([Phone('123')], {}, []);
expect(filtered, []);
});

test('filter details list, no allowed circles', () {
final filtered =
filterContactDetailsList<Phone>([Phone('123')], {}, ['C1', 'C2']);
expect(filtered, []);
});

test('filter details list, one allowed circles', () {
final filtered = filterContactDetailsList<Phone>([
Phone('123', label: PhoneLabel.home),
Phone('321', label: PhoneLabel.work)
], {
'1|work': ['C2']
}, [
'C1',
'C2'
]);
expect(filtered, [Phone('321', label: PhoneLabel.work)]);
});

test('filter details without active circles', () {
final filteredDetails = filterDetails(
ContactDetails(
displayName: 'Display',
name: Name(first: 'first'),
phones: [Phone('1234')],
emails: [Email('hi@mail.com')],
addresses: [Address('Home 123')],
organizations: [Organization(company: 'Corp', title: 'CEO')],
socialMedias: [SocialMedia('@beste')],
websites: [Website('awesome.org')],
events: [Event(month: 1, day: 30)],
),
const ProfileSharingSettings(),
[]);
// TODO: Check that names are also filtered out
expect(filteredDetails.emails, []);
expect(filteredDetails.phones, []);
expect(filteredDetails.addresses, []);
expect(filteredDetails.organizations, []);
expect(filteredDetails.socialMedias, []);
expect(filteredDetails.websites, []);
expect(filteredDetails.events, []);
});

test('filter to future events', () {
final contact = CoagContact(
coagContactId: '1',
systemContact: Contact(displayName: 'Contact Name'),
temporaryLocations: [
ContactTemporaryLocation(
coagContactId: '1',
name: 'past',
details: '',
start: DateTime.now().subtract(Duration(days: 2)),
end: DateTime.now().subtract(Duration(days: 1)),
longitude: 12,
latitude: 13),
ContactTemporaryLocation(
coagContactId: '1',
name: 'less than a day ago',
details: '',
start: DateTime.now().subtract(const Duration(hours: 2)),
end: DateTime.now().subtract(const Duration(hours: 1)),
circles: const ['Circle'],
longitude: 12,
latitude: 13),
ContactTemporaryLocation(
coagContactId: '1',
name: 'future',
details: '',
start: DateTime.now().add(const Duration(days: 1)),
end: DateTime.now().add(const Duration(days: 2)),
circles: const ['Circle'],
longitude: 15,
latitude: 16),
]);
final filtered = filterAccordingToSharingProfile(
profile: contact,
settings: const ProfileSharingSettings(),
activeCircles: ['Circle'],
shareBackSettings: null);
expect(filtered.temporaryLocations.length, 2);
expect(filtered.temporaryLocations[0].name, 'less than a day ago');
expect(filtered.temporaryLocations[1].name, 'future');
expect(filtered.temporaryLocations[1], contact.temporaryLocations[2]);
});
}

0 comments on commit 35e275d

Please sign in to comment.