def test_validate_write_once_fields(): offchain.validate_write_once_fields("payment", None, None) payment = offchain.PaymentObject( reference_id="4185027f-0574-6f55-2668-3a38fdb5de98", sender=offchain.PaymentActorObject( address="lbr1p7ujcndcl7nudzwt8fglhx6wxn08kgs5tm6mz4usw5p72t", status=offchain.StatusObject(status=offchain.Status.needs_kyc_data), kyc_data=offchain.individual_kyc_data( given_name="hello", ), metadata=["hello", "world"], ), receiver=offchain.PaymentActorObject( address="lbr1p7ujcndcl7nudzwt8fglhx6wxnvqqqqqqqqqqqqelu3xv", status=offchain.StatusObject( status=offchain.Status.abort, abort_code="code1", abort_message="code1 message", ), ), action=offchain.PaymentActionObject(amount=1_000_000_000_000, currency="XUS", timestamp=1604902048), original_payment_reference_id="0185027f-0574-6f55-2668-3a38fdb5de98", ) offchain.validate_write_once_fields("payment", payment, payment) offchain.validate_write_once_fields("payment", payment, None) offchain.validate_write_once_fields("payment", None, payment) new_payment = dataclasses.replace( payment, sender=offchain.replace_payment_actor(payment.sender, kyc_data=offchain.individual_kyc_data()) ) with pytest.raises(offchain.InvalidOverwriteError): offchain.validate_write_once_fields("payment", new_payment, payment)
def test_create_an_account_with_valid_kyc_data_and_initial_deposit_balances( target_client: RestClient, currency: str ) -> None: minimum_kyc_data = offchain.to_json(offchain.individual_kyc_data()) account = target_client.create_account(kyc_data=minimum_kyc_data, balances={currency: 123}) assert account.id assert account.kyc_data == minimum_kyc_data
def new_payment_object(self, sender=LocalAccount.generate(), receiver=LocalAccount.generate()): amount = 1_000_000_000_000 currency = testnet.TEST_CURRENCY_CODE sender_account_id = identifier.encode_account( sender.account_address, identifier.gen_subaddress(), self.hrp()) sender_kyc_data = offchain.individual_kyc_data( given_name="Jack", surname="G", address=offchain.AddressObject(city="San Francisco"), ) receiver_account_id = identifier.encode_account( receiver.account_address, identifier.gen_subaddress(), self.hrp(), ) return offchain.new_payment_object( sender_account_id, sender_kyc_data, receiver_account_id, amount, currency, )
def test_decode_account_kyc_data(): assert Account(id="1").kyc_data_object() == offchain.individual_kyc_data() sample = KycSample.gen("foo") account = Account(id="1", kyc_data=sample.minimum) assert account.kyc_data_object() assert account.kyc_data_object() == sample.minimum
def test_match_receiver_ready_payment_state(factory): payment = factory.new_payment_object() receiver_ready_payment = dataclasses.replace( payment, receiver=replace_payment_actor( payment.receiver, status=Status.ready_for_settlement, kyc_data=individual_kyc_data(given_name="Rose"), ), recipient_signature="signature", ) receiver_ready = machine.match_state(receiver_ready_payment) assert receiver_ready == R_SEND initial_state = machine.match_state(payment) assert machine.is_valid_transition(initial_state, receiver_ready, receiver_ready_payment)
assert account.balance("XDX") == 0 @pytest.mark.parametrize("amount", [0, 1, 100, 10000000000]) @pytest.mark.parametrize("currency", ["XUS"]) def test_create_an_account_with_initial_deposit_balances(target_client: RestClient, currency: str, amount: int) -> None: account = target_client.create_account(kyc_data=None, balances={currency: amount}) assert account.id assert account.kyc_data is None assert account.balance(currency) == amount @pytest.mark.parametrize( # pyre-ignore "kyc_data", [ offchain.to_json(offchain.individual_kyc_data()), offchain.to_json(offchain.entity_kyc_data()), ], ) def test_create_an_account_with_minimum_valid_kyc_data(target_client: RestClient, kyc_data: str) -> None: account = target_client.create_account(kyc_data=kyc_data) assert account.id assert account.kyc_data == kyc_data def test_create_an_account_with_valid_kyc_data_and_initial_deposit_balances( target_client: RestClient, currency: str ) -> None: minimum_kyc_data = offchain.to_json(offchain.individual_kyc_data()) account = target_client.create_account(kyc_data=minimum_kyc_data, balances={currency: 123}) assert account.id
def gen_kyc_data(name: str) -> offchain.KycDataObject: return offchain.individual_kyc_data(given_name=name, surname=surname)
def kyc_data_object(self) -> offchain.KycDataObject: return self.kyc_data if self.kyc_data else offchain.individual_kyc_data( ) # pyre-ignore
def kyc_data(self) -> offchain.KycDataObject: return offchain.individual_kyc_data( given_name=self.name, surname=f"surname-{self.name}", address=offchain.AddressObject(city="San Francisco"), )
@pytest.mark.parametrize("amount", [0, 1, 100, 10000000000]) @pytest.mark.parametrize("currency", ["XUS"]) async def test_create_an_account_with_initial_deposit_balances( target_client: RestClient, currency: str, amount: int ) -> None: account = await target_client.create_account(kyc_data=None, balances={currency: amount}) assert account.id assert await account.balance(currency) == amount @pytest.mark.parametrize( # pyre-ignore "kyc_data", [ offchain.individual_kyc_data(), offchain.entity_kyc_data(), ], ) async def test_create_an_account_with_minimum_valid_kyc_data( target_client: RestClient, kyc_data: offchain.KycDataObject ) -> None: account = await target_client.create_account(kyc_data=kyc_data) assert account.id async def test_create_an_account_with_valid_kyc_data_and_initial_deposit_balances( target_client: RestClient, currency: str ) -> None: minimum_kyc_data = offchain.individual_kyc_data() account = await target_client.create_account(kyc_data=minimum_kyc_data, balances={currency: 123})
def test_dumps_and_loads_request_command(): kyc_data = offchain.individual_kyc_data( given_name="hello", surname="world", address=offchain.AddressObject(city="San Francisco"), national_id=offchain.NationalIdObject(id_value="234121234"), legal_entity_name="foo bar", ) assert offchain.from_json(offchain.to_json(kyc_data), offchain.KycDataObject) == kyc_data payment = offchain.PaymentObject( reference_id="4185027f-0574-6f55-2668-3a38fdb5de98", sender=offchain.PaymentActorObject( address="lbr1p7ujcndcl7nudzwt8fglhx6wxn08kgs5tm6mz4usw5p72t", status=offchain.StatusObject(status=offchain.Status.needs_kyc_data), kyc_data=kyc_data, metadata=["hello", "world"], ), receiver=offchain.PaymentActorObject( address="lbr1p7ujcndcl7nudzwt8fglhx6wxnvqqqqqqqqqqqqelu3xv", status=offchain.StatusObject( status=offchain.Status.abort, abort_code="code1", abort_message="code1 message", ), ), action=offchain.PaymentActionObject(amount=1_000_000_000_000, currency="XUS", timestamp=1604902048), original_payment_reference_id="0185027f-0574-6f55-2668-3a38fdb5de98", ) assert offchain.from_json(offchain.to_json(payment), offchain.PaymentObject) == payment request = offchain.CommandRequestObject( command_type=offchain.CommandType.PaymentCommand, command=offchain.to_dict( offchain.PaymentCommandObject( _ObjectType=offchain.CommandType.PaymentCommand, payment=payment, ) ), cid="3185027f-0574-6f55-2668-3a38fdb5de98", ) assert offchain.from_json(offchain.to_json(request), offchain.CommandRequestObject) == request assert offchain.from_json(offchain.to_json(request)) == request assert json.loads(offchain.to_json(request)) == json.loads( """{ "cid": "3185027f-0574-6f55-2668-3a38fdb5de98", "command_type": "PaymentCommand", "command": { "_ObjectType": "PaymentCommand", "payment": { "reference_id": "4185027f-0574-6f55-2668-3a38fdb5de98", "sender": { "address": "lbr1p7ujcndcl7nudzwt8fglhx6wxn08kgs5tm6mz4usw5p72t", "status": { "status": "needs_kyc_data" }, "kyc_data": { "type": "individual", "payload_version": 1, "given_name": "hello", "surname": "world", "address": { "city": "San Francisco" }, "national_id": { "id_value": "234121234" }, "legal_entity_name": "foo bar" }, "metadata": [ "hello", "world" ] }, "receiver": { "address": "lbr1p7ujcndcl7nudzwt8fglhx6wxnvqqqqqqqqqqqqelu3xv", "status": { "status": "abort", "abort_code": "code1", "abort_message": "code1 message" } }, "action": { "amount": 1000000000000, "currency": "XUS", "action": "charge", "timestamp": 1604902048 }, "original_payment_reference_id": "0185027f-0574-6f55-2668-3a38fdb5de98" } }, "_ObjectType": "CommandRequestObject" }""" )