Esempio n. 1
0
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)
Esempio n. 2
0
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
Esempio n. 3
0
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')
Esempio n. 5
0
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'
Esempio n. 8
0
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()
Esempio n. 9
0
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
Esempio n. 10
0
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']
Esempio n. 11
0
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)
Esempio n. 12
0
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]
Esempio n. 13
0
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
Esempio n. 14
0
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
Esempio n. 15
0
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
Esempio n. 16
0
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
Esempio n. 17
0
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
Esempio n. 18
0
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
Esempio n. 19
0
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')
Esempio n. 20
0
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
Esempio n. 21
0
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')
Esempio n. 22
0
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
Esempio n. 23
0
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
Esempio n. 24
0
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)
Esempio n. 25
0
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')
Esempio n. 26
0
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')
Esempio n. 27
0
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)
Esempio n. 28
0
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'
Esempio n. 29
0
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'
Esempio n. 30
0
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'