def test_verification_when_user_is_wrongly_deleted_fails(self):
        pending_deletion_request = (
            wipeout_service.get_pending_deletion_request(self.user_1_id))
        wipeout_service.delete_user(pending_deletion_request)
        pending_deletion_request.deletion_complete = True
        wipeout_service.save_pending_deletion_requests(
            [pending_deletion_request])

        email_content = (
            'The Wipeout process failed for the user with ID \'%s\' '
            'and email \'%s\'.' % (self.user_1_id, self.USER_1_EMAIL)
        )
        send_email_swap = self.swap_with_checks(
            email_manager,
            'send_mail_to_admin',
            lambda x, y: None,
            expected_args=[('WIPEOUT: Account deletion failed', email_content)]
        )

        user_models.CompletedActivitiesModel(
            id=self.user_1_id, exploration_ids=[], collection_ids=[],
            story_ids=[], learnt_topic_ids=[]
        ).put()
        with send_email_swap:
            output = self._run_one_off_job()
        self.assertIn(['FAILURE', [self.user_1_id]], output)
Пример #2
0
    def test_delete_user_broken(self):
        wipeout_service.delete_user(
            user_models.PendingDeletionRequestModel.get_by_id(self.user_2_id))

        user_models.CompletedActivitiesModel(
            id=self.user_2_id, exploration_ids=[], collection_ids=[]
        ).put()
        user_models.IncompleteActivitiesModel(
            id=self.user_2_id, exploration_ids=[], collection_ids=[]
        ).put()
        user_models.LearnerPlaylistModel(
            id=self.user_2_id, exploration_ids=[], collection_ids=[]
        ).put()

        self.assertFalse(wipeout_service.verify_user_deleted(
            user_models.PendingDeletionRequestModel.get_by_id(self.user_2_id)))
        pending_deletion_model = (
            user_models.PendingDeletionRequestModel.get_by_id(self.user_2_id))
        self.assertIsNotNone(pending_deletion_model)
        self.assertFalse(pending_deletion_model.deletion_complete)

        wipeout_service.delete_user(pending_deletion_model)
        self.assertTrue(wipeout_service.verify_user_deleted(
            user_models.PendingDeletionRequestModel.get_by_id(self.user_2_id)))
        self.assertIsNone(
            user_models.PendingDeletionRequestModel.get_by_id(self.user_2_id))
Пример #3
0
    def test_delete_user_collection_exploration_single(self):
        self.save_new_valid_exploration(self.EXPLORATION_1_ID, self.user_1_id)
        self.save_new_valid_collection(self.COLLECTION_1_ID,
                                       self.user_1_id,
                                       exploration_id=self.EXPLORATION_1_ID)

        wipeout_service.pre_delete_user(self.user_1_id)

        self.assertIsNotNone(
            user_models.UserSettingsModel.get_by_id(self.user_1_id))
        self.assertIsNotNone(
            user_models.UserEmailPreferencesModel.get_by_id(self.user_1_id))
        self.assertIsNotNone(
            collection_models.CollectionModel.get_by_id(self.COLLECTION_1_ID))
        self.assertIsNotNone(
            exp_models.ExplorationModel.get_by_id(self.EXPLORATION_1_ID))

        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_1_id))

        self.assertIsNone(
            user_models.UserSettingsModel.get_by_id(self.user_1_id))
        self.assertIsNone(
            user_models.UserEmailPreferencesModel.get_by_id(self.user_1_id))
        self.assertIsNone(
            collection_models.CollectionModel.get_by_id(self.COLLECTION_1_ID))
        self.assertIsNone(
            exp_models.ExplorationModel.get_by_id(self.EXPLORATION_1_ID))
Пример #4
0
    def test_multiple_stories_are_pseudonymized(self):
        self.save_new_topic(self.TOPIC_1_ID, self.user_1_id, name='Topic 2')
        self.save_new_story(self.STORY_2_ID, self.user_1_id, self.TOPIC_1_ID)

        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_1_id))

        pending_deletion_model = (
            user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id))
        metadata_model = story_models.StorySnapshotMetadataModel.get_by_id(
            '%s-1' % self.STORY_1_ID)
        self.assertEqual(
            metadata_model.committer_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])
        commit_log_model = story_models.StoryCommitLogEntryModel.get_by_id(
            'story-%s-1' % self.STORY_1_ID)
        self.assertEqual(
            commit_log_model.user_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])
        metadata_model = story_models.StorySnapshotMetadataModel.get_by_id(
            '%s-1' % self.STORY_2_ID)
        self.assertEqual(
            metadata_model.committer_id,
            pending_deletion_model.story_mappings[self.STORY_2_ID])
        commit_log_model = story_models.StoryCommitLogEntryModel.get_by_id(
            'story-%s-1' % self.STORY_2_ID)
        self.assertEqual(
            commit_log_model.user_id,
            pending_deletion_model.story_mappings[self.STORY_2_ID])
Пример #5
0
 def map(model_instance):
     """Implements the map function for this job."""
     if model_instance.deletion_complete:
         yield ('ALREADY DONE', model_instance.id)
     else:
         wipeout_service.delete_user(model_instance)
         yield ('SUCCESS', model_instance.id)
Пример #6
0
    def test_one_story_is_pseudonymized_when_the_deletion_is_repeated(self):
        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_1_id))

        # Return metadata model to the original user ID.
        metadata_model = story_models.StorySnapshotMetadataModel.get_by_id(
            '%s-1' % self.STORY_1_ID)
        metadata_model.committer_id = self.user_1_id
        metadata_model.put()

        # Run the user deletion again.
        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_1_id))

        # Verify that both the commit and the metadata have the same
        # pseudonymous user ID.
        pending_deletion_model = (
            user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id))
        metadata_model = story_models.StorySnapshotMetadataModel.get_by_id(
            '%s-1' % self.STORY_1_ID)
        self.assertEqual(
            metadata_model.committer_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])
        commit_log_model = story_models.StoryCommitLogEntryModel.get_by_id(
            'story-%s-1' % self.STORY_1_ID)
        self.assertEqual(
            commit_log_model.user_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])
Пример #7
0
    def test_delete_user_multiple(self):
        wipeout_service.pre_delete_user(self.user_2_id)

        self.assertIsNotNone(
            user_models.UserSettingsModel.get_by_id(self.user_2_id))
        self.assertIsNotNone(
            user_models.UserEmailPreferencesModel.get_by_id(self.user_2_id))
        self.assertIsNotNone(
            user_models.CompletedActivitiesModel.get_by_id(self.user_2_id))
        self.assertIsNotNone(
            user_models.IncompleteActivitiesModel.get_by_id(self.user_2_id))
        self.assertIsNotNone(
            user_models.LearnerPlaylistModel.get_by_id(self.user_2_id))

        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_2_id))

        self.assertIsNone(
            user_models.UserSettingsModel.get_by_id(self.user_2_id))
        self.assertIsNone(
            user_models.UserEmailPreferencesModel.get_by_id(self.user_2_id))
        self.assertIsNone(
            user_models.CompletedActivitiesModel.get_by_id(self.user_2_id))
        self.assertIsNone(
            user_models.IncompleteActivitiesModel.get_by_id(self.user_2_id))
        self.assertIsNone(
            user_models.LearnerPlaylistModel.get_by_id(self.user_2_id))
Пример #8
0
    def test_delete_user_multiple(self):
        self.assertIsNotNone(
            user_models.UserSettingsModel.get_by_id(self.user_2_id))
        self.assertIsNotNone(
            user_models.UserEmailPreferencesModel.get_by_id(self.user_2_id))
        self.assertIsNotNone(
            user_models.CompletedActivitiesModel.get_by_id(self.user_2_id))
        self.assertIsNotNone(
            user_models.IncompleteActivitiesModel.get_by_id(self.user_2_id))
        self.assertIsNotNone(
            user_models.LearnerPlaylistModel.get_by_id(self.user_2_id))

        wipeout_service.delete_user(
            user_models.PendingDeletionRequestModel.get_by_id(
                self.user_2_id))

        self.assertIsNone(
            user_models.UserSettingsModel.get_by_id(self.user_2_id))
        self.assertIsNone(
            user_models.UserEmailPreferencesModel.get_by_id(self.user_2_id))
        self.assertIsNone(
            user_models.CompletedActivitiesModel.get_by_id(self.user_2_id))
        self.assertIsNone(
            user_models.IncompleteActivitiesModel.get_by_id(self.user_2_id))
        self.assertIsNone(
            user_models.LearnerPlaylistModel.get_by_id(self.user_2_id))

        pending_deletion_model = (
            user_models.PendingDeletionRequestModel.get_by_id(self.user_2_id))
        self.assertTrue(pending_deletion_model.deletion_complete)
Пример #9
0
 def test_deleted_failure(self):
     wipeout_service.delete_user(
         user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id))
     user_models.CompletedActivitiesModel(id=self.user_1_id,
                                          exploration_ids=[],
                                          collection_ids=[]).put()
     output = self._run_one_off_job()
     self.assertIn(['FAILURE', [self.user_1_id]], output)
Пример #10
0
    def test_delete_user_simple(self):
        wipeout_service.delete_user(
            user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id))

        self.assertTrue(wipeout_service.verify_user_deleted(
            user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id)))

        self.assertIsNone(
            user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id))
Пример #11
0
    def test_verification_when_user_is_deleted_is_successful(self):
        pending_deletion_request = (
            wipeout_service.get_pending_deletion_request(self.user_1_id))
        wipeout_service.delete_user(pending_deletion_request)
        pending_deletion_request.deletion_complete = True
        wipeout_service.save_pending_deletion_request(pending_deletion_request)

        output = self._run_one_off_job()
        self.assertIn(['SUCCESS', [self.user_1_id]], output)
Пример #12
0
    def test_after_deletion_user_cannot_do_anything(self):
        wipeout_service.pre_delete_user(self.user_1_id)
        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_1_id))

        self.assertIsNone(user_services.get_user_settings(self.user_1_id))
        with self.assertRaisesRegexp(Exception, 'User not found.'):
            # Try to do some action with the deleted user.
            user_services.update_preferred_language_codes(
                self.user_1_id, ['en'])
Пример #13
0
 def map(pending_deletion_request_model):
     """Implements the map function for this job."""
     pending_deletion_request = wipeout_service.get_pending_deletion_request(
         pending_deletion_request_model.id)
     if pending_deletion_request.deletion_complete:
         yield ('ALREADY DONE', pending_deletion_request.user_id)
     else:
         wipeout_service.delete_user(pending_deletion_request)
         pending_deletion_request.deletion_complete = True
         wipeout_service.save_pending_deletion_requests(
             [pending_deletion_request])
         yield ('SUCCESS', pending_deletion_request.user_id)
Пример #14
0
    def test_verification_when_user_is_wrongly_deleted_fails(self):
        pending_deletion_request = (
            wipeout_service.get_pending_deletion_request(self.user_1_id))
        wipeout_service.delete_user(pending_deletion_request)
        pending_deletion_request.deletion_complete = True
        wipeout_service.save_pending_deletion_request(pending_deletion_request)

        user_models.CompletedActivitiesModel(id=self.user_1_id,
                                             exploration_ids=[],
                                             collection_ids=[]).put()
        output = self._run_one_off_job()
        self.assertIn(['FAILURE', [self.user_1_id]], output)
Пример #15
0
    def test_one_story_with_multiple_users_is_pseudonymized(self):
        story_services.update_story(self.user_2_id, self.STORY_1_ID, [
            story_domain.StoryChange({
                'cmd': story_domain.CMD_ADD_STORY_NODE,
                'node_id': 'node_1',
                'title': 'Title 2'
            })
        ], 'Add node.')

        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_1_id))

        # Verify first user is deleted.
        pending_deletion_model = (
            user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id))
        metadata_model = story_models.StorySnapshotMetadataModel.get_by_id(
            '%s-1' % self.STORY_1_ID)
        self.assertEqual(
            metadata_model.committer_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])
        commit_log_model = story_models.StoryCommitLogEntryModel.get_by_id(
            'story-%s-1' % self.STORY_1_ID)
        self.assertEqual(
            commit_log_model.user_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])

        # Verify second user is not yet deleted.
        metadata_model = story_models.StorySnapshotMetadataModel.get_by_id(
            '%s-2' % self.STORY_1_ID)
        self.assertEqual(metadata_model.committer_id, self.user_2_id)
        commit_log_model = story_models.StoryCommitLogEntryModel.get_by_id(
            'story-%s-2' % self.STORY_1_ID)
        self.assertEqual(commit_log_model.user_id, self.user_2_id)

        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_2_id))

        # Verify second user is deleted.
        pending_deletion_model = (
            user_models.PendingDeletionRequestModel.get_by_id(self.user_2_id))
        metadata_model = story_models.StorySnapshotMetadataModel.get_by_id(
            '%s-2' % self.STORY_1_ID)
        self.assertEqual(
            metadata_model.committer_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])
        commit_log_model = story_models.StoryCommitLogEntryModel.get_by_id(
            'story-%s-2' % self.STORY_1_ID)
        self.assertEqual(
            commit_log_model.user_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])
Пример #16
0
    def test_delete_user_simple(self):
        wipeout_service.pre_delete_user(self.user_1_id)

        self.assertIsNotNone(
            user_models.UserSettingsModel.get_by_id(self.user_1_id))
        self.assertIsNotNone(
            user_models.UserEmailPreferencesModel.get_by_id(self.user_1_id))

        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_1_id))

        self.assertIsNone(
            user_models.UserSettingsModel.get_by_id(self.user_1_id))
        self.assertIsNone(
            user_models.UserEmailPreferencesModel.get_by_id(self.user_1_id))
Пример #17
0
    def test_one_story_is_pseudonymized(self):
        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_1_id))

        # Verify user is deleted.
        pending_deletion_model = (
            user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id))
        metadata_model = story_models.StorySnapshotMetadataModel.get_by_id(
            '%s-1' % self.STORY_1_ID)
        self.assertEqual(
            metadata_model.committer_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])
        commit_log_model = story_models.StoryCommitLogEntryModel.get_by_id(
            'story-%s-1' % self.STORY_1_ID)
        self.assertEqual(
            commit_log_model.user_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])
Пример #18
0
    def test_one_story_with_missing_snapshot_is_pseudonymized(self):
        observed_log_messages = []

        def _mock_logging_function(msg, *args):
            """Mocks logging.warning()."""
            observed_log_messages.append(msg % args)

        logging_swap = self.swap(logging, 'error', _mock_logging_function)

        story_models.StoryCommitLogEntryModel(
            id='story-%s-1' % self.STORY_2_ID,
            story_id=self.STORY_2_ID,
            user_id=self.user_1_id,
            commit_type='create_new',
            commit_cmds=[{}],
            post_commit_status=constants.ACTIVITY_STATUS_PUBLIC,
            version=1).put()

        with logging_swap:
            wipeout_service.delete_user(
                wipeout_service.get_pending_deletion_request(self.user_1_id))

        self.assertEqual(observed_log_messages, [
            'The commit log and snapshot story IDs differ. '
            'Snapshots without commit logs: [], '
            'Commit logs without snapshots: [u\'%s\'].' % self.STORY_2_ID
        ])

        # Verify user is deleted.
        pending_deletion_model = (
            user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id))
        metadata_model = story_models.StorySnapshotMetadataModel.get_by_id(
            '%s-1' % self.STORY_1_ID)
        self.assertEqual(
            metadata_model.committer_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])
        commit_log_model_1 = story_models.StoryCommitLogEntryModel.get_by_id(
            'story-%s-1' % self.STORY_1_ID)
        self.assertEqual(
            commit_log_model_1.user_id,
            pending_deletion_model.story_mappings[self.STORY_1_ID])
        commit_log_model_2 = story_models.StoryCommitLogEntryModel.get_by_id(
            'story-%s-1' % self.STORY_2_ID)
        self.assertEqual(
            commit_log_model_2.user_id,
            pending_deletion_model.story_mappings[self.STORY_2_ID])
Пример #19
0
    def test_delete_user_simple(self):
        self.assertIsNotNone(
            user_models.UserSettingsModel.get_by_id(self.user_1_id))
        self.assertIsNotNone(
            user_models.UserEmailPreferencesModel.get_by_id(self.user_1_id))

        wipeout_service.delete_user(
            user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id))

        self.assertIsNone(
            user_models.UserSettingsModel.get_by_id(self.user_1_id))
        self.assertIsNone(
            user_models.UserEmailPreferencesModel.get_by_id(self.user_1_id))

        pending_deletion_model = (
            user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id))
        self.assertTrue(pending_deletion_model.deletion_complete)
Пример #20
0
    def test_verification_is_unsuccessful_when_deletion_failed(self):
        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_2_id))

        story_services.update_story(self.user_2_id, self.STORY_2_ID, [
            story_domain.StoryChange({
                'cmd': story_domain.CMD_ADD_STORY_NODE,
                'node_id': 'node_1',
                'title': 'Title 2'
            })
        ], 'Add node.')

        self.assertFalse(
            wipeout_service.verify_user_deleted(
                wipeout_service.get_pending_deletion_request(self.user_2_id)))

        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_2_id))
        self.assertTrue(
            wipeout_service.verify_user_deleted(
                wipeout_service.get_pending_deletion_request(self.user_2_id)))
Пример #21
0
    def test_delete_user_broken(self):
        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_2_id))

        user_models.CompletedActivitiesModel(id=self.user_2_id,
                                             exploration_ids=[],
                                             collection_ids=[]).put()
        user_models.IncompleteActivitiesModel(id=self.user_2_id,
                                              exploration_ids=[],
                                              collection_ids=[]).put()
        user_models.LearnerPlaylistModel(id=self.user_2_id,
                                         exploration_ids=[],
                                         collection_ids=[]).put()

        self.assertFalse(
            wipeout_service.verify_user_deleted(
                wipeout_service.get_pending_deletion_request(self.user_2_id)))

        wipeout_service.delete_user(
            wipeout_service.get_pending_deletion_request(self.user_2_id))
        self.assertTrue(
            wipeout_service.verify_user_deleted(
                wipeout_service.get_pending_deletion_request(self.user_2_id)))
Пример #22
0
 def test_deleted_success(self):
     wipeout_service.delete_user(
         user_models.PendingDeletionRequestModel.get_by_id(self.user_1_id))
     output = self._run_one_off_job()
     self.assertIn(['SUCCESS', [self.user_1_id]], output)
Пример #23
0
 def test_delete_user_simple(self):
     wipeout_service.delete_user(
         wipeout_service.get_pending_deletion_request(self.user_1_id))
     self.assertTrue(
         wipeout_service.verify_user_deleted(
             wipeout_service.get_pending_deletion_request(self.user_1_id)))
Пример #24
0
 def test_verification_is_successful(self):
     wipeout_service.delete_user(
         wipeout_service.get_pending_deletion_request(self.user_1_id))
     self.assertTrue(
         wipeout_service.verify_user_deleted(
             wipeout_service.get_pending_deletion_request(self.user_1_id)))
 def wipeout(self):
     """Runs wipeout on the user created by this test."""
     wipeout_service.delete_user(
         wipeout_service.get_pending_deletion_request(self.user_id))