def test_router(self): self.assertTrue( dj_db.router.db_for_read(HamModel) in ["default-0", "default-1"] ) self.assertRaises( UnpinnedWriteException, dj_db.router.db_for_write, HamModel ) self.assertTrue( dj_db.router.db_for_read(EggModel) in ["default-0", "default-1"] ) self.assertRaises( UnpinnedWriteException, dj_db.router.db_for_write, EggModel ) pindb.pin("default") try: self.assertEqual('default', dj_db.router.db_for_write(HamModel)) except UnpinnedWriteException: self.fail("Expected to be able to write after pinning.") ham1 = HamModel.objects.create() ham2 = HamModel.objects.create() # If no delegate router is given, all DB goes to default. egg = EggModel.objects.create() self.assertTrue(dj_db.router.allow_relation(ham1, ham2)) self.assertTrue(dj_db.router.allow_syncdb("default", HamModel)) self.assertTrue(dj_db.router.allow_syncdb("default", EggModel))
def test_unpinned_replica(self, mock_randint): pindb.pin("default") self.assertEqual( dj_db.router.db_for_read(HamModel), "default" ) with pindb.unpinned_replica("default"): mock_randint.return_value = 1 self.assertEqual( dj_db.router.db_for_read(HamModel), "default-1" ) with self.assertRaises(ValueError): with pindb.unpinned_replica("default"): raise ValueError @pindb.with_replicas("default") def to_replicas(): mock_randint.return_value = 1 self.assertEqual( dj_db.router.db_for_read(HamModel), "default-1" ) to_replicas() @pindb.with_replicas(["default"]) def to_replicas_list(): mock_randint.return_value = 2 self.assertEqual( dj_db.router.db_for_read(HamModel), "default-1" ) to_replicas_list()
def test_pinning(self): # pinning is reflected in is_pinned for master in settings.MASTER_DATABASES: self.assertFalse(pindb.is_pinned(master)) pindb.pin(master) self.assertTrue(pindb.is_pinned(master)) # unpin_all resets the state. pindb.unpin_all() for master in settings.MASTER_DATABASES: self.assertFalse(pindb.is_pinned(master)) pindb.pin("default") # pinning state is available as a set. pinned1 = pindb.get_pinned() self.assertTrue('default' in pinned1) # unpinning doesn't affect the previous set. pindb.unpin_all() pinned2 = pindb.get_pinned() self.assertTrue('default' in pinned1) self.assertFalse('default' in pinned2) # we can keep track of new pins vs. carried-over pins # i.e. pins that stick for the replication lag period. self.assertEqual(0, len(pindb.get_newly_pinned())) pindb.pin("default") self.assertEqual(1, len(pindb.get_newly_pinned())) pindb.unpin_all() self.assertEqual(0, len(pindb.get_newly_pinned())) pindb.pin("default", count_as_new=False) self.assertEqual(0, len(pindb.get_newly_pinned())) # it counts as pinned even if we don't count it as new. self.assertEqual(1, len(pindb.get_pinned()))
def test_router(self): self.assertEqual( dj_db.router.db_for_read(HamModel), "default" ) self.assertRaises( UnpinnedWriteException, dj_db.router.db_for_write, HamModel ) self.assertTrue( dj_db.router.db_for_read(EggModel) in ["egg-0", "egg-1"] ) self.assertRaises( UnpinnedWriteException, dj_db.router.db_for_write, EggModel ) pindb.pin("default") try: self.assertEqual('default', dj_db.router.db_for_write(HamModel)) except UnpinnedWriteException: self.fail("Expected to be able to write after pinning.") ham1 = HamModel.objects.create() ham2 = HamModel.objects.create() # pinning a different DB doesn't allow writes on others. self.assertRaises( UnpinnedWriteException, dj_db.router.db_for_write, EggModel ) pindb.pin("egg") try: egg = EggModel.objects.create() except UnpinnedWriteException: self.fail("Expected to be able to write after pinning.") self.assertTrue(dj_db.router.allow_relation(ham1, ham2)) self.assertTrue(dj_db.router.allow_syncdb("default", HamModel)) self.assertTrue(dj_db.router.allow_syncdb("default", EggModel)) self.assertEqual(dj_db.router.db_for_read(FrobModel), "default")