Пример #1
0
def test_metadata_schema(
        vocabulary_clear, full_input_record, full_record,
        minimal_input_record, minimal_record):
    """Test metadata schema."""
    # Test full attributes
    data = MetadataSchemaV1().load(full_input_record)
    assert data == full_record

    # Test minimal attributes
    data = MetadataSchemaV1().load(minimal_input_record)
    assert data == minimal_record
def test_publication_date(
        vocabulary_clear, minimal_input_record, minimal_record):
    def assert_publication_dates(data, expected):
        assert data['publication_date'] == expected_record['publication_date']
        assert (
            data['_publication_date_search'] ==
            expected_record['_publication_date_search']
        )

    expected_record = minimal_record

    # Partial
    minimal_input_record['publication_date'] = '2020-02'
    expected_record['publication_date'] = '2020-02'
    expected_record['_publication_date_search'] = '2020-02-01'

    data = MetadataSchemaV1().load(minimal_input_record)

    assert_publication_dates(data, expected_record)

    # Interval (asymmetrical is allowed!)
    minimal_input_record['publication_date'] = '2020-02-02/2025-12'
    expected_record['publication_date'] = '2020-02-02/2025-12'
    expected_record['_publication_date_search'] = '2020-02-02'

    data = MetadataSchemaV1().load(minimal_input_record)

    assert_publication_dates(data, expected_record)

    # Invalid date
    minimal_input_record['publication_date'] = 'invalid'
    with pytest.raises(ValidationError):
        data = MetadataSchemaV1().load(minimal_input_record)

    # Invalid interval
    minimal_input_record['publication_date'] = '2025-12/2020-02-02'
    with pytest.raises(ValidationError):
        data = MetadataSchemaV1().load(minimal_input_record)
Пример #3
0
def test_identifiers(minimal_input_record):
    """Test Identifiers field."""
    # No 'identifiers' field at all is supported
    data = MetadataSchemaV1().load(minimal_input_record)
    assert data.get('identifiers') == minimal_input_record.get('identifiers')

    # Empty dict
    minimal_input_record['identifiers'] = {}
    data = MetadataSchemaV1().load(minimal_input_record)
    assert data['identifiers'] == minimal_input_record['identifiers']

    # Minimal
    minimal_input_record['identifiers'] = {
        "DOI": "10.5281/zenodo.9999999",
    }
    data = MetadataSchemaV1().load(minimal_input_record)
    assert data['identifiers'] == minimal_input_record['identifiers']

    # Different schemes
    minimal_input_record['identifiers'] = {
        "DOI": "10.5281/zenodo.9999999",
        "ARK": "ark:/123/456",
    }
    data = MetadataSchemaV1().load(minimal_input_record)
    assert data['identifiers'] == minimal_input_record['identifiers']

    # With duplicate schemes, only last one is picked
    minimal_input_record['identifiers'] = {
        "DOI": "10.5281/zenodo.9999999",
        "DOI": "10.5281/zenodo.0000000",
    }
    data = MetadataSchemaV1().load(minimal_input_record)
    assert data['identifiers'] == minimal_input_record['identifiers']
    assert data['identifiers']['DOI'] == "10.5281/zenodo.0000000"

    # Invalid: no identifier
    minimal_input_record['identifiers'] = {
        "DOI": ""
    }
    with pytest.raises(ValidationError):
        data = MetadataSchemaV1().load(minimal_input_record)

    # Invalid: no scheme
    minimal_input_record['identifiers'] = {
        "": "10.5281/zenodo.9999999"
    }
    with pytest.raises(ValidationError):
        data = MetadataSchemaV1().load(minimal_input_record)
Пример #4
0
def test_extensions(db, minimal_record):
    """Test MetadataSchemaV1 dump() for 'extensions' field.

    Right now we are going for a schema level test which turns out to still be
    heavy, so something fundamental is lacking.
    """
    data = {
        'extensions': {
            'dwc:family': 'Felidae',
            'dwc:behavior': 'Plays with yarn, sleeps in cardboard box.',
            'nubiomed:right_or_wrong': True,
        }
    }
    minimal_record.update(data)
    record = Record.create(minimal_record)
    db.session.commit()

    serialized_record = MetadataSchemaV1().dump(record)  # returns MarshmalDict

    assert serialized_record['extensions'] == data['extensions']
Пример #5
0
def test_dumping_empty_record():
    empty_record = dump_empty(MetadataSchemaV1())

    assert empty_record == {
        '_access': {'files_restricted': None, 'metadata_restricted': None},
        '_default_preview': None,
        '_communities': None,
        '_contact': None,
        '_created_by': None,
        '_embargo_date': None,
        '_files': [
            {
                'bucket': None,
                'checksum': None,
                'key': None,
                'links': None,
                'size': None,
                'type': None
            }
        ],
        '_internal_notes': [
            {
                'user': None,
                'timestamp': None,
                'note': None
            }
        ],
        '_owners': [None],
        'access_right': None,
        'contributors': [
            {
                'affiliations': [
                    {
                        'name': None,
                        'identifiers': None,
                    }
                ],
                'family_name': None,
                'given_name': None,
                'identifiers': None,
                'name': None,
                'role': None,
                'type': None,
            }
        ],
        'creators': [
            {
                'affiliations': [
                    {
                        'name': None,
                        'identifiers': None,
                    }
                ],
                'family_name': None,
                'given_name': None,
                'identifiers': None,
                'name': None,
                'type': None,
            }
        ],
        'dates': [
            {
                'type': None,
                'end': None,
                'description': None,
                'start': None
            }
        ],
        'extensions': None,
        'descriptions': [
            {
                'type': None,
                'lang': None,
                'description': None
            }
        ],
        'language': None,
        'locations': [
            {
                'description': None,
                'point': {
                    'lon': None,
                    'lat': None
                },
                'place': None
            }
        ],
        'licenses': [
            {
                'identifier': None,
                'scheme': None,
                'uri': None,
                'license': None
            }
        ],
        'version': None,
        'publication_date': None,
        'references': [
            {
                'scheme': None,
                'reference_string': None,
                'identifier': None
            }
        ],
        'related_identifiers': [
            {
                'resource_type': {
                    'subtype': None,
                    'type': None
                },
                'scheme': None,
                'relation_type': None,
                'identifier': None
            }
        ],
        'resource_type': {
            'subtype': None,
            'type': None
        },
        'subjects': [{'subject': None, 'identifier': None, 'scheme': None}],
        'titles': [
            {
                'type': None,
                'lang': None,
                'title': None
            }
        ],
        # TODO: Investigate the impact of these 2 fields on
        #       frontend to backend to frontend flow
        'identifiers': None,
        'recid': None
    }
Пример #6
0
def test_embargo_date(vocabulary_clear, minimal_input_record):
    # Test embargo validation
    minimal_input_record["embargo_date"] = "1000-01-01"
    with pytest.raises(ValidationError):
        data = MetadataSchemaV1().load(minimal_input_record)