def test_holding_delete_after_item_deletion( client, holding_lib_martigny, item_lib_martigny): """Test automatic holding delete after deleting last item.""" for pid in Item.get_all_pids(): if pid != item_lib_martigny.pid: item = Item.get_record_by_pid(pid) Item.delete(item, dbcommit=True, delindex=True) flush_index(ItemsSearch.Meta.index) pid = holding_lib_martigny.pid holding = Holding.get_record_by_pid(pid) assert not holding.can_delete item_lib_martigny.delete(dbcommit=True, delindex=True) flush_index(ItemsSearch.Meta.index) pid = holding_lib_martigny.pid holding = Holding.get_record_by_pid(pid) assert not holding
def test_holding_requests(client, patron_martigny, loc_public_martigny, circulation_policies, librarian_martigny, holding_lib_martigny_w_patterns, lib_martigny, item_lib_martigny, org_martigny): """Test holding patron request.""" login_user_via_session(client, patron_martigny.user) holding = holding_lib_martigny_w_patterns description = 'Year: 2000 / volume: 15 / number: 22 / pages: 11-12' # test fails when there is a missing description or holding_pid res, data = postdata( client, 'api_holding.patron_request', dict(holding_pid=holding.pid, pickup_location_pid=loc_public_martigny.pid)) assert res.status_code == 400 res, data = postdata( client, 'api_holding.patron_request', dict(description=description, pickup_location_pid=loc_public_martigny.pid)) assert res.status_code == 404 # test passes when all required parameters are given res, data = postdata( client, 'api_holding.patron_request', dict(holding_pid=holding.pid, pickup_location_pid=loc_public_martigny.pid, description=description)) assert res.status_code == 200 loan = Loan.get_record_by_pid( data.get('action_applied')[LoanAction.REQUEST].get('pid')) assert loan.state == LoanState.PENDING item = Item.get_record_by_pid(loan.item_pid) assert item.get('type') == TypeOfItem.PROVISIONAL assert item.status == ItemStatus.ON_SHELF assert item.holding_pid == holding.pid assert item.get('enumerationAndChronology') == description # checkout the item to the requested patron login_user_via_session(client, librarian_martigny.user) res, data = postdata( client, 'api_item.checkout', dict( item_pid=item.pid, patron_pid=patron_martigny.pid, transaction_location_pid=loc_public_martigny.pid, transaction_user_pid=librarian_martigny.pid, )) assert res.status_code == 200 loan_pid = data.get('action_applied')[LoanAction.CHECKOUT].get('pid') assert loan_pid == loan.pid item = Item.get_record_by_pid(item.pid) assert item.status == ItemStatus.ON_LOAN # return the item at the owning library res, data = postdata( client, 'api_item.checkin', dict(item_pid=item.pid, transaction_location_pid=loc_public_martigny.pid, transaction_user_pid=librarian_martigny.pid)) assert res.status_code == 200 item = Item.get_record_by_pid(item.pid) assert item.status == ItemStatus.ON_SHELF # test requests made by a librarian # test fails when there are missing parameters res, data = postdata( client, 'api_holding.librarian_request', dict(holding_pid=holding.pid, pickup_location_pid=loc_public_martigny.pid, description=description, transaction_library_pid=lib_martigny.pid, transaction_user_pid=librarian_martigny.pid)) assert res.status_code == 400 res, data = postdata( client, 'api_holding.librarian_request', dict(holding_pid=holding.pid, pickup_location_pid=loc_public_martigny.pid, description=description, patron_pid=patron_martigny.pid, transaction_library_pid=lib_martigny.pid)) assert res.status_code == 400 res, data = postdata( client, 'api_holding.librarian_request', dict(holding_pid=holding.pid, pickup_location_pid=loc_public_martigny.pid, patron_pid=patron_martigny.pid, transaction_library_pid=lib_martigny.pid, transaction_user_pid=librarian_martigny.pid)) assert res.status_code == 400 # test passes when all required parameters are given res, data = postdata( client, 'api_holding.librarian_request', dict(holding_pid=holding.pid, pickup_location_pid=loc_public_martigny.pid, description=description, patron_pid=patron_martigny.pid, transaction_library_pid=lib_martigny.pid, transaction_user_pid=librarian_martigny.pid)) assert res.status_code == 200 loan_2 = Loan.get_record_by_pid( data.get('action_applied')[LoanAction.REQUEST].get('pid')) assert loan_2.state == LoanState.PENDING item_2 = Item.get_record_by_pid(loan_2.item_pid) assert item_2.get('type') == TypeOfItem.PROVISIONAL assert item_2.status == ItemStatus.ON_SHELF assert item_2.holding_pid == holding.pid assert item_2.get('enumerationAndChronology') == description assert item_2.pid != item.pid all_item_pids = [pid for pid in Item.get_all_pids()] assert all_item_pids # test delete provisional items with no active fees/loans report = delete_provisional_items() assert report.get('numner_of_deleted_items') assert report.get('number_of_candidate_items_to_delete') # assert that not deleted items are either having loans/fees or not # provisional items left_item_pids = [pid for pid in Item.get_all_pids()] assert left_item_pids for pid in left_item_pids: record = Item.get_record_by_pid(pid) can, _ = record.can_delete assert not can or record.get('type') != TypeOfItem.PROVISIONAL # item_2 has pending loans then it should not be removed assert item_2.pid in left_item_pids assert item_2.pid in get_provisional_items_pids_candidate_to_delete() # add fee to item_2 and make sure it will not be candidate at the deletion. data = { 'loan': { '$ref': get_ref_for_pid('loanid', loan_2.pid) }, 'patron': { '$ref': get_ref_for_pid('patrons', patron_martigny.pid) }, 'organisation': { '$ref': get_ref_for_pid('org', org_martigny.pid) }, 'status': 'open', 'total_amount': 0.6, 'type': 'overdue', 'creation_date': datetime.now(timezone.utc).isoformat() } PatronTransaction.create(data, dbcommit=True, reindex=True) assert item_2.pid not in get_provisional_items_pids_candidate_to_delete()