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