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'
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") )
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') )
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']