class ExecuteBlockTest(TestCase): """ Test executeing blocking changesets. Each test will set up a change in a different way but that ought to have the same results. Then we'll try to roll back the change, after changing one voter, and check those results. """ def setUp(self): # these should be blocked during the changeset self.citizen1 = CitizenFactory() self.citizen2 = CitizenFactory() # citizen3 already blocked self.citizen3 = CitizenFactory() self.citizen3.block() # citizen4 won't be included self.citizen4 = CitizenFactory() self.changeset = ChangesetFactory( status=Changeset.STATUS_APPROVED, change=Changeset.CHANGE_BLOCK, ) def doit(self): self.changeset.full_clean() citizens = list(self.changeset.get_citizens_to_change()) self.assertIn(self.citizen1, citizens) self.assertIn(self.citizen2, citizens) self.assertIn(self.citizen3, citizens) # In the list, but will not be changed self.assertNotIn(self.citizen4, citizens) self.changeset.execute() self.citizen1 = refresh_model(self.citizen1) self.citizen2 = refresh_model(self.citizen2) self.citizen3 = refresh_model(self.citizen3) self.citizen4 = refresh_model(self.citizen4) self.assertTrue(self.citizen1.blocked) self.assertTrue(self.citizen2.blocked) self.assertTrue(self.citizen3.blocked) self.assertFalse(self.citizen4.blocked) changes = self.changeset.change_records.all() self.assertTrue(changes.filter(citizen=self.citizen1, changed=True).exists()) self.assertTrue(changes.filter(citizen=self.citizen2, changed=True).exists()) self.assertTrue(changes.filter(citizen=self.citizen3, changed=False).exists()) self.assertFalse(changes.filter(citizen=self.citizen4).exists()) self.assertEqual(Changeset.STATUS_PARTIALLY_SUCCESSFUL, self.changeset.status) # Now unblock citizen 2 self.citizen2.unblock() rollback = ChangesetFactory( status=Changeset.STATUS_APPROVED, change=Changeset.CHANGE_ROLLBACK, how_to_select=Changeset.SELECT_OTHER_CHANGESET, other_changeset=self.changeset, ) citizens = list(rollback.get_citizens_to_change()) self.assertIn(self.citizen1, citizens) self.assertIn(self.citizen2, citizens) self.assertNotIn(self.citizen3, citizens) # not changed before, so not in list this time self.assertNotIn(self.citizen4, citizens) rollback.execute() self.changeset = refresh_model(self.changeset) self.assertEqual(Changeset.STATUS_ROLLED_BACK, self.changeset.status) self.citizen1 = refresh_model(self.citizen1) self.citizen2 = refresh_model(self.citizen2) self.citizen3 = refresh_model(self.citizen3) self.citizen4 = refresh_model(self.citizen4) self.assertFalse(self.citizen1.blocked) self.assertFalse(self.citizen2.blocked) self.assertTrue(self.citizen3.blocked) self.assertFalse(self.citizen4.blocked) changes = rollback.change_records.all() self.assertTrue(changes.filter(citizen=self.citizen1, changed=True).exists()) self.assertTrue(changes.filter(citizen=self.citizen2, changed=False).exists()) # reg 3 not in the list because they were changed previously self.assertFalse(changes.filter(citizen=self.citizen3).exists()) self.assertFalse(changes.filter(citizen=self.citizen4).exists()) self.assertEqual(Changeset.STATUS_PARTIALLY_SUCCESSFUL, rollback.status) def test_block_by_uploaded_citizens(self): self.changeset.how_to_select = Changeset.SELECT_UPLOADED_NIDS self.changeset.save() self.changeset.selected_citizens.add(self.citizen1, self.citizen2, self.citizen3) self.doit() def test_block_by_selected_centers(self): center1 = RegistrationCenterFactory() center2 = RegistrationCenterFactory() RegistrationCenterFactory() RegistrationFactory(citizen=self.citizen1, registration_center=center1, archive_time=None) RegistrationFactory(citizen=self.citizen2, registration_center=center1, archive_time=None) RegistrationFactory(citizen=self.citizen3, registration_center=center2, archive_time=None) self.changeset.how_to_select = Changeset.SELECT_CENTERS self.changeset.save() self.changeset.selected_centers.add(center1, center2) self.doit() def test_block_by_other_changeset(self): other = ChangesetFactory(status=Changeset.STATUS_SUCCESSFUL) self.changeset.how_to_select = Changeset.SELECT_OTHER_CHANGESET self.changeset.other_changeset = other self.changeset.save() ChangeRecordFactory(citizen=self.citizen1, changeset=other, changed=True) ChangeRecordFactory(citizen=self.citizen2, changeset=other, changed=True) ChangeRecordFactory(citizen=self.citizen3, changeset=other, changed=True) ChangeRecordFactory(citizen=self.citizen4, changeset=other, changed=False) self.doit()