def test_3_get_and_remove(self): for block in self.blocks: block.put() for block in self.blocks: new_block = Block.get(block.id) self.assertEqual(new_block.id, block.id) for block in self.blocks[:2]: with self.assertRaisesRegex(Block.ChainOperationBlockedError, "can't remove: blocked by another block"): block.remove() self.assertCountEqual(Block.get_ids_list(), [block.id for block in self.blocks]) self.blocks[2].remove() for block in self.blocks[:2]: with self.assertRaisesRegex(Block.ChainOperationBlockedError, "can't remove: blocked by another block"): block.remove() self.blocks[3].remove() self.assertCountEqual(Block.get_ids_list(), [block.id for block in self.blocks[:2]]) with self.assertRaisesRegex(Block.ChainOperationBlockedError, "can't remove: blocked by another block"): self.blocks[0].remove() self.blocks[1].remove() self.blocks[0].remove() for block in self.blocks: with self.assertRaises(Block.DoesNotExist): block.remove() self.assertEqual(Block.get_ids_list(), [])
def test_no_database(self): with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"): Block.get_ids_list() with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"): Block.get(sha256(b'something').digest()) private_key = SigningKey.generate() public_key = PublicKey.from_signing_key(private_key) operations = [ Operation(OperationRev(), 'http://example0.com/', [public_key]), Operation(OperationRev(), 'http://example1.com/', [public_key]) ] for op in operations: sign_object(public_key, private_key, op) block = Block.from_operations_list(BlockRev(), int(time.time()), operations) block.mine() sign_object(public_key, private_key, block) with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"): block.put() with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"): block.remove()
def test_2_put(self): self.blocks[0].put() with self.assertRaisesRegex(Block.GenesisBlockDuplicationError, "trying to create multiple genesis blocks"): self.blocks[0].put() self.blocks[1].put() with self.assertRaisesRegex(Block.DuplicationError, "object id already in the database"): self.blocks[1].put() self.blocks[2].put() self.blocks[3].put() revision_id_list = Block.get_ids_list() self.assertEqual(len(revision_id_list), 4) self.assertCountEqual(revision_id_list, [block.id for block in self.blocks])
def test_0_empty(self): self.assertEqual(len(Block.get_ids_list()), 0)
def test(): try: os.remove('test_database_file') except OSError: pass initialise_database('test_database_file') obj_private_key = SigningKey.generate() obj_public_key = PublicKey.from_signing_key(obj_private_key) obj_uuids = [uuid4() for _ in range(3)] obj_operations = [[ Operation(OperationRev(), 'http://example0.com/v0/', [obj_public_key]), Operation(OperationRev(), 'http://example1.com/v0/', [obj_public_key]) ]] for op in obj_operations[0]: sign_object(obj_public_key, obj_private_key, op) obj_operations.append([ Operation(OperationRev.from_obj(obj_operations[0][0]), 'http://example0.com/v1/', [obj_public_key]), Operation(OperationRev.from_obj(obj_operations[0][1]), 'http://example1.com/v1/', [obj_public_key]), Operation(OperationRev(), 'http://example2.com/v0/', [obj_public_key]) ]) for op in obj_operations[1]: sign_object(obj_public_key, obj_private_key, op) obj_operations.append([ Operation(OperationRev.from_obj(obj_operations[1][0]), 'http://example0.com/v2/', [obj_public_key]), Operation(OperationRev.from_obj(obj_operations[1][1]), 'http://example1.com/v2/', [obj_public_key]) ]) for op in obj_operations[2]: sign_object(obj_public_key, obj_private_key, op) obj_operations.append([ Operation(OperationRev.from_obj(obj_operations[1][1]), 'http://alternative1.com/', [obj_public_key]), Operation(OperationRev.from_obj(obj_operations[1][2]), 'http://alternative2.com/', [obj_public_key]) ]) for op in obj_operations[3]: sign_object(obj_public_key, obj_private_key, op) timestamp = int(time.time()) - 100 obj_blocks = [Block.from_operations_list(BlockRev(), timestamp, obj_operations[0])] obj_blocks[0].mine() sign_object(obj_public_key, obj_private_key, obj_blocks[0]) obj_blocks.append( Block.from_operations_list(BlockRev.from_obj(obj_blocks[0]), timestamp + 20, obj_operations[1])) obj_blocks[1].mine() sign_object(obj_public_key, obj_private_key, obj_blocks[1]) obj_blocks.append( Block.from_operations_list(BlockRev.from_obj(obj_blocks[1]), timestamp + 40, obj_operations[2])) obj_blocks[2].mine() sign_object(obj_public_key, obj_private_key, obj_blocks[2]) obj_blocks.append( Block.from_operations_list(BlockRev.from_obj(obj_blocks[1]), timestamp + 60, obj_operations[3])) obj_blocks[3].mine() sign_object(obj_public_key, obj_private_key, obj_blocks[3]) for block in obj_blocks: block.put() for block in obj_blocks: new_block = Block.get(block.id) assert new_block.id == block.id for block in obj_blocks[:2]: try: block.remove() raise AssertionError except Block.ChainOperationBlockedError: pass assert sorted(Block.get_ids_list()) == sorted([block.id for block in obj_blocks]) obj_blocks[2].remove() for block in obj_blocks[:2]: try: block.remove() raise AssertionError except Block.ChainOperationBlockedError: pass obj_blocks[3].remove() try: obj_blocks[0].remove() raise AssertionError except Block.ChainOperationBlockedError: pass obj_blocks[1].remove() obj_blocks[0].remove() for block in obj_blocks: try: block.remove() raise AssertionError except Block.DoesNotExist: pass assert Block.get_ids_list() == [] close_database() os.remove('test_database_file')