Skip to content

Commit

Permalink
Add tests for anonymizing person and family
Browse files Browse the repository at this point in the history
  • Loading branch information
rasmusselsmark committed Jan 12, 2025
1 parent e46fa9e commit 863d875
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 2 deletions.
6 changes: 6 additions & 0 deletions members/models/family.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ def save(self, *args, **kwargs):
return super(Family, self).save(*args, **kwargs)

def anonymize(self):
non_anonymized_persons_in_family = self.person_set.filter(anonymized=False)
if non_anonymized_persons_in_family.count() != 0:
raise Exception(
"Cannot anonymize family with non-anonymized persons."
)

self.email = f"anonym-{self.id}@codingpirates.dk"
self.dont_send_mails = True
self.anonymized = True
Expand Down
1 change: 0 additions & 1 deletion members/models/person.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,6 @@ def anonymize(self):
self.floor = ""
self.door = ""
self.dawa_id = ""
self.municipality = None
self.longitude = None
self.latitude = None
self.placename = ""
Expand Down
2 changes: 1 addition & 1 deletion members/tests/factories/person_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class Meta:
) # Faker("email")
phone = Faker("phone_number")
gender = FuzzyChoice([code for (code, name) in Person.MEMBER_GENDER_CHOICES])
birthday = Faker("date")
birthday = Faker("date_of_birth", minimum_age=0, maximum_age=100)
# has_certificate = Faker("date")
family = SubFactory(FamilyFactory, email=email)
notes = Faker("text")
Expand Down
18 changes: 18 additions & 0 deletions members/tests/test_model_family.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,21 @@ def test_get_children(self):
# def test_get_abosolute_url(self):
# family = FamilyFactory()
# self.assertEqual("family_form", family.get_absolute_url())

def test_anonymize_family_with_no_members(self):
family = FamilyFactory(dont_send_mails=False)

family.anonymize()

self.assertEquals(family.email, f"anonym-{family.id}@codingpirates.dk")
self.assertTrue(family.dont_send_mails)
self.assertTrue(family.anonymized)

def test_cannot_anonymize_family_with_non_anonymized_members(self):
family = FamilyFactory()
person = PersonFactory(family=family)

with self.assertRaises(
Exception,
msg="Cannot anonymize family with non-anonymized persons."):
family.anonymize()
54 changes: 54 additions & 0 deletions members/tests/test_model_person.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,57 @@ def test_defaults_to_not_deleted(self):
def test_defaults_to_no_certificate(self):
person = PersonFactory()
self.assertEqual(person.has_certificate, None)

def test_anonymize_person_in_single_member_family(self):
person = PersonFactory()
birthday = person.birthday
municipality = person.municipality

person.anonymize()

self.assertTrue(person.anonymized)
self.assertEqual(person.name, "Anonymiseret")
self.assertEqual(person.zipcode, "")
self.assertEqual(person.municipality, municipality) # should not be changed

self.assertIsNotNone(person.birthday)

# only day changes, not month or year
self.assertEqual(person.birthday.year, birthday.year)
self.assertEqual(person.birthday.month, birthday.month)
self.assertNotEqual(person.birthday.day, birthday.day)

# given only one member of family, family should also be anonymized
self.assertTrue(person.family.anonymized)

def test_anonymize_single_person_in_multi_member_family(self):
person_1 = PersonFactory()
person_2 = PersonFactory(family=person_1.family)

# sanity check that they are in the same family
self.assertEquals(person_1.family, person_2.family)

person_1.anonymize()

self.assertTrue(person_1.anonymized)
self.assertFalse(person_2.anonymized)

# given more than one member of family, family should not be anonymized
self.assertFalse(person_1.family.anonymized)

def test_anonymize_all_persons_in_multi_member_family(self):
person_1 = PersonFactory()
person_2 = PersonFactory(family=person_1.family)

# sanity check that are are pointing to same family object
self.assertEquals(person_1.family, person_2.family)

person_1.anonymize()

self.assertTrue(person_1.anonymized)
self.assertFalse(person_1.family.anonymized) # not yet anonymized

person_2.anonymize()

self.assertTrue(person_2.anonymized)
self.assertTrue(person_2.family.anonymized)

0 comments on commit 863d875

Please sign in to comment.