def test_no_database(self): with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"): Identifier.get_uuid_list() with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"): Identifier.get(uuid4()) operation = Operation(OperationRev(), 'http://example.com/', []) sk = SigningKey.generate() sign_object(PublicKey.from_signing_key(sk), sk, operation) identifier = Identifier.from_operation(operation) with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"): identifier.put() with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"): identifier.remove()
def test_2_put_remove(self): for identifier in self.identifiers: identifier.put() uuid_list = Identifier.get_uuid_list() self.assertEqual(len(uuid_list), 2) self.assertCountEqual(uuid_list, [identifier.uuid for identifier in self.identifiers]) for identifier in self.identifiers: new_id = Identifier.get(identifier.uuid) self.assertEqual(new_id.uuid, identifier.uuid) self.assertEqual(new_id.operation_rev, identifier.operation_rev) self.identifiers[0].remove() with self.assertRaises(Identifier.DoesNotExist): self.identifiers[0].remove() # already removed identifier self.assertCountEqual(Identifier.get_uuid_list(), [self.identifiers[1].uuid]) with self.assertRaises(Identifier.DoesNotExist): Identifier.get(self.identifiers[0].uuid)
def __set_head(self, new_head_id): lca_id = self.__lowest_common_ancestor(self.head, new_head_id) blocks_after_lca = self.backward_blocks_chain(self.head, lca_id)[:-1] for identifier in [Identifier.get(uuid) for uuid in Identifier.get_uuid_list()]: op = identifier.operation_rev.obj containing_blocks = list(filter(lambda bl: bl in blocks_after_lca, op.containing_blocks)) if len(containing_blocks) == 1: while len(containing_blocks) == 1: # while operation is in a block that belongs to path to the LCA op = op.previous_operation_rev.obj if op is not None: containing_blocks = list(filter(lambda bl: bl in blocks_after_lca, op.containing_blocks)) else: break identifier.remove() if op is not None: identifier.operation_rev = op.get_rev() identifier.put() for block_id in reversed(self.backward_blocks_chain(new_head_id, lca_id)[:-1]): for op in pmpi.block.Block.get(block_id).operations: try: identifier = Identifier.get(op.uuid) if identifier.operation_rev == op.previous_operation_rev: identifier.remove() identifier.operation_rev = op.get_rev() identifier.put() else: raise self.TreeError("inconsistency of operations") except Identifier.DoesNotExist: if op.previous_operation_rev.is_none(): Identifier(op.uuid, op.get_rev()).put() else: raise self.TreeError("multiple minting of the identifier") self.__head = new_head_id
def new_operation(self): print("Choose UUID:") uuids_number = self.show_uuids() print('\n {}) mint new uuid'.format(uuids_number)) def send_operation(operation): self.user.sign_object(operation) x = None while x not in ('y', 'n'): x = input("Send operation? (y/n) ") if x == 'y': self.transport.write(b'OP' + operation.raw()) # TODO also -- length of operation? try: x = int(input("index=")) if x < uuids_number: uuid = Identifier.get_uuid_list()[x] operation = Identifier.get(uuid).operation_rev.obj if self.user._public_key.der not in operation.owners_der: print("You do not own this identifier!") return # TODO show sth address = input("address=") # TODO owners choose owners send_operation(Operation(operation.get_rev(), address, [self.user._public_key])) elif x == uuids_number: address = input("address=") # TODO owners choose owners send_operation(Operation(OperationRev(), address, [self.user._public_key])) else: print("Wrong number.") except ValueError: print("Value Error, aborting.")
def test_1_get_from_empty(self): with self.assertRaises(Identifier.DoesNotExist): Identifier.get(self.identifiers[0].uuid)
def show_uuids(): uuid_list = Identifier.get_uuid_list() digits = len(str(len(uuid_list))) for index, identifier in enumerate(Identifier.get_uuid_list()): print("{}) {} | {}".format(str(index).rjust(digits), identifier, Identifier.get(identifier).operation_rev.obj.address)) return len(uuid_list)