Пример #1
0
def test_document_requests_on_item_returned(mock_available_item,
                                            mock_pending_loans_for_document,
                                            mock_is_item_available,
                                            loan_created, db, params):
    """Test loan request action."""

    # return item is not available
    mock_available_item.return_value = False

    with SwappedConfig('CIRCULATION_DOCUMENT_RETRIEVER_FROM_ITEM',
                       lambda x: 'document_pid'):
        same_location = params['transaction_location_pid']
        with SwappedConfig('CIRCULATION_ITEM_LOCATION_RETRIEVER',
                           lambda x: same_location):
            # start a loan on item with pid 'item_pid'
            new_loan = current_circulation.circulation.trigger(
                loan_created, **dict(params,
                                     trigger='checkout',
                                     item_pid='item_pid',
                                     pickup_location_pid='pickup_location_pid')
            )
            db.session.commit()
            assert new_loan['state'] == 'ITEM_ON_LOAN'

            # create a new loan request on document_pid without items available
            new_loan_created = Loan.create({})
            # remove item_pid
            params.pop('item_pid')
            pending_loan = current_circulation.circulation.trigger(
                new_loan_created,
                **dict(params, trigger='request',
                       document_pid='document_pid',
                       pickup_location_pid='pickup_location_pid')
            )
            db.session.commit()
            assert pending_loan['state'] == 'PENDING'
            # no item available found. Request is created with no item attached
            assert 'item_pid' not in pending_loan
            assert pending_loan['document_pid'] == 'document_pid'

            # resolve pending document requests to `document_pid`
            mock_pending_loans_for_document.return_value = [pending_loan]

            returned_loan = current_circulation.circulation.trigger(
                new_loan, **dict(params,
                                 item_pid='item_pid',
                                 pickup_location_pid='pickup_location_pid')
            )
            db.session.commit()
            assert returned_loan['state'] == 'ITEM_RETURNED'

            # item `item_pid` has been attached to pending loan request on
            # `document_pid` automatically
            assert pending_loan['state'] == 'PENDING'
            assert pending_loan['item_pid'] == 'item_pid'
            assert pending_loan['document_pid'] == 'document_pid'
Пример #2
0
def test_should_fail_when_patron_not_exist(loan_created, params):
    """Test that transition fails when loan patron do not exists."""
    with pytest.raises(TransitionConstraintsViolation):
        with SwappedConfig("CIRCULATION_PATRON_EXISTS", lambda x: False):
            current_circulation.circulation.trigger(
                loan_created, **dict(params, trigger="checkout")
            )
Пример #3
0
def test_should_fail_when_item_not_exist(loan_created, params):
    """Test that transition fails when loan item do not exists."""
    with pytest.raises(TransitionConstraintsViolation):
        with SwappedConfig('CIRCULATION_ITEM_EXISTS', lambda x: False):
            current_circulation.circulation.trigger(
                loan_created, **dict(params, trigger='checkout')
            )
Пример #4
0
def test_should_fail_when_patron_is_changed(loan_created, db, params):
    """Test that constraints fail if patron for an existing loan is changed."""
    with SwappedConfig(
        "CIRCULATION_ITEM_LOCATION_RETRIEVER", lambda x: "pickup_location_pid"
    ):
        loan = current_circulation.circulation.trigger(
            loan_created, **dict(params, trigger="request")
        )
    db.session.commit()

    params["patron_pid"] = "different_patron_pid"
    with pytest.raises(TransitionConstraintsViolation):
        current_circulation.circulation.trigger(loan, **dict(params))
def test_validate_item_in_transit_for_pickup(loan_created, db, params):
    """."""
    loan = current_circulation.circulation.trigger(
        loan_created,
        **dict(params,
               trigger='request',
               pickup_location_pid='pickup_location_pid'))
    db.session.commit()
    assert loan['state'] == 'PENDING'

    with SwappedConfig('CIRCULATION_ITEM_LOCATION_RETRIEVER',
                       lambda x: 'external_location_pid'):
        loan = current_circulation.circulation.trigger(loan, **dict(params))
        assert loan['state'] == 'ITEM_IN_TRANSIT_FOR_PICKUP'
def test_validate_item_at_desk(loan_created, db, params):
    """."""
    loan = current_circulation.circulation.trigger(
        loan_created,
        **dict(params,
               trigger='request',
               pickup_location_pid='pickup_location_pid'))
    db.session.commit()
    assert loan['state'] == 'PENDING'

    with SwappedConfig('CIRCULATION_ITEM_LOCATION_RETRIEVER',
                       lambda x: 'pickup_location_pid'):
        loan = current_circulation.circulation.trigger(loan_created,
                                                       **dict(params))
        assert loan['state'] == 'ITEM_AT_DESK'
def test_loan_checkout_checkin(loan_created, db, params):
    """Test loan checkout and checkin actions."""
    assert loan_created['state'] == 'CREATED'

    loan = current_circulation.circulation.trigger(
        loan_created, **dict(params, trigger='checkout'))
    db.session.commit()
    assert loan['state'] == 'ITEM_ON_LOAN'

    # set same transaction location to avoid "in transit"
    same_location = params['transaction_location_pid']
    with SwappedConfig('CIRCULATION_ITEM_LOCATION_RETRIEVER',
                       lambda x: same_location):
        loan = current_circulation.circulation.trigger(loan, **dict(params))
        db.session.commit()
        assert loan['state'] == 'ITEM_RETURNED'
def test_request_on_document_with_unavailable_items(mock_available_item,
                                                    loan_created, db, params):
    """Test loan request action."""
    mock_available_item.return_value = False
    with SwappedConfig('CIRCULATION_ITEMS_RETRIEVER_FROM_DOCUMENT',
                       lambda x: ['item_pid']):
        loan = current_circulation.circulation.trigger(
            loan_created,
            **dict(params,
                   trigger='request',
                   item_pid=None,
                   document_pid='document_pid',
                   pickup_location_pid='pickup_location_pid'))
        db.session.commit()
        assert loan['state'] == 'PENDING'
        assert loan['item_pid'] is None
        assert loan['document_pid'] == 'document_pid'
def test_checkin_end_date_is_transaction_date(loan_created, db, params):
    """Test date the checkin date is the transaction date."""
    loan = current_circulation.circulation.trigger(
        loan_created,
        **dict(params,
               start_date='2018-02-01T09:30:00+02:00',
               end_date='2018-02-10T09:30:00+02:00',
               trigger='checkout'))
    db.session.commit()
    assert loan['state'] == 'ITEM_ON_LOAN'

    same_location = params['transaction_location_pid']
    with SwappedConfig('CIRCULATION_ITEM_LOCATION_RETRIEVER',
                       lambda x: same_location):
        params['transaction_date'] = '2018-03-11T19:15:00+02:00'
        loan = current_circulation.circulation.trigger(loan, **dict(params))
        assert loan['state'] == 'ITEM_RETURNED'
        assert loan['end_date'] == params['transaction_date']