def test_holding_create(db, es, document, org_martigny, loc_public_martigny, item_type_standard_martigny, holding_lib_martigny_data): """Test holding creation.""" next_pid = Holding.provider.identifier.next() holding = Holding.create(holding_lib_martigny_data, dbcommit=True, reindex=True, delete_pid=True) next_pid += 1 assert holding == holding_lib_martigny_data assert holding.get('pid') == str(next_pid) holding = Holding.get_record_by_pid(str(next_pid)) assert holding == holding_lib_martigny_data fetched_pid = fetcher(holding.id, holding) assert fetched_pid.pid_value == str(next_pid) assert fetched_pid.pid_type == 'hold' search = HoldingsSearch() es_hit = next(search.filter('term', pid=holding.pid).source('pid').scan()) holding_record = Holding.get_record_by_pid(es_hit.pid) assert holding_record.organisation_pid == org_martigny.get('pid') # holdings does not exist assert not Holding.get_holdings_type_by_holding_pid('toto') # clean created data holding.delete(force=True, dbcommit=True, delindex=True)
def test_holding_item_links(client, holding_lib_martigny, item_lib_martigny, item_lib_martigny_data, document, item_type_on_site_martigny, loc_public_martigny, item_lib_saxon_data, loc_public_saxon, item_type_standard_martigny): """Test holding and item links.""" item = deepcopy(item_lib_martigny_data) del item['pid'] item['barcode'] = 'barcode' item = Item.create(item, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) assert item.holding_pid == holding_lib_martigny.pid assert item.holding_circulation_category_pid == \ item_type_standard_martigny.pid item2 = deepcopy(item_lib_saxon_data) del item2['pid'] item2 = Item.create(item2, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) assert item2.holding_pid != holding_lib_martigny.pid holding = Holding.get_record_by_pid(item2.holding_pid) assert holding.document_pid == document.pid assert holding.circulation_category_pid == item_type_standard_martigny.pid assert Holding.get_document_pid_by_holding_pid(item2.holding_pid) == \ document.pid holdings = list(Holding.get_holdings_pid_by_document_pid(document.pid)) assert holding_lib_martigny.pid in holdings assert item2.holding_pid in holdings assert holding_lib_martigny.get_links_to_me().get('items') assert not holding_lib_martigny.can_delete
def test_create_holdings_with_pattern(client, librarian_martigny_no_email, loc_public_martigny, journal, item_type_standard_martigny, document, json_header, holding_lib_martigny_data, pattern_yearly_one_level_data, holding_lib_martigny_w_patterns_data): """Test create holding type serial with patterns.""" login_user_via_session(client, librarian_martigny_no_email.user) post_entrypoint = 'invenio_records_rest.hold_list' del holding_lib_martigny_data['pid'] holding_lib_martigny_data['holdings_type'] = 'serial' res, _ = postdata(client, post_entrypoint, holding_lib_martigny_data) assert res.status_code == 403 holding_lib_martigny_data['patterns'] = \ pattern_yearly_one_level_data['patterns'] # test will fail when creating a serial holding for a standard document. res, _ = postdata(client, post_entrypoint, holding_lib_martigny_data) assert res.status_code == 403 # test will fail when creating a standard holding for a journal document. holding_lib_martigny_w_patterns_data['holdings_type'] = 'standard' del holding_lib_martigny_w_patterns_data['patterns'] with pytest.raises(RecordValidationError): Holding.create(data=holding_lib_martigny_w_patterns_data, delete_pid=True, dbcommit=True, reindex=True) journal_pids = list(Document.get_all_serial_pids()) assert journal_pids == [journal.pid]
def test_receive_regular_issue(holding_lib_martigny_w_patterns): """Test holdings receive regular issues.""" holding = holding_lib_martigny_w_patterns assert holding.holding_is_serial issue = holding.receive_regular_issue(dbcommit=True, reindex=True) # test holdings call number inheriting assert issue.issue_inherited_first_call_number == \ holding.get('call_number') assert list(holding.get_items)[0].get('pid') == issue.pid assert issue.location_pid == holding.location_pid assert issue.item_type_pid == holding.circulation_category_pid assert issue.document_pid == holding.document_pid assert issue.holding_pid == holding.pid assert issue.get('status') == ItemStatus.ON_SHELF assert issue.item_record_type == 'issue' assert issue.organisation_pid == holding.organisation_pid assert issue.get('issue', {}).get('regular') assert issue.issue_status == ItemIssueStatus.RECEIVED assert issue.expected_date == '2023-03-01' assert issue.get('enumerationAndChronology') == 'no 73 mars 2023' assert issue.received_date == datetime.now().strftime('%Y-%m-%d') issue_status_date = ciso8601.parse_datetime(issue.issue_status_date) assert issue_status_date.strftime('%Y-%m-%d') == \ datetime.now().strftime('%Y-%m-%d') # test change status_date with status changes issue['issue']['status'] = ItemIssueStatus.CLAIMED new_issues = issue.update(issue, dbcommit=True, reindex=True) assert new_issues.issue_status == ItemIssueStatus.CLAIMED new_issue_status_date = ciso8601.parse_datetime( new_issues.issue_status_date) assert new_issue_status_date > issue_status_date holding = Holding.get_record_by_pid(holding.pid) issue = holding.receive_regular_issue(dbcommit=True, reindex=True) assert issue.get('issue', {}).get('regular') assert issue.issue_status == ItemIssueStatus.RECEIVED assert issue.expected_date == '2020-06-01' assert issue.get('enumerationAndChronology') == 'no 62 juin 2020' assert issue.received_date == datetime.now().strftime('%Y-%m-%d') # test create customized regular issue record = { 'issue': { 'regular': True, 'status': ItemIssueStatus.RECEIVED, 'expected_date': datetime.now().strftime('%Y-%m-%d'), 'received_date': datetime.now().strftime('%Y-%m-%d') }, 'enumerationAndChronology': 'free_text' } holding = Holding.get_record_by_pid(holding.pid) issue = holding.receive_regular_issue(item=record, dbcommit=True, reindex=True) assert issue.get('issue', {}).get('regular') assert issue.issue_status == ItemIssueStatus.RECEIVED assert issue.expected_date == datetime.now().strftime('%Y-%m-%d') assert issue.get('enumerationAndChronology') == 'free_text' assert issue.received_date == datetime.now().strftime('%Y-%m-%d')
def test_holding_item_links(client, holding_lib_martigny, item_lib_martigny, item_lib_martigny_data, document, item_type_on_site_martigny, loc_public_martigny, item_lib_saxon_data, loc_public_saxon, item_type_standard_martigny): """Test holding and item links.""" item = deepcopy(item_lib_martigny_data) del item['pid'] item['barcode'] = 'barcode' item = Item.create(item, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) assert item.holding_pid == holding_lib_martigny.pid assert item.holding_circulation_category_pid == \ item_type_standard_martigny.pid item2 = deepcopy(item_lib_saxon_data) del item2['pid'] item2 = Item.create(item2, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) assert item2.holding_pid != holding_lib_martigny.pid holding = Holding.get_record_by_pid(item2.holding_pid) assert holding.document_pid == document.pid assert holding.circulation_category_pid == item_type_standard_martigny.pid assert Holding.get_document_pid_by_holding_pid(item2.holding_pid) == \ document.pid holdings = list(Holding.get_holdings_pid_by_document_pid(document.pid)) assert holding_lib_martigny.pid in holdings assert item2.holding_pid in holdings assert holding_lib_martigny.get_links_to_me().get('items') assert not holding_lib_martigny.can_delete # test loan conditions assert holding_loan_condition_filter(holding_lib_martigny.pid) == \ 'standard' with pytest.raises(Exception): assert holding_loan_condition_filter('no pid') assert holding_location(holding_lib_martigny.replace_refs()) == \ 'Library of Martigny-ville: Martigny Library Public Space' assert holding_circulation_category(holding_lib_martigny) == 'standard' holdings = get_holdings_by_document_item_type( document.pid, item_type_standard_martigny.pid) assert holding_lib_martigny.pid == holdings[1].get('pid') assert list(holding_lib_martigny.get_items)[1].get('pid') == \ item_lib_martigny.pid holding_lib_martigny.delete_from_index() assert not holding_lib_martigny.delete_from_index() holding_lib_martigny.dbcommit(forceindex=True) # test item count by holdings pid assert holding_lib_martigny.get_items_count_by_holding_pid == 2
def test_holding_es_mapping(es, db, holding_lib_martigny, holding_lib_martigny_data): """Test holding elasticsearch mapping.""" search = HoldingsSearch() mapping = get_mapping(search.Meta.index) assert mapping Holding.create(holding_lib_martigny_data, dbcommit=True, reindex=True, delete_pid=True) assert mapping == get_mapping(search.Meta.index)
def test_holding_create(db, es_clear, holding_lib_martigny_data): """Test holding creation.""" holding = Holding.create(holding_lib_martigny_data, delete_pid=True) assert holding == holding_lib_martigny_data assert holding.get('pid') == '1' holding = Holding.get_record_by_pid('1') assert holding == holding_lib_martigny_data fetched_pid = fetcher(holding.id, holding) assert fetched_pid.pid_value == '1' assert fetched_pid.pid_type == 'hold'
def test_holding_extended_validation(client, journal, ebook_5, loc_public_sion, loc_public_martigny, item_type_standard_martigny, item_type_online_sion, holding_lib_martigny_w_patterns_data, holding_lib_sion_electronic_data): """Test holding extended validation.""" # instantiate serial holding holding_tmp = Holding.create( holding_lib_martigny_w_patterns_data, delete_pid=True) # 1. holding type serial # 1.1. test correct holding holding_tmp.validate() # validation with extented_validation rules # 1.1. test next expected date for regular frequencies expected_date = holding_tmp['patterns']['next_expected_date'] del(holding_tmp['patterns']['next_expected_date']) with pytest.raises(ValidationError): holding_tmp.validate() # reset data with original value holding_tmp['patterns']['next_expected_date'] = expected_date # 1.2. test multiple note with same type holding_tmp.get('notes').append({ 'type': 'general_note', 'content': 'other general_note...' }) with pytest.raises(ValidationError): holding_tmp.validate() del holding_tmp['notes'] # 2. holding type electronic # 2.1. test holding type electronic attached to wrong document type holding_tmp['holdings_type'] = 'electronic' with pytest.raises(ValidationError): holding_tmp.validate() # 2.2 test electronic holding # instantiate electronic holding holding_tmp = Holding.create( holding_lib_sion_electronic_data, delete_pid=True) holding_tmp.validate() # 2.2 test electronic holding with enumeration and chronology holding_tmp['enumerationAndChronology'] = 'enumerationAndChronology' holding_tmp.validate()
def test_holding_can_delete_and_utils(client, holding_lib_martigny, document, item_type_standard_martigny): """Test can delete a holding.""" can, reasons = holding_lib_martigny.can_delete assert can assert reasons == {} assert holding_lib_martigny.document_pid == document.pid assert holding_lib_martigny.circulation_category_pid == \ item_type_standard_martigny.pid assert Holding.get_document_pid_by_holding_pid( holding_lib_martigny.pid) == document.pid assert list(Holding.get_holdings_pid_by_document_pid(document.pid))[0] == \ holding_lib_martigny.pid
def test_issues_permissions(client, json_header, holding_lib_martigny_w_patterns, librarian_martigny): """Test specific items issues permissions.""" # receive a regular issue holding = holding_lib_martigny_w_patterns holding = Holding.get_record_by_pid(holding.pid) login_user_via_session(client, librarian_martigny.user) res, data = postdata(client, 'api_holding.receive_regular_issue', url_data=dict(holding_pid=holding.pid)) assert res.status_code == 200 data = get_json(res) issue_item = Item.get_record_by_pid(data.get('issue', {}).get('pid')) assert issue_item is not None assert issue_item.issue_is_regular # a regular issue cannot be deleted res = client.get( url_for('api_blueprint.permissions', route_name='items', record_pid=issue_item.pid)) assert res.status_code == 200 data = get_json(res) assert not data['delete']['can']
def test_item_circulation_dumper(item_lib_martigny): """Test item circulation dumper.""" item = item_lib_martigny item['call_number'] = 'ITEM_MAIN_CN' item['second_call_number'] = 'ITEM_SECOND_CN' holdings = Holding.get_record_by_pid(item.holding_pid) original_holding_data = deepcopy(holdings) holdings['call_number'] = 'HOLDING_MAIN_CN' holdings['second_call_number'] = 'HOLDING_SECOND_CN' holdings.update(holdings, dbcommit=True, reindex=True) # CHECK_1 :: dumped call_numbers are equivalent to item call numbers dumped_data = item.dumps(dumper=ItemCirculationDumper()) assert dumped_data['call_number'] == item['call_number'] item.pop('call_number', None) dumped_data = item.dumps(dumper=ItemCirculationDumper()) assert 'call_number' not in dumped_data assert dumped_data['second_call_number'] == item['second_call_number'] # CHECK_2 :: remove all call_numbers from item, dumped date should # integrate parent holdings call_numbers item.pop('second_call_number', None) dumped_data = item.dumps(dumper=ItemCirculationDumper()) assert dumped_data['call_number'] == holdings['call_number'] assert dumped_data['second_call_number'] == holdings['second_call_number'] # RESET HOLDING RECORD holdings.update(original_holding_data, dbcommit=True, reindex=True)
def test_create_holdings_with_pattern( client, librarian_martigny_no_email, loc_public_martigny, journal, item_type_standard_martigny, document, json_header, holding_lib_martigny_data, pattern_yearly_one_level_data, holding_lib_martigny_w_patterns_data): """Test create holding type serial with patterns.""" login_user_via_session(client, librarian_martigny_no_email.user) post_entrypoint = 'invenio_records_rest.hold_list' del holding_lib_martigny_data['pid'] holding_lib_martigny_data['holdings_type'] = 'serial' res, _ = postdata( client, post_entrypoint, holding_lib_martigny_data ) assert res.status_code == 403 holding_lib_martigny_data['patterns'] = \ pattern_yearly_one_level_data['patterns'] # test will fail when creating a serial holding for a standard document. res, _ = postdata( client, post_entrypoint, holding_lib_martigny_data ) assert res.status_code == 403 # test will not fail when creating a standard holding for a journal doc. holding_lib_martigny_w_patterns_data['holdings_type'] = 'standard' # delete serials fields fields = [ 'enumerationAndChronology', 'notes', 'index', 'missing_issues', 'supplementaryContent', 'patterns' ] for field in fields: del holding_lib_martigny_w_patterns_data[field] Holding.create( data=holding_lib_martigny_w_patterns_data, delete_pid=True, dbcommit=True, reindex=True) journal_pids = list(Document.get_all_serial_pids()) assert journal_pids == [journal.pid]
def holding_lib_fully(app, document, holding_lib_fully_data, loc_public_fully, item_type_standard_martigny): """Create holding of fully library.""" holding = Holding.create(data=holding_lib_fully_data, delete_pid=False, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) return holding
def holding_lib_sion_w_patterns(app, journal, holding_lib_sion_w_patterns_data, loc_public_sion, item_type_regular_sion): """Create holding of sion library with patterns.""" holding = Holding.create(data=holding_lib_sion_w_patterns_data, delete_pid=False, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) return holding
def holding_lib_sion_electronic(app, ebook_5, holding_lib_sion_electronic_data, loc_public_sion, item_type_online_sion): """Create electronic holding of Martigny library.""" holding = Holding.create(data=holding_lib_sion_electronic_data, delete_pid=False, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) return holding
def test_holding_tasks( client, holding_lib_martigny, item_lib_martigny, document, loc_public_saxon): """Test delete standard holdings with no items attached.""" # move item to a new holdings record by changing its location item_lib_martigny['location'] = \ {'$ref': 'https://bib.rero.ch/api/locations/loc3'} item = item_lib_martigny.update( item_lib_martigny, dbcommit=True, reindex=True) holdings_pid = holding_lib_martigny.pid # parent holding has no items and it is not automatically deleted. hold = Holding.get_record_by_pid(holdings_pid) assert hold # execute job to delete standard holdings with no attached items. delete_standard_holdings_having_no_items() hold = Holding.get_record_by_pid(holdings_pid) # holdings no longer exist. assert not hold
def holding_lib_sion(app, document, holding_lib_sion_data, loc_public_sion, item_type_internal_sion): """Create holding of sion library.""" holding = Holding.create(data=holding_lib_sion_data, delete_pid=False, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) return holding
def test_holding_can_delete_and_utils(client, holding_lib_martigny, document, item_type_standard_martigny): """Test can delete a holding.""" links = holding_lib_martigny.get_links_to_me() assert 'items' not in links assert holding_lib_martigny.can_delete reasons = holding_lib_martigny.reasons_not_to_delete() assert 'links' not in reasons assert holding_lib_martigny.document_pid == document.pid assert holding_lib_martigny.circulation_category_pid == \ item_type_standard_martigny.pid assert Holding.get_document_pid_by_holding_pid( holding_lib_martigny.pid) == document.pid assert list(Holding.get_holdings_pid_by_document_pid(document.pid))[0] == \ holding_lib_martigny.pid
def test_receive_regular_issue(holding_lib_martigny_w_patterns): """Test holdings receive regular issues.""" holding = holding_lib_martigny_w_patterns issue = holding.receive_regular_issue(dbcommit=True, reindex=True) assert issue.location_pid == holding.location_pid assert issue.item_type_pid == holding.circulation_category_pid assert issue.document_pid == holding.document_pid assert issue.holding_pid == holding.pid assert issue.get('status') == 'on_shelf' assert issue.item_record_type == 'issue' assert issue.organisation_pid == holding.organisation_pid assert issue.get('issue', {}).get('regular') assert issue.issue_status == 'received' assert issue.expected_date == '2023-03-01' assert issue.display_text == 'no 73 mars 2023' assert issue.received_date == datetime.now().strftime('%Y-%m-%d') holding = Holding.get_record_by_pid(holding.pid) issue = holding.receive_regular_issue(dbcommit=True, reindex=True) assert issue.get('issue', {}).get('regular') assert issue.issue_status == 'received' assert issue.expected_date == '2020-06-01' assert issue.display_text == 'no 62 juin 2020' assert issue.received_date == datetime.now().strftime('%Y-%m-%d') # test create customized regular issue record = { 'issue': { 'regular': True, 'status': 'received', 'expected_date': datetime.now().strftime('%Y-%m-%d'), 'received_date': datetime.now().strftime('%Y-%m-%d'), 'display_text': 'free_text' } } holding = Holding.get_record_by_pid(holding.pid) issue = holding.receive_regular_issue(item=record, dbcommit=True, reindex=True) assert issue.get('issue', {}).get('regular') assert issue.issue_status == 'received' assert issue.expected_date == datetime.now().strftime('%Y-%m-%d') assert issue.display_text == 'free_text' assert issue.received_date == datetime.now().strftime('%Y-%m-%d')
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_receive_regular_issue_api(client, holding_lib_martigny_w_patterns, librarian_fully_no_email, librarian_martigny_no_email, system_librarian_sion_no_email): """Test holdings receive regular issues API.""" holding = holding_lib_martigny_w_patterns holding = Holding.get_record_by_pid(holding.pid) issue_display, expected_date = holding._get_next_issue_display_text( holding.get('patterns')) # not logged users are not authorized res, data = postdata(client, 'api_holding.receive_regular_issue', url_data=dict(holding_pid=holding.pid)) assert res.status_code == 401 # librarian of another library are not authoritzed to receive issues # for another library. login_user_via_session(client, librarian_fully_no_email.user) res, data = postdata(client, 'api_holding.receive_regular_issue', url_data=dict(holding_pid=holding.pid)) assert res.status_code == 401 # only users of same organisation may receive issues. login_user_via_session(client, system_librarian_sion_no_email.user) res, data = postdata(client, 'api_holding.receive_regular_issue', url_data=dict(holding_pid=holding.pid)) assert res.status_code == 401 login_user_via_session(client, librarian_martigny_no_email.user) res, data = postdata(client, 'api_holding.receive_regular_issue', url_data=dict(holding_pid=holding.pid)) assert res.status_code == 200 issue = get_json(res).get('issue') assert issue.get('enumerationAndChronology') == issue_display assert issue.get('issue').get('expected_date') == expected_date item = { 'issue': { 'regular': True, 'status': ItemIssueStatus.RECEIVED, 'expected_date': datetime.now().strftime('%Y-%m-%d'), 'received_date': datetime.now().strftime('%Y-%m-%d') }, 'enumerationAndChronology': 'free_text' } res, data = postdata(client, 'api_holding.receive_regular_issue', data=dict(item=item), url_data=dict(holding_pid=holding.pid)) assert res.status_code == 200 issue = get_json(res).get('issue') assert issue.get('enumerationAndChronology') == 'free_text' assert issue.get('issue').get('expected_date') == \ datetime.now().strftime('%Y-%m-%d')
def holding_lib_martigny_w_patterns(app, journal, holding_lib_martigny_w_patterns_data, loc_public_martigny, item_type_standard_martigny): """Create holding of martigny library with patterns.""" holding = Holding.create(data=holding_lib_martigny_w_patterns_data, delete_pid=False, dbcommit=True, reindex=True) flush_index(HoldingsSearch.Meta.index) return holding
def test_holding_delete_after_item_edition(client, holding_lib_saxon, item_lib_saxon, holding_lib_fully): """Test automatic holding delete after item edition.""" item_lib_saxon['location'] = \ {'$ref': 'https://ils.rero.ch/api/locations/loc5'} item_lib_saxon.update(item_lib_saxon, dbcommit=True, reindex=True) flush_index(ItemsSearch.Meta.index) item = Item.get_record_by_pid(item_lib_saxon.pid) assert item.holding_pid == holding_lib_fully.pid holding = Holding.get_record_by_pid(holding_lib_saxon.pid) assert not holding
def test_holding_es_mapping(es, db, loc_public_martigny, item_type_standard_martigny, document, holding_lib_martigny_data): """Test holding elasticsearch mapping.""" search = HoldingsSearch() mapping = get_mapping(search.Meta.index) assert mapping holding = Holding.create(holding_lib_martigny_data, dbcommit=True, reindex=True, delete_pid=True) assert mapping == get_mapping(search.Meta.index) # clean created data holding.delete(force=True, dbcommit=True, delindex=True)
def test_holding_create(db, es_clear, document, org_martigny, loc_public_martigny, item_type_standard_martigny, holding_lib_martigny_data): """Test holding creation.""" holding = Holding.create(holding_lib_martigny_data, dbcommit=True, reindex=True, delete_pid=True) flush_index(HoldingsSearch.Meta.index) assert holding == holding_lib_martigny_data assert holding.get('pid') == '1' holding = Holding.get_record_by_pid('1') assert holding == holding_lib_martigny_data fetched_pid = fetcher(holding.id, holding) assert fetched_pid.pid_value == '1' assert fetched_pid.pid_type == 'hold' search = HoldingsSearch() holding = next(search.filter('term', pid=holding.pid).scan()) holding_record = Holding.get_record_by_pid(holding.pid) assert holding_record.organisation_pid == org_martigny.get('pid')
def test_automatic_item_creation_no_serials(client, json_header, holding_lib_martigny_w_patterns, item_lib_martigny_data, librarian_martigny_no_email): """Test automatically created items are not attached to serials.""" login_user_via_session(client, librarian_martigny_no_email.user) post_url = 'invenio_records_rest.item_list' res, _ = postdata(client, post_url, item_lib_martigny_data) assert res.status_code == 201 item = Item.get_record_by_pid(item_lib_martigny_data.get('pid')) holding = Holding.get_record_by_pid(item.holding_pid) assert holding.pid != holding_lib_martigny_w_patterns.pid assert holding.location_pid == holding_lib_martigny_w_patterns.location_pid assert holding.get('circulation_category') == \ holding_lib_martigny_w_patterns.get('circulation_category')
def test_holding_validate_next_expected_date( client, librarian_martigny, journal, loc_public_sion, item_type_internal_sion, document, pattern_yearly_two_times_data, json_header, holding_lib_sion_w_patterns_data): """Test create holding with regular frequency and missing the next_expected_date. """ login_user_via_session(client, librarian_martigny.user) holding = holding_lib_sion_w_patterns_data holding['holdings_type'] = 'serial' holding['patterns'] = \ pattern_yearly_two_times_data['patterns'] del holding['pid'] del holding['patterns']['next_expected_date'] # test will fail when the serial holding has no field # next_expected_date for the regular frequency with pytest.raises(ValidationError): Holding.create( data=holding, delete_pid=False, dbcommit=True, reindex=True)
def test_patterns_yearly_two_times(holding_lib_martigny_w_patterns, pattern_yearly_two_times_data): """Test pattern yearly two times.""" holding = holding_lib_martigny_w_patterns holding = Holding.get_record_by_pid(holding.pid) holding['patterns'] = pattern_yearly_two_times_data['patterns'] # test first issue assert holding.next_issue_display_text == 'Jg. 8 Nov. 2019' holding.increment_next_prediction() assert holding.next_issue_display_text == 'Jg. 9 März 2020' for r in range(25): holding.increment_next_prediction() assert holding.next_issue_display_text == 'Jg. 21 Nov. 2032' # test preview issues = holding.prediction_issues_preview(13) assert issues[-1]['issue'] == 'Jg. 27 Nov. 2038'
def test_patterns_quarterly_two_levels(holding_lib_martigny_w_patterns, pattern_quarterly_two_levels_data): """Test pattern quarterly_two_levels.""" holding = holding_lib_martigny_w_patterns holding = Holding.get_record_by_pid(holding.pid) holding['patterns'] = pattern_quarterly_two_levels_data['patterns'] # test first issue assert holding.next_issue_display_text == 'Jg. 20 Heft 1 2020' holding.increment_next_prediction() assert holding.next_issue_display_text == 'Jg. 20 Heft 2 2020' for r in range(25): holding.increment_next_prediction() assert holding.next_issue_display_text == 'Jg. 26 Heft 3 2026' # test preview issues = holding.prediction_issues_preview(13) assert issues[-1]['issue'] == 'Jg. 29 Heft 3 2029'
def test_patterns_yearly_one_level_with_label( holding_lib_martigny_w_patterns, pattern_yearly_one_level_with_label_data): """Test pattern yearly one level with label.""" holding = holding_lib_martigny_w_patterns holding = Holding.get_record_by_pid(holding.pid) holding['patterns'] = pattern_yearly_one_level_with_label_data['patterns'] # test first issue assert holding.next_issue_display_text == '29 Edition 2020' holding.increment_next_prediction() assert holding.next_issue_display_text == '30 Edition 2021' for r in range(25): holding.increment_next_prediction() assert holding.next_issue_display_text == '55 Edition 2046' # test preview issues = holding.prediction_issues_preview(13) assert issues[-1]['issue'] == '67 Edition 2058'