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
Ejemplo n.º 3
0
    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,
        )
Ejemplo n.º 4
0
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
Ejemplo n.º 7
0
 def gen_kyc_data(name: str) -> offchain.KycDataObject:
     return offchain.individual_kyc_data(given_name=name,
                                         surname=surname)
Ejemplo n.º 8
0
 def kyc_data_object(self) -> offchain.KycDataObject:
     return self.kyc_data if self.kyc_data else offchain.individual_kyc_data(
     )  # pyre-ignore
Ejemplo n.º 9
0
 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"),
     )
Ejemplo n.º 10
0

@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"
}"""
    )