def test_activate_new_debtor(db_session):
    with pytest.raises(p.InvalidDebtor):
        debtor = p.reserve_debtor(MAX_INT64 + 1)

    debtor = p.reserve_debtor(D_ID)
    assert debtor.debtor_id == D_ID
    assert not debtor.is_activated
    assert len(Debtor.query.all()) == 1
    with pytest.raises(p.DebtorExists):
        p.reserve_debtor(D_ID)

    assert not p.get_active_debtor(D_ID)
    with pytest.raises(p.InvalidReservationId):
        p.activate_debtor(D_ID, -123)
    p.activate_debtor(D_ID, debtor.reservation_id)
    debtor = p.get_active_debtor(D_ID)
    assert debtor
    assert debtor.is_activated
    cas = ConfigureAccountSignal.query.one()
    assert cas.debtor_id == D_ID
    assert cas.config_data == ''
    assert cas.config_flags == 0

    with pytest.raises(p.DebtorExists):
        p.reserve_debtor(D_ID)
def test_process_account_purge_signal(db_session, debtor, current_ts):
    creation_date = date(2020, 1, 10)
    p.process_account_update_signal(
        debtor_id=D_ID,
        creditor_id=p.ROOT_CREDITOR_ID,
        last_change_seqnum=1,
        last_change_ts=current_ts,
        principal=0,
        interest_rate=0.0,
        creation_date=creation_date,
        last_config_ts=TS0,
        last_config_seqnum=0,
        config_data='',
        account_id='0',
        transfer_note_max_bytes=100,
        negligible_amount=2.0,
        config_flags=0,
        ts=current_ts,
        ttl=1000000,
    )
    d = p.get_active_debtor(D_ID)
    assert d.has_server_account

    p.process_account_purge_signal(
        debtor_id=D_ID,
        creditor_id=p.ROOT_CREDITOR_ID,
        creation_date=creation_date,
    )
    d = p.get_active_debtor(D_ID)
    assert not d.has_server_account
def test_process_rejected_config_signal(debtor):
    d = p.get_active_debtor(D_ID)
    assert d.config_error is None

    params = {
        'debtor_id': D_ID,
        'creditor_id': ROOT_CREDITOR_ID,
        'config_ts': debtor.last_config_ts,
        'config_seqnum': debtor.last_config_seqnum,
        'negligible_amount': HUGE_NEGLIGIBLE_AMOUNT,
        'config_data': '',
        'config_flags': debtor.config_flags,
        'rejection_code': 'TEST_CODE',
    }
    p.process_rejected_config_signal(**{**params, 'config_data': 'UNEXPECTED'})
    p.process_rejected_config_signal(
        **{
            **params, 'negligible_amount': HUGE_NEGLIGIBLE_AMOUNT * 1.0001
        })
    p.process_rejected_config_signal(
        **{
            **params, 'config_flags': d.config_flags ^ 1
        })
    p.process_rejected_config_signal(
        **{
            **params, 'config_seqnum': d.last_config_seqnum - 1
        })
    p.process_rejected_config_signal(
        **{
            **params, 'config_seqnum': d.last_config_seqnum + 1
        })
    p.process_rejected_config_signal(
        **{
            **params, 'config_ts': d.last_config_ts + timedelta(seconds=-1)
        })
    p.process_rejected_config_signal(
        **{
            **params, 'config_ts': d.last_config_ts + timedelta(seconds=1)
        })
    d = p.get_active_debtor(D_ID)
    assert d.config_error is None

    p.process_rejected_config_signal(**params)
    d = p.get_active_debtor(D_ID)
    assert d.config_error == 'TEST_CODE'

    p.process_rejected_config_signal(**params)
    assert d.config_error == 'TEST_CODE'
Beispiel #4
0
    def get(self, debtorId):
        """Redirect to the debtor's public info document.

        The user will be redirected to the info URL specified in the
        debtor's configuration. If no URL is specified in the
        configuration, a `404` error code will be returned.

        """

        debtor = procedures.get_active_debtor(debtorId) or abort(404)
        location = debtor.debtor_info_iri or abort(404)
        response = redirect(location, code=302)
        response.headers['Cache-Control'] = 'max-age=86400'

        return response
def test_update_debtor_config(debtor):
    last_config_ts = debtor.last_config_ts
    last_config_seqnum = debtor.last_config_seqnum

    p.update_debtor_config(D_ID, config_data='TEST', latest_update_id=2)
    debtor = p.get_active_debtor(D_ID)
    assert debtor
    assert debtor.config_data == 'TEST'
    assert debtor.last_config_seqnum == last_config_seqnum + 1
    assert debtor.last_config_ts >= last_config_ts

    cas = ConfigureAccountSignal.query.one()
    assert cas.debtor_id == D_ID
    assert cas.config_data == 'TEST'
    assert cas.config_flags == 0
    assert cas.ts == debtor.last_config_ts
    assert cas.seqnum == debtor.last_config_seqnum
Beispiel #6
0
    def get(self, debtorId):
        """Return debtors's configuration."""

        return procedures.get_active_debtor(debtorId) or abort(404)
Beispiel #7
0
    def get(self, debtorId):
        """Return debtor."""

        return procedures.get_active_debtor(debtorId) or abort(403)