def execute(self,
             sender,
             query,
             query_fee=defaults.ORACLE_QUERY_FEE,
             query_ttl_type=defaults.ORACLE_TTL_TYPE,
             query_ttl_value=defaults.ORACLE_QUERY_TTL_VALUE,
             response_ttl_type=defaults.ORACLE_TTL_TYPE,
             response_ttl_value=defaults.ORACLE_RESPONSE_TTL_VALUE,
             fee=defaults.FEE,
             tx_ttl=defaults.TX_TTL):
     """
     Execute a query to the oracle
     """
     if self.oracle_id is None:
         raise ValueError(
             "Oracle id must be provided before executing a query")
     # get the transaction builder
     txb = self.client.tx_builder
     # get the account nonce and ttl
     nonce, ttl = self.client._get_nonce_ttl(sender.get_address(), tx_ttl)
     # create spend_tx
     tx = txb.tx_oracle_query(self.oracle_id, sender.get_address(), query,
                              query_fee, query_ttl_type, query_ttl_value,
                              response_ttl_type, response_ttl_value, fee,
                              ttl, nonce)
     # sign the transaction
     tx_signed = self.client.sign_transaction(sender, tx.tx)
     # post the transaction to the chain
     self.client.broadcast_transaction(tx_signed.tx, tx_signed.hash)
     # save the query id
     self.id = hashing.oracle_query_id(sender.get_address(), nonce,
                                       self.oracle_id)
     # return the transaction
     return tx_signed
def test_hashing_oracle_query_id():
    # TODO: add more scenarios
    # sender_id, nonce, oracle_id -> query_id, match
    tt = [
        ('ak_2ZjpYpJbzq8xbzjgPuEpdq9ahZE7iJRcAYC1weq3xdrNbzRiP4', 1, 'ok_2iqfJjbhGgJFRezjX6Q6DrvokkTM5niGEHBEJZ7uAG5fSGJAw1',
         'oq_2YvZnoohcSvbQCsPKSMxc98i5HZ1sU5mR6xwJUZC3SvkuSynMj', True),
    ]

    for t in tt:
        assert (hashing.oracle_query_id(t[0], t[1], t[2]) == t[3]) == t[4]