Beispiel #1
0
class TestModelAnonymization(AnonymizedDataMixin, NotImplementedMixin,
                             TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.customer: Customer = Customer(**CUSTOMER__KWARGS)
        cls.customer.save()
        cls.base_encryption_key = 'LoremIpsum'

    def test_anonymize_customer(self):
        self.customer._anonymize_obj()
        anon_customer: Customer = Customer.objects.get(pk=self.customer.pk)

        assert_not_equal(anon_customer.first_name, CUSTOMER__FIRST_NAME)
        self.assertAnonymizedDataExists(anon_customer, 'first_name')
        assert_not_equal(anon_customer.last_name, CUSTOMER__LAST_NAME)
        self.assertAnonymizedDataExists(anon_customer, 'last_name')
        assert_not_equal(anon_customer.full_name,
                         '%s %s' % (CUSTOMER__FIRST_NAME, CUSTOMER__LAST_NAME))
        self.assertAnonymizedDataExists(anon_customer, 'full_name')
        assert_not_equal(anon_customer.primary_email_address, CUSTOMER__EMAIL)
        self.assertAnonymizedDataExists(anon_customer, 'primary_email_address')
        assert_not_equal(anon_customer.personal_id, CUSTOMER__PERSONAL_ID)
        self.assertAnonymizedDataExists(anon_customer, 'personal_id')
        assert_not_equal(anon_customer.phone_number, CUSTOMER__PHONE_NUMBER)
        self.assertAnonymizedDataExists(anon_customer, 'phone_number')
        assert_not_equal(anon_customer.birth_date, CUSTOMER__BIRTH_DATE)
        self.assertAnonymizedDataExists(anon_customer, 'first_name')
        assert_not_equal(anon_customer.facebook_id, CUSTOMER__FACEBOOK_ID)
        self.assertAnonymizedDataExists(anon_customer, 'first_name')
        assert_not_equal(str(anon_customer.last_login_ip), CUSTOMER__IP)
        self.assertAnonymizedDataExists(anon_customer, 'first_name')

    def test_anonymize_customer_registrations(self):
        other_registration: CustomerRegistration = CustomerRegistration.objects.create(
            email_address=CUSTOMER__EMAIL)
        last_registration: CustomerRegistration = CustomerRegistration.objects.create(
            email_address=CUSTOMER__EMAIL)
        legal_reason = LegalReason.objects.create_consent(
            EMAIL_SLUG, self.customer)
        legal_reason.expire()
        other_registration.refresh_from_db()
        last_registration.refresh_from_db()
        assert_not_equal(other_registration.email_address, CUSTOMER__EMAIL)
        assert_not_equal(last_registration.email_address, CUSTOMER__EMAIL)

    def test_email(self):
        self.email: Email = Email(customer=self.customer,
                                  email=CUSTOMER__EMAIL)
        self.email.save()
        self.email._anonymize_obj(base_encryption_key=self.base_encryption_key)
        anon_email: Email = Email.objects.get(pk=self.email.pk)

        assert_not_equal(anon_email.email, CUSTOMER__EMAIL)

    def test_address(self):
        self.address: Address = Address(
            customer=self.customer,
            street=ADDRESS__STREET,
            house_number=ADDRESS__HOUSE_NUMBER,
            city=ADDRESS__CITY,
            post_code=ADDRESS__POST_CODE,
        )
        self.address.save()
        self.address._anonymize_obj(
            base_encryption_key=self.base_encryption_key)
        anon_address: Address = Address.objects.get(pk=self.address.pk)

        assert_not_equal(anon_address.street, ADDRESS__STREET)
        self.assertAnonymizedDataExists(anon_address, 'street')
        assert_equal(anon_address.house_number, ADDRESS__HOUSE_NUMBER)
        assert_equal(anon_address.city, ADDRESS__CITY)
        assert_equal(anon_address.post_code, ADDRESS__POST_CODE)

    def test_account(self):
        self.account: Account = Account(
            customer=self.customer,
            number=ACCOUNT__NUMBER,
            owner=ACCOUNT__OWNER,
            IBAN=ACCOUNT__IBAN,
            swift=ACCOUNT__SWIFT,
        )
        self.account.save()
        self.account._anonymize_obj(
            base_encryption_key=self.base_encryption_key)

        anon_account: Account = Account.objects.get(pk=self.account.pk)

        assert_not_equal(anon_account.number, ACCOUNT__NUMBER)
        self.assertAnonymizedDataExists(anon_account, 'number')
        assert_not_equal(anon_account.owner, ACCOUNT__OWNER)
        self.assertAnonymizedDataExists(anon_account, 'owner')
        assert_not_equal(anon_account.IBAN, ACCOUNT__IBAN)
        self.assertAnonymizedDataExists(anon_account, 'IBAN')

    def test_payment(self):
        self.account: Account = Account(
            customer=self.customer,
            number=ACCOUNT__NUMBER,
            owner=ACCOUNT__OWNER,
            IBAN=ACCOUNT__IBAN,
            swift=ACCOUNT__SWIFT,
        )
        self.account.save()
        self.payment: Payment = Payment(
            account=self.account,
            value=PAYMENT__VALUE,
        )
        self.payment.save()
        payment_date = self.payment.date

        self.payment._anonymize_obj(
            base_encryption_key=self.base_encryption_key)

        anon_payment: Payment = Payment.objects.get(pk=self.payment.pk)

        assert_not_equal(anon_payment.value, PAYMENT__VALUE)
        self.assertAnonymizedDataExists(anon_payment, 'value')
        assert_not_equal(anon_payment.date, payment_date)
        self.assertAnonymizedDataExists(anon_payment, 'date')

    def test_contact_form(self):
        FULL_NAME = '%s %s' % (CUSTOMER__FIRST_NAME, CUSTOMER__LAST_NAME)
        self.contact_form: ContactForm = ContactForm(email=CUSTOMER__EMAIL,
                                                     full_name=FULL_NAME)
        self.contact_form.save()
        self.contact_form._anonymize_obj()

        anon_contact_form: ContactForm = ContactForm.objects.get(
            pk=self.contact_form.pk)

        assert_not_equal(anon_contact_form.email, CUSTOMER__EMAIL)
        self.assertAnonymizedDataExists(anon_contact_form, 'email')
        assert_not_equal(anon_contact_form.full_name, FULL_NAME)
        self.assertAnonymizedDataExists(anon_contact_form, 'full_name')

    def test_anonymization_of_anonymized_data(self):
        '''Test that anonymized data are not anonymized again.'''
        self.customer._anonymize_obj()
        anon_customer: Customer = Customer.objects.get(pk=self.customer.pk)

        assert_not_equal(anon_customer.first_name, CUSTOMER__FIRST_NAME)
        self.assertAnonymizedDataExists(anon_customer, 'first_name')

        anon_customer._anonymize_obj()
        anon_customer2: Customer = Customer.objects.get(pk=self.customer.pk)

        assert_equal(anon_customer2.first_name, anon_customer.first_name)
        assert_not_equal(anon_customer2.first_name, CUSTOMER__FIRST_NAME)

    def test_anonymization_field_matrix(self):
        self.customer._anonymize_obj(fields=('first_name', ))
        anon_customer: Customer = Customer.objects.get(pk=self.customer.pk)

        assert_not_equal(anon_customer.first_name, CUSTOMER__FIRST_NAME)
        self.assertAnonymizedDataExists(anon_customer, 'first_name')

        assert_equal(anon_customer.last_name, CUSTOMER__LAST_NAME)
        self.assertAnonymizedDataNotExists(anon_customer, 'last_name')

    def test_anonymization_field_matrix_related(self):
        related_email: Email = Email(customer=self.customer,
                                     email=CUSTOMER__EMAIL)
        related_email.save()

        self.customer._anonymize_obj(fields=('first_name', ('emails',
                                                            ('email', ))))
        anon_customer: Customer = Customer.objects.get(pk=self.customer.pk)

        assert_not_equal(anon_customer.first_name, CUSTOMER__FIRST_NAME)
        self.assertAnonymizedDataExists(anon_customer, 'first_name')

        assert_equal(anon_customer.last_name, CUSTOMER__LAST_NAME)
        self.assertAnonymizedDataNotExists(anon_customer, 'last_name')

        anon_related_email: Email = Email.objects.get(pk=related_email.pk)

        assert_not_equal(anon_related_email.email, CUSTOMER__EMAIL)
        self.assertAnonymizedDataExists(anon_related_email, 'email')

    def test_anonymization_field_matrix_related_all(self):
        related_email: Email = Email(customer=self.customer,
                                     email=CUSTOMER__EMAIL)
        related_email.save()

        self.customer._anonymize_obj(fields=('first_name', ('emails',
                                                            '__ALL__')))
        anon_customer: Customer = Customer.objects.get(pk=self.customer.pk)

        assert_not_equal(anon_customer.first_name, CUSTOMER__FIRST_NAME)
        self.assertAnonymizedDataExists(anon_customer, 'first_name')

        assert_equal(anon_customer.last_name, CUSTOMER__LAST_NAME)
        self.assertAnonymizedDataNotExists(anon_customer, 'last_name')

        anon_related_email: Email = Email.objects.get(pk=related_email.pk)

        assert_not_equal(anon_related_email.email, CUSTOMER__EMAIL)
        self.assertAnonymizedDataExists(anon_related_email, 'email')

    def test_reverse_generic_relation(self):
        note: Note = Note(note='Test message')
        note.content_object = self.customer
        note.save()

        self.customer._anonymize_obj(fields=(('notes', '__ALL__'), ))

        anon_note: Note = Note.objects.get(pk=note.pk)

        assert_not_equal(anon_note.note, note.note)
        self.assertAnonymizedDataExists(note, 'note')

        self.customer._deanonymize_obj(fields=(('notes', '__ALL__'), ))

        anon_note2: Note = Note.objects.get(pk=note.pk)

        assert_equal(anon_note2.note, note.note)
        self.assertAnonymizedDataNotExists(note, 'note')

    def test_irreversible_deanonymization(self):
        contact_form: ContactForm = ContactForm(email=CUSTOMER__EMAIL,
                                                full_name=CUSTOMER__LAST_NAME)
        contact_form.save()
        contact_form._anonymize_obj(fields=('__ALL__', ))

        assert_raises(ModelAnonymizer.IrreversibleAnonymizerException,
                      contact_form._deanonymize_obj,
                      fields=('__ALL__', ))

    def test_generic_relation_anonymizer(self):
        contact_form: ContactForm = ContactForm(email=CUSTOMER__EMAIL,
                                                full_name=CUSTOMER__LAST_NAME)
        contact_form.save()
        note: Note = Note(note='Test message')
        note.content_object = contact_form
        note.save()

        note._anonymize_obj(fields=(('contact_form', '__ALL__'), ),
                            base_encryption_key=self.base_encryption_key)

        anon_contact_form: ContactForm = ContactForm.objects.get(
            pk=contact_form.pk)

        assert_not_equal(anon_contact_form.email, CUSTOMER__EMAIL)
        self.assertAnonymizedDataExists(anon_contact_form, 'email')
        assert_not_equal(anon_contact_form.full_name, CUSTOMER__LAST_NAME)
        self.assertAnonymizedDataExists(anon_contact_form, 'full_name')

    @skipIf(not is_reversion_installed(), 'Django-reversion is not installed.')
    def test_reversion_anonymization(self):
        from reversion import revisions as reversion
        from reversion.models import Version
        from gdpr.utils import get_reversion_versions

        anon = ContactFormAnonymizer()
        anon.Meta.anonymize_reversion = True
        anon.Meta.reversible_anonymization = True

        user = User(username='******')
        user.save()

        with reversion.create_revision():
            form = ContactForm()
            form.email = CUSTOMER__EMAIL
            form.full_name = CUSTOMER__LAST_NAME
            form.save()

            reversion.set_user(user)

        with reversion.create_revision():
            form.email = CUSTOMER__EMAIL2
            form.save()

            reversion.set_user(user)

        with reversion.create_revision():
            form.email = CUSTOMER__EMAIL3
            form.save()

            reversion.set_user(user)

        versions: List[Version] = get_reversion_versions(form).order_by('id')

        assert_equal(versions[0].field_dict['email'], CUSTOMER__EMAIL)
        assert_equal(versions[1].field_dict['email'], CUSTOMER__EMAIL2)
        assert_equal(versions[2].field_dict['email'], CUSTOMER__EMAIL3)

        anon.anonymize_obj(form, base_encryption_key=self.base_encryption_key)

        anon_versions: List[Version] = get_reversion_versions(form).order_by(
            'id')
        anon_form = ContactForm.objects.get(pk=form.pk)

        assert_not_equal(anon_versions[0].field_dict['email'], CUSTOMER__EMAIL)
        assert_not_equal(anon_versions[1].field_dict['email'],
                         CUSTOMER__EMAIL2)
        assert_not_equal(anon_versions[2].field_dict['email'],
                         CUSTOMER__EMAIL3)
        assert_not_equal(anon_form.email, CUSTOMER__EMAIL3)

        anon.deanonymize_obj(anon_form,
                             base_encryption_key=self.base_encryption_key)

        deanon_versions: List[Version] = get_reversion_versions(form).order_by(
            'id')
        deanon_form = ContactForm.objects.get(pk=form.pk)

        assert_equal(deanon_versions[0].field_dict['email'], CUSTOMER__EMAIL)
        assert_equal(deanon_versions[1].field_dict['email'], CUSTOMER__EMAIL2)
        assert_equal(deanon_versions[2].field_dict['email'], CUSTOMER__EMAIL3)
        assert_equal(deanon_form.email, CUSTOMER__EMAIL3)
        assert_dict_equal(versions[0].field_dict,
                          deanon_versions[0].field_dict)
        assert_dict_equal(versions[1].field_dict,
                          deanon_versions[1].field_dict)
        assert_dict_equal(versions[2].field_dict,
                          deanon_versions[2].field_dict)

    @skipIf(not is_reversion_installed(), 'Django-reversion is not installed.')
    def test_reversion_delete(self):
        from reversion import revisions as reversion
        from reversion.models import Version
        from gdpr.utils import get_reversion_versions

        anon = ContactFormAnonymizer()
        anon.Meta.delete_reversion = True

        user = User(username='******')
        user.save()

        with reversion.create_revision():
            form = ContactForm()
            form.email = CUSTOMER__EMAIL
            form.full_name = CUSTOMER__LAST_NAME
            form.save()

            reversion.set_user(user)

        with reversion.create_revision():
            form.email = CUSTOMER__EMAIL2
            form.save()

            reversion.set_user(user)

        with reversion.create_revision():
            form.email = CUSTOMER__EMAIL3
            form.save()

            reversion.set_user(user)

        versions: List[Version] = get_reversion_versions(form).order_by('id')

        assert_equal(versions[0].field_dict['email'], CUSTOMER__EMAIL)
        assert_equal(versions[1].field_dict['email'], CUSTOMER__EMAIL2)
        assert_equal(versions[2].field_dict['email'], CUSTOMER__EMAIL3)

        anon.anonymize_obj(form, base_encryption_key=self.base_encryption_key)

        anon_versions: List[Version] = get_reversion_versions(form).order_by(
            'id')
        assert_equal(len(anon_versions), 0)

    def test_get_all_parent_objects(self):
        e = ChildE.objects.create(name='Lorem',
                                  first_name='Ipsum',
                                  last_name='Dolor',
                                  birth_date=CUSTOMER__BIRTH_DATE,
                                  note='sit Amet')

        parent_objects = get_all_parent_objects(e)
        assert_equal(len(parent_objects), 4)
        assert_equal([obj.__class__ for obj in parent_objects],
                     [ParentC, ExtraParentD, ParentB, TopParentA])

    @skipIf(not is_reversion_installed(), 'Django-reversion is not installed.')
    def test_get_all_obj_and_parent_versions_queryset_list(self):
        from reversion import revisions as reversion

        with reversion.create_revision():
            e = ChildE()
            e.name = 'Lorem'
            e.first_name = 'Ipsum'
            e.last_name = 'Dolor'
            e.birth_date = CUSTOMER__BIRTH_DATE
            e.note = 'sit Amet'
            e.save()

        versions_queryset_list = get_all_obj_and_parent_versions_queryset_list(
            e)
        assert_equal(len(versions_queryset_list), 5)
        assert_equal([
            qs[0]._content_type.model_class() for qs in versions_queryset_list
        ], [ParentC, ExtraParentD, ParentB, TopParentA, ChildE])

    @skipIf(not is_reversion_installed(), 'Django-reversion is not installed.')
    def test_get_all_obj_and_parent_versions(self):
        from reversion import revisions as reversion

        with reversion.create_revision():
            e = ChildE()
            e.name = 'Lorem'
            e.first_name = 'Ipsum'
            e.last_name = 'Dolor'
            e.birth_date = CUSTOMER__BIRTH_DATE
            e.note = 'sit Amet'
            e.save()

        versions_list = get_all_obj_and_parent_versions(e)
        assert_equal(len(versions_list), 5)
        assert_equal(
            [version._content_type.model_class() for version in versions_list],
            [ParentC, ExtraParentD, ParentB, TopParentA, ChildE])

    @skipIf(not is_reversion_installed(), 'Django-reversion is not installed.')
    def test_reversion_anonymization_parents(self):
        from reversion import revisions as reversion
        from reversion.models import Version

        anon = ChildEAnonymizer()

        user = User(username='******')
        user.save()

        with reversion.create_revision():
            e = ChildE()
            e.name = 'Lorem'
            e.first_name = 'Ipsum'
            e.last_name = 'Dolor'
            e.birth_date = CUSTOMER__BIRTH_DATE
            e.note = 'sit Amet'
            e.save()

            reversion.set_user(user)

        with reversion.create_revision():
            e.name = 'LOREM'
            e.first_name = 'IPSUM'
            e.last_name = 'DOLOR'
            e.birth_date = CUSTOMER__BIRTH_DATE + timedelta(days=2)
            e.note = 'SIT AMET'
            e.save()

            reversion.set_user(user)

        versions_a: List[Version] = get_reversion_versions(
            e.topparenta_ptr).order_by('id')
        versions_b: List[Version] = get_reversion_versions(
            e.parentb_ptr).order_by('id')
        versions_c: List[Version] = get_reversion_versions(
            e.parentc_ptr).order_by('id')
        versions_d: List[Version] = get_reversion_versions(
            e.extraparentd_ptr).order_by('id')
        versions_e: List[Version] = get_reversion_versions(e).order_by('id')

        assert_equal(
            get_reversion_local_field_dict(versions_a[0])['name'], 'Lorem')
        assert_equal(
            get_reversion_local_field_dict(versions_a[1])['name'], 'LOREM')

        assert_equal(
            get_reversion_local_field_dict(versions_b[0])['birth_date'],
            CUSTOMER__BIRTH_DATE)
        assert_equal(
            get_reversion_local_field_dict(versions_b[1])['birth_date'],
            CUSTOMER__BIRTH_DATE + timedelta(days=2))

        assert_equal(
            get_reversion_local_field_dict(versions_c[0])['first_name'],
            'Ipsum')
        assert_equal(
            get_reversion_local_field_dict(versions_c[1])['first_name'],
            'IPSUM')

        assert_equal(
            get_reversion_local_field_dict(versions_d[0])['note'], 'sit Amet')
        assert_equal(
            get_reversion_local_field_dict(versions_d[1])['note'], 'SIT AMET')

        assert_equal(
            get_reversion_local_field_dict(versions_e[0])['last_name'],
            'Dolor')
        assert_equal(
            get_reversion_local_field_dict(versions_e[1])['last_name'],
            'DOLOR')

        anon.anonymize_obj(e, base_encryption_key=self.base_encryption_key)

        anon_versions_a: List[Version] = get_reversion_versions(
            e.topparenta_ptr).order_by('id')
        anon_versions_b: List[Version] = get_reversion_versions(
            e.parentb_ptr).order_by('id')
        anon_versions_c: List[Version] = get_reversion_versions(
            e.parentc_ptr).order_by('id')
        anon_versions_d: List[Version] = get_reversion_versions(
            e.extraparentd_ptr).order_by('id')
        anon_versions_e: List[Version] = get_reversion_versions(e).order_by(
            'id')
        anon_e = ChildE.objects.get(pk=e.pk)

        assert_not_equal(
            get_reversion_local_field_dict(anon_versions_a[0])['name'],
            'Lorem')
        assert_not_equal(
            get_reversion_local_field_dict(anon_versions_a[1])['name'],
            'LOREM')

        assert_not_equal(
            get_reversion_local_field_dict(anon_versions_b[0])['birth_date'],
            CUSTOMER__BIRTH_DATE)
        assert_not_equal(
            get_reversion_local_field_dict(anon_versions_b[1])['birth_date'],
            CUSTOMER__BIRTH_DATE + timedelta(days=2))

        assert_not_equal(
            get_reversion_local_field_dict(anon_versions_c[0])['first_name'],
            'Ipsum')
        assert_not_equal(
            get_reversion_local_field_dict(anon_versions_c[1])['first_name'],
            'IPSUM')

        assert_not_equal(
            get_reversion_local_field_dict(anon_versions_d[0])['note'],
            'sit Amet')
        assert_not_equal(
            get_reversion_local_field_dict(anon_versions_d[1])['note'],
            'SIT AMET')

        assert_not_equal(
            get_reversion_local_field_dict(anon_versions_e[0])['last_name'],
            'Dolor')
        assert_not_equal(
            get_reversion_local_field_dict(anon_versions_e[1])['last_name'],
            'DOLOR')

        anon.deanonymize_obj(anon_e,
                             base_encryption_key=self.base_encryption_key)

        deanon_versions_a: List[Version] = get_reversion_versions(
            e.topparenta_ptr).order_by('id')
        deanon_versions_b: List[Version] = get_reversion_versions(
            e.parentb_ptr).order_by('id')
        deanon_versions_c: List[Version] = get_reversion_versions(
            e.parentc_ptr).order_by('id')
        deanon_versions_d: List[Version] = get_reversion_versions(
            e.extraparentd_ptr).order_by('id')
        deanon_versions_e: List[Version] = get_reversion_versions(e).order_by(
            'id')

        assert_equal(
            get_reversion_local_field_dict(deanon_versions_a[0])['name'],
            'Lorem')
        assert_equal(
            get_reversion_local_field_dict(deanon_versions_a[1])['name'],
            'LOREM')

        assert_equal(
            get_reversion_local_field_dict(deanon_versions_b[0])['birth_date'],
            CUSTOMER__BIRTH_DATE)
        assert_equal(
            get_reversion_local_field_dict(deanon_versions_b[1])['birth_date'],
            CUSTOMER__BIRTH_DATE + timedelta(days=2))

        assert_equal(
            get_reversion_local_field_dict(deanon_versions_c[0])['first_name'],
            'Ipsum')
        assert_equal(
            get_reversion_local_field_dict(deanon_versions_c[1])['first_name'],
            'IPSUM')

        assert_equal(
            get_reversion_local_field_dict(deanon_versions_d[0])['note'],
            'sit Amet')
        assert_equal(
            get_reversion_local_field_dict(deanon_versions_d[1])['note'],
            'SIT AMET')

        assert_equal(
            get_reversion_local_field_dict(deanon_versions_e[0])['last_name'],
            'Dolor')
        assert_equal(
            get_reversion_local_field_dict(deanon_versions_e[1])['last_name'],
            'DOLOR')
Beispiel #2
0

class ParentC(ParentB):
    first_name = models.CharField(max_length=250)


class ExtraParentD(AnonymizationModel):
    id_d = models.AutoField(primary_key=True, editable=False)
    note = models.CharField(max_length=250)


class ChildE(ParentC, ExtraParentD):
    last_name = models.CharField(max_length=250)


if is_reversion_installed():
    from reversion import revisions as reversion

    reversion.register(Customer)
    reversion.register(Email)
    reversion.register(Address)
    reversion.register(Account)
    reversion.register(Payment)
    reversion.register(ContactForm)
    reversion.register(Note)
    reversion.register(TopParentA)
    reversion.register(ParentB, follow=('topparenta_ptr',))
    reversion.register(ParentC, follow=('parentb_ptr',))
    reversion.register(ExtraParentD)
    reversion.register(ChildE, follow=('parentc_ptr', 'extraparentd_ptr'))