diff --git a/source/meta/kernel-4.7/metadata.xsd b/source/meta/kernel-4.7/metadata.xsd index 173e6a7..fd92bf9 100644 --- a/source/meta/kernel-4.7/metadata.xsd +++ b/source/meta/kernel-4.7/metadata.xsd @@ -15,7 +15,7 @@ 2021-03-08 v4.4: Addition of new property relatedItem, relationType value "isPublishedIn", subject subproperty "classificationCode", controlled list "numberType", additional 13 properties for controlled list "resourceType" 2024-01-22 v4.5: Addition of new subproperties for publisher: "publisherIdentifier", "publisherIdentifierScheme", and "schemeURI"; addition of new resourceTypeGeneral values "Instrument" and "StudyRegistration"; addition of new relationType values "Collects" and "IsCollectedBy". 2024-12-05 v4.6: Addition of new resourceTypeGeneral values "Award" and "Project"; addiition of new relatedIdentifierType values "CSTR" and "RRID"; addition of new contributorType "Translator"; addition of new relationTypes "HasTranslation" and "IsTranslationOf"; addition of new dateType "Coverage". - 2025-12-31 v4.7: Addition of new resourceTypeGeneral values "Poster" and "Presenation"; addition of new relationType value "Other"; addition of new sub-property "relationTypeInformation" for RelatedIdentifier and RelatedItem.--> + 2025-12-31 v4.7: Addition of new resourceTypeGeneral values "Poster" and "Presentation"; addition of new relationType value "Other"; addition of new sub-property "relationTypeInformation" for RelatedIdentifier and RelatedItem.--> diff --git a/source/meta/kernel-4/metadata.xsd b/source/meta/kernel-4/metadata.xsd index 173e6a7..fd92bf9 100644 --- a/source/meta/kernel-4/metadata.xsd +++ b/source/meta/kernel-4/metadata.xsd @@ -15,7 +15,7 @@ 2021-03-08 v4.4: Addition of new property relatedItem, relationType value "isPublishedIn", subject subproperty "classificationCode", controlled list "numberType", additional 13 properties for controlled list "resourceType" 2024-01-22 v4.5: Addition of new subproperties for publisher: "publisherIdentifier", "publisherIdentifierScheme", and "schemeURI"; addition of new resourceTypeGeneral values "Instrument" and "StudyRegistration"; addition of new relationType values "Collects" and "IsCollectedBy". 2024-12-05 v4.6: Addition of new resourceTypeGeneral values "Award" and "Project"; addiition of new relatedIdentifierType values "CSTR" and "RRID"; addition of new contributorType "Translator"; addition of new relationTypes "HasTranslation" and "IsTranslationOf"; addition of new dateType "Coverage". - 2025-12-31 v4.7: Addition of new resourceTypeGeneral values "Poster" and "Presenation"; addition of new relationType value "Other"; addition of new sub-property "relationTypeInformation" for RelatedIdentifier and RelatedItem.--> + 2025-12-31 v4.7: Addition of new resourceTypeGeneral values "Poster" and "Presentation"; addition of new relationType value "Other"; addition of new sub-property "relationTypeInformation" for RelatedIdentifier and RelatedItem.--> diff --git a/spec/kernel-4.7/doi_spec.rb b/spec/kernel-4.7/doi_spec.rb new file mode 100644 index 0000000..2a84a47 --- /dev/null +++ b/spec/kernel-4.7/doi_spec.rb @@ -0,0 +1,19 @@ +require 'spec_helper' + +describe "validate DOI" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-full-v4.xml")) { |c| c.strict }}} + + it '10.5555/123' do + doc.at("identifier").content = "10.5555/123" + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + + it '10.5555/a' do + doc.at("identifier").content = "10.5555/a" + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end +end diff --git a/spec/kernel-4.7/example-ancientdates_spec.rb b/spec/kernel-4.7/example-ancientdates_spec.rb new file mode 100644 index 0000000..914728e --- /dev/null +++ b/spec/kernel-4.7/example-ancientdates_spec.rb @@ -0,0 +1,39 @@ +require 'spec_helper' + +describe "ancientdates example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-ancientdates-v4.xml")) { |c| c.strict }}} + + it 'validates' do + expect(doc).to pass_validation(xsd) + end + + it 'has resourceTypeGeneral Dataset' do + resource_type = doc.at("resourceType") + expect(resource_type["resourceTypeGeneral"]).to eq("PhysicalObject") + expect(resource_type.text).to eq("Coin") + end + + it 'has dates' do + dates = doc.search("dates") + expect(dates.size).to eq(1) + date = dates.first + expect(date.text.strip).to eq("-0024/-0022") + end + + it 'has givenName, familyName, and affiliations' do + creators = doc.search("creator") + expect(creators.size).to eq(1) + creator = creators.first + expect(creator.elements.size).to eq(2) + + creator_name = creator.elements[0] + expect(creator_name.name).to eq("creatorName") + expect(creator_name.text).to eq("Augustus") + + given_name = creator.elements[1] + expect(given_name.name).to eq("nameIdentifier") + expect(given_name.text).to eq("0000000121227317") + end +end diff --git a/spec/kernel-4.7/example_affiliation_spec.rb b/spec/kernel-4.7/example_affiliation_spec.rb new file mode 100644 index 0000000..f440768 --- /dev/null +++ b/spec/kernel-4.7/example_affiliation_spec.rb @@ -0,0 +1,48 @@ +require 'spec_helper' + +describe "full example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-affiliation-v4.xml")) { |c| c.strict }}} + + it 'validates' do + expect(doc).to pass_validation(xsd) + end + + it 'has resourceTypeGeneral Software' do + resource_type = doc.at("resourceType") + expect(resource_type["resourceTypeGeneral"]).to eq("Software") + expect(resource_type.text).to eq("XML") + end + + it 'has givenName, familyName, nameIdentifier and affiliations' do + creators = doc.search("creator") + expect(creators.size).to eq(3) + creator = creators.first + expect(creator.elements.size).to eq(5) + + creator_name = creator.elements[0] + expect(creator_name.name).to eq("creatorName") + expect(creator_name.text).to eq("Miller, Elizabeth") + + given_name = creator.elements[1] + expect(given_name.name).to eq("givenName") + expect(given_name.text).to eq("Elizabeth") + + family_name = creator.elements[2] + expect(family_name.name).to eq("familyName") + expect(family_name.text).to eq("Miller") + + name_identifier = creator.elements[3] + expect(name_identifier.name).to eq("nameIdentifier") + expect(name_identifier["schemeURI"]).to eq("https://orcid.org/") + expect(name_identifier["nameIdentifierScheme"]).to eq("ORCID") + expect(name_identifier.text).to eq("0000-0001-5000-0007") + + affiliation = creator.elements[4] + expect(affiliation.name).to eq("affiliation") + expect(affiliation.text).to eq("DataCite") + expect(affiliation["affiliationIdentifier"]).to eq("https://ror.org/04wxnsj81") + expect(affiliation["affiliationIdentifierScheme"]).to eq("ROR") + end +end diff --git a/spec/kernel-4.7/example_box_date_collected_data_collector_spec.rb b/spec/kernel-4.7/example_box_date_collected_data_collector_spec.rb new file mode 100644 index 0000000..a483bfb --- /dev/null +++ b/spec/kernel-4.7/example_box_date_collected_data_collector_spec.rb @@ -0,0 +1,49 @@ +require 'spec_helper' + +describe "full example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-Box_dateCollected_DataCollector-v4.xml")) { |c| c.strict }}} + + it 'validates' do + expect(doc).to pass_validation(xsd) + end + + it 'has dateType Collected' do + dates = doc.search("date") + expect(dates.size).to eq(1) + date = dates.first + expect(date["dateType"]).to eq("Collected") + expect(date.text).to eq("1961-06-01/1962-10-12") + end + + it 'has contributor DataCollector' do + contributors = doc.search("contributor") + expect(contributors.size).to eq(1) + contributor = contributors.first + expect(contributor["contributorType"]).to eq("DataCollector") + contributor_name = contributor.first_element_child + expect(contributor_name.name).to eq("contributorName") + expect(contributor_name.text).to eq("Pomegranate, B.") + end + + it 'has geoLocationBox' do + geo_locations = doc.search("geoLocation") + expect(geo_locations.size).to eq(1) + geo_location = geo_locations.first + expect(geo_location.elements.size).to eq(2) + geo_location_place = geo_location.first_element_child + expect(geo_location_place.name).to eq("geoLocationPlace") + expect(geo_location_place.text).to eq("Ponhook Lake, Nova Scotia") + geo_location_box = geo_location.last_element_child + expect(geo_location_box.name).to eq("geoLocationBox") + expect(geo_location_box.elements[0].name).to eq("westBoundLongitude") + expect(geo_location_box.elements[0].text).to eq("-64.2") + expect(geo_location_box.elements[1].name).to eq("eastBoundLongitude") + expect(geo_location_box.elements[1].text).to eq("-63.8") + expect(geo_location_box.elements[2].name).to eq("southBoundLatitude") + expect(geo_location_box.elements[2].text).to eq("44.7167") + expect(geo_location_box.elements[3].name).to eq("northBoundLatitude") + expect(geo_location_box.elements[3].text).to eq("44.9667") + end +end diff --git a/spec/kernel-4.7/example_complicated_spec.rb b/spec/kernel-4.7/example_complicated_spec.rb new file mode 100644 index 0000000..39736f2 --- /dev/null +++ b/spec/kernel-4.7/example_complicated_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe "full example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-complicated-v4.xml")) { |c| c.strict }}} + + it 'validates' do + expect(doc).to pass_validation(xsd) + end +end diff --git a/spec/kernel-4.7/example_dataset_spec.rb b/spec/kernel-4.7/example_dataset_spec.rb new file mode 100644 index 0000000..7d59c53 --- /dev/null +++ b/spec/kernel-4.7/example_dataset_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe "full example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-dataset-v4.xml")) { |c| c.strict }}} + + it 'validates' do + expect(doc).to pass_validation(xsd) + end + + it 'has resourceTypeGeneral Dataset' do + resource_type = doc.at("resourceType") + expect(resource_type["resourceTypeGeneral"]).to eq("Dataset") + expect(resource_type.text).to eq("Environmental data") + end +end diff --git a/spec/kernel-4.7/example_dissertation_spec.rb b/spec/kernel-4.7/example_dissertation_spec.rb new file mode 100644 index 0000000..8f49d55 --- /dev/null +++ b/spec/kernel-4.7/example_dissertation_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe "full example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-dissertation-v4.xml")) { |c| c.strict }}} + + it 'validates' do + expect(doc).to pass_validation(xsd) + end + + it 'has resourceTypeGeneral Dissertation' do + resource_type = doc.at("resourceType") + expect(resource_type["resourceTypeGeneral"]).to eq("Dissertation") + expect(resource_type.text).to eq("") + end +end diff --git a/spec/kernel-4.7/example_full_spec.rb b/spec/kernel-4.7/example_full_spec.rb new file mode 100644 index 0000000..c824bcb --- /dev/null +++ b/spec/kernel-4.7/example_full_spec.rb @@ -0,0 +1,36 @@ +require 'spec_helper' + +describe "full example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-full-v4.xml")) { |c| c.strict }}} + + it 'validates' do + expect(doc).to pass_validation(xsd) + end + + it 'has givenName and familyName' do + creators = doc.search("/xmlns:resource/xmlns:creators/xmlns:creator") + expect(creators.size).to eq(2) + creator = creators.first + expect(creator.elements.size).to eq(5) + + creator_name = creator.elements[0] + expect(creator_name.name).to eq("creatorName") + expect(creator_name.text).to eq("ExampleFamilyName, ExampleGivenName") + + given_name = creator.elements[1] + expect(given_name.name).to eq("givenName") + expect(given_name.text).to eq("ExampleGivenName") + + family_name = creator.elements[2] + expect(family_name.name).to eq("familyName") + expect(family_name.text).to eq("ExampleFamilyName") + + name_identifier = creator.elements[3] + expect(name_identifier.name).to eq("nameIdentifier") + expect(name_identifier["schemeURI"]).to eq("https://orcid.org") + expect(name_identifier["nameIdentifierScheme"]).to eq("ORCID") + expect(name_identifier.text).to eq("https://orcid.org/0000-0001-5727-2427") + end +end diff --git a/spec/kernel-4.7/example_funding_reference_spec.rb b/spec/kernel-4.7/example_funding_reference_spec.rb new file mode 100644 index 0000000..0251751 --- /dev/null +++ b/spec/kernel-4.7/example_funding_reference_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe "full example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-fundingReference-v4.xml")) { |c| c.strict }}} + + it 'validates' do + expect(doc).to pass_validation(xsd) + end + + # it 'has funderReference' do + # doc.at("funderReferences").first = "" + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + + it 'empty fundingReference tag' do + element = doc.at("fundingReferences") + element.replace (<<-EOT) + + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("Missing child element(s). Expected is one of ( {http://datacite.org/schema/kernel-4}funderName, {http://datacite.org/schema/kernel-4}funderIdentifier, {http://datacite.org/schema/kernel-4}awardNumber, {http://datacite.org/schema/kernel-4}awardTitle )") + end + + it 'only funderName' do + element = doc.at("fundingReferences") + element.replace (<<-EOT) + + + European Commission + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + + it 'empty funderName' do + element = doc.at("fundingReferences") + element.replace (<<-EOT) + + + + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("Element '{http://datacite.org/schema/kernel-4}funderName': [facet 'minLength'] The value has a length of '0'; this underruns the allowed minimum length of '1'.") + end + + it 'funderIdentifier' do + element = doc.at("fundingReferences") + element.replace (<<-EOT) + + + European Commission + http://doi.org/10.13039/501100000780 + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + + it 'funderIdentifier without funderIdentifierType' do + element = doc.at("fundingReferences") + element.replace (<<-EOT) + + + European Commission + http://doi.org/10.13039/501100000780 + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("The attribute 'funderIdentifierType' is required but missing.") + end + + it 'funderIdentifier unknown funderIdentifierType' do + element = doc.at("fundingReferences") + element.replace (<<-EOT) + + + European Commission + http://doi.org/10.13039/501100000780 + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("The value 'ABC' is not an element of the set {'ISNI', 'GRID', 'ROR', 'Crossref Funder ID', 'Other'}.") + end + + it 'awardNumber' do + element = doc.at("fundingReferences") + element.replace (<<-EOT) + + + European Commission + 284382 + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end +end diff --git a/spec/kernel-4.7/geolocation_spec.rb b/spec/kernel-4.7/geolocation_spec.rb new file mode 100644 index 0000000..5d67d2e --- /dev/null +++ b/spec/kernel-4.7/geolocation_spec.rb @@ -0,0 +1,188 @@ +require 'spec_helper' + +describe "validate geoLocation" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-GeoLocation-v4.xml")) { |c| c.strict }}} + + it 'empty geoLocations tag' do + element = doc.at("geoLocations") + element.replace "" + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + + it 'geoLocationPoint' do + element = doc.at("geoLocations") + element.replace (<<-EOT) + + + + -52.000000 + 69.000000 + + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + + it 'multiple geoLocationPoint' do + element = doc.at("geoLocations") + element.replace (<<-EOT) + + + + -52.000000 + 69.000000 + + + -43.000000 + 78.000000 + + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + + it 'geoLocationPoint missing latitude' do + element = doc.at("geoLocations") + element.replace (<<-EOT) + + + + -52.000000 + + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("Element '{http://datacite.org/schema/kernel-4}geoLocationPoint': Missing child element(s). Expected is ( {http://datacite.org/schema/kernel-4}pointLatitude ).") + end + + it 'geoLocationPoint out of range' do + element = doc.at("geoLocations") + element.replace (<<-EOT) + + + + -52.000000 + 110.000000 + + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("Element '{http://datacite.org/schema/kernel-4}pointLatitude': [facet 'maxInclusive'] The value '110.000000' is greater than the maximum value allowed ('90').") + end + + it 'pointLatitude out of range' do + element = doc.at("geoLocations") + element.replace (<<-EOT) + + + + -52.000000 + Disko Bay + + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("Element '{http://datacite.org/schema/kernel-4}pointLatitude': 'Disko Bay' is not a valid value of the atomic type '{http://datacite.org/schema/kernel-4}latitudeType'.") + end + + it 'geoLocationPolygon' do + element = doc.at("geoLocations") + element.replace (<<-EOT) + + + + + -52 + 69 + + + -52 + 67 + + + -54 + 67 + + + -54 + 69 + + + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + + it 'geoLocationPolygon not enough points' do + element = doc.at("geoLocations") + element.replace (<<-EOT) + + + + + -52 + 69 + + + -52 + 67 + + + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("Element '{http://datacite.org/schema/kernel-4}geoLocationPolygon': Missing child element(s). Expected is ( {http://datacite.org/schema/kernel-4}polygonPoint ).") + end + + it 'geoLocationBox' do + element = doc.at("geoLocations") + element.replace (<<-EOT) + + + + -71.032 + -68.211 + 41.090 + 42.893 + + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + + it 'geoLocationBox missing points' do + element = doc.at("geoLocations") + element.replace (<<-EOT) + + + + -71.032 + 41.090 + + + + EOT + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("Element '{http://datacite.org/schema/kernel-4}geoLocationBox': Missing child element(s). Expected is one of ( {http://datacite.org/schema/kernel-4}eastBoundLongitude, {http://datacite.org/schema/kernel-4}northBoundLatitude ).") + end +end diff --git a/spec/kernel-4.7/other_spec.rb b/spec/kernel-4.7/other_spec.rb new file mode 100644 index 0000000..2fe3cb2 --- /dev/null +++ b/spec/kernel-4.7/other_spec.rb @@ -0,0 +1,291 @@ +require 'spec_helper' + +describe "validate other elements" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-full-v4.xml")) { |c| c.strict }}} + + describe "resourceType" do + it 'missing resourceType' do + element = doc.at("resourceType") + element.replace "" + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("Missing child element(s). Expected is ( {http://datacite.org/schema/kernel-4}resourceType ).") + end + + it 'missing resourceTypeGeneral' do + element = doc.at("resourceType") + element.replace "" + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("Element '{http://datacite.org/schema/kernel-4}resourceType': The attribute 'resourceTypeGeneral' is required but missing.") + end + + it 'missing resourceTypeGeneral with resourceType' do + element = doc.at("resourceType") + element.replace 'Dataset' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("Element '{http://datacite.org/schema/kernel-4}resourceType': The attribute 'resourceTypeGeneral' is required but missing.") + end + + it 'empty resourceTypeGeneral with resourceType' do + element = doc.at("resourceType") + element.replace 'Dataset' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.last).to include("26:0: ERROR: Element '{http://datacite.org/schema/kernel-4}resourceType', attribute 'resourceTypeGeneral': [facet 'enumeration'] The value '' is not an element of the set {'Audiovisual', 'Award', 'Book', 'BookChapter', 'Collection', 'ComputationalNotebook', 'ConferencePaper', 'ConferenceProceeding', 'DataPaper', 'Dataset', 'Dissertation', 'Event', 'Image', 'Instrument', 'InteractiveResource', 'Journal', 'JournalArticle', 'Model', 'OutputManagementPlan', 'PeerReview', 'PhysicalObject', 'Poster', 'Preprint', 'Presentation', 'Project', 'Report', 'Service', 'Software', 'Sound', 'Standard', 'StudyRegistration', 'Text', 'Workflow', 'Other'}.") + end + + it 'empty resourceType' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + + it 'unknown resourceTypeGeneral' do + element = doc.at("resourceType") + element.replace 'Dataset' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(1) + expect(errors.first).to include("26:0: ERROR: Element '{http://datacite.org/schema/kernel-4}resourceType', attribute 'resourceTypeGeneral': [facet 'enumeration'] The value 'Conference' is not an element of the set {'Audiovisual', 'Award', 'Book', 'BookChapter', 'Collection', 'ComputationalNotebook', 'ConferencePaper', 'ConferenceProceeding', 'DataPaper', 'Dataset', 'Dissertation', 'Event', 'Image', 'Instrument', 'InteractiveResource', 'Journal', 'JournalArticle', 'Model', 'OutputManagementPlan', 'PeerReview', 'PhysicalObject', 'Poster', 'Preprint', 'Presentation', 'Project', 'Report', 'Service', 'Software', 'Sound', 'Standard', 'StudyRegistration', 'Text', 'Workflow', 'Other'}.") + end + + it 'resourceTypeGeneral Book' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral BookChapter' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral ComputationalNotebook' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral ConferencePaper' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral ConferenceProceeding' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral Dissertation' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral Journal' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral JournalArticle' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral OutputManagementPlan' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral PeerReview' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral Preprint' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral Report' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral Standard' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral Instrument' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral StudyRegistration' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral Poster' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral Presentation' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + end + + describe "relatedItemType" do + it 'relatedItemType Instrument' do + related_item = doc.search("relatedItems/relatedItem").first + related_item["relatedItemType"] = "Instrument" + element = doc.at("relatedItems/relatedItem") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'relatedItemType StudyRegistration' do + related_item = doc.search("relatedItems/relatedItem").first + related_item["relatedItemType"] = "StudyRegistration" + element = doc.at("relatedItems/relatedItem") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'relatedItemType Poster' do + related_item = doc.search("relatedItems/relatedItem").first + related_item["relatedItemType"] = "Poster" + element = doc.at("relatedItems/relatedItem") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'relatedItemType Presentation' do + related_item = doc.search("relatedItems/relatedItem").first + related_item["relatedItemType"] = "Presentation" + element = doc.at("relatedItems/relatedItem") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + end + + describe "relatedIdentifier resourceTypeGeneral" do + it 'relatedIdentifier resourceTypeGeneral Instrument' do + related_item = doc.search("relatedIdentifiers/relatedIdentifier").first + related_item["resourceTypeGeneral"] = "Instrument" + element = doc.at("relatedIdentifiers/relatedIdentifier") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'relatedIdentifier resourceTypeGeneral StudyRegistration' do + related_item = doc.search("relatedIdentifiers/relatedIdentifier").first + related_item["resourceTypeGeneral"] = "StudyRegistration" + element = doc.at("relatedIdentifiers/relatedIdentifier") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'relatedIdentifier resourceTypeGeneral Poster' do + related_item = doc.search("relatedIdentifiers/relatedIdentifier").first + related_item["resourceTypeGeneral"] = "Poster" + element = doc.at("relatedIdentifiers/relatedIdentifier") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'relatedIdentifier resourceTypeGeneral Presentation' do + related_item = doc.search("relatedIdentifiers/relatedIdentifier").first + related_item["resourceTypeGeneral"] = "Presentation" + element = doc.at("relatedIdentifiers/relatedIdentifier") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + end + + describe 'relatedItem' do + it 'relatedItem with relationTypeInformation and relationType Other' do + related_item = doc.search("relatedItems/relatedItem").first + related_item['relationType'] = 'Other' + related_item['relationTypeInformation'] = 'is output of' + element = doc.at("relatedItems/relatedItem") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + end + + describe "description" do + it 'empty descriptions tag' do + element = doc.at("descriptions") + element.replace "" + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + end + + describe "publisher with attributes" do + it 'publisher with attributes' do + element = doc.at("publisher") + expect(element.name).to eq("publisher") + expect(element.text).to eq("Example Publisher") + expect(element["xml:lang"]).to eq("en") + expect(element["publisherIdentifier"]).to eq("https://ror.org/04z8jg394") + expect(element["publisherIdentifierScheme"]).to eq("ROR") + expect(element["schemeURI"]).to eq("https://ror.org/") + end + + it 'publisher without attributes' do + element = doc.at("publisher") + element.replace 'Example Publisher' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors).to be_empty + end + end +end diff --git a/spec/kernel-4.7/pure_example_spec.rb b/spec/kernel-4.7/pure_example_spec.rb new file mode 100644 index 0000000..7b34094 --- /dev/null +++ b/spec/kernel-4.7/pure_example_spec.rb @@ -0,0 +1,40 @@ +require 'spec_helper' + +describe "pure example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(RSPEC_ROOT) {Nokogiri::XML(File.read("fixtures/pure-example.xml")) { |c| c.strict }}} + + it 'validates' do + expect(doc).to pass_validation(xsd) + end + + it 'has resourceTypeGeneral Dataset' do + resource_type = doc.at("resourceType") + expect(resource_type["resourceTypeGeneral"]).to eq("Dataset") + expect(resource_type.text).to eq("Dataset") + end + + it 'has givenName, familyName, and affiliations' do + creators = doc.search("creator") + expect(creators.size).to eq(1) + creator = creators.first + expect(creator.elements.size).to eq(4) + + creator_name = creator.elements[0] + expect(creator_name.name).to eq("creatorName") + expect(creator_name.text).to eq("Barbosa, Miguel") + + given_name = creator.elements[1] + expect(given_name.name).to eq("givenName") + expect(given_name.text).to eq("Miguel") + + family_name = creator.elements[2] + expect(family_name.name).to eq("familyName") + expect(family_name.text).to eq("Barbosa") + + affiliation = creator.elements[3] + expect(affiliation.name).to eq("affiliation") + expect(affiliation.text).to eq("School of Biology") + end +end diff --git a/spec/kernel-4.7/schema_spec.rb b/spec/kernel-4.7/schema_spec.rb new file mode 100644 index 0000000..c3e1c56 --- /dev/null +++ b/spec/kernel-4.7/schema_spec.rb @@ -0,0 +1,10 @@ +require 'spec_helper' + +describe "full example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) { |c| c.strict }}} + + it 'is valid' do + expect(xsd.errors).to be_empty + end +end diff --git a/spec/kernel-4.7/user_example_spec.rb b/spec/kernel-4.7/user_example_spec.rb new file mode 100644 index 0000000..0a6fc11 --- /dev/null +++ b/spec/kernel-4.7/user_example_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe "full example" do + let(:doc) { Dir.chdir(RSPEC_ROOT) {Nokogiri::XML(File.read("fixtures/_10.23650.xml")) { |c| c.strict }}} + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + + it 'does not validate' do + expect(doc).to pass_validation(xsd) + end +end diff --git a/spec/kernel-4/example_poster_spec.rb b/spec/kernel-4/example_poster_spec.rb new file mode 100644 index 0000000..dcc81e6 --- /dev/null +++ b/spec/kernel-4/example_poster_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe "poster example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-poster-v4.xml")) { |c| c.strict }}} + + it 'validates' do + expect(doc).to pass_validation(xsd) + end + + it 'has resourceTypeGeneral Poster' do + resource_type = doc.at("resourceType") + expect(resource_type["resourceTypeGeneral"]).to eq("Poster") + expect(resource_type.text).to eq("Conference poster") + end + + it 'has relatedIdentifier with relationType Other and relationTypeInformation' do + related_identifier = doc.search("relatedIdentifiers/relatedIdentifier").first + expect(related_identifier['relationType']).to eq('Other') + expect(related_identifier['relationTypeInformation']).to eq('is output of') + end +end diff --git a/spec/kernel-4/example_presentation_spec.rb b/spec/kernel-4/example_presentation_spec.rb new file mode 100644 index 0000000..784cbb3 --- /dev/null +++ b/spec/kernel-4/example_presentation_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe "presentation example" do + let(:root) { File.join(File.dirname(__FILE__), '../../source/meta/kernel-4') } + let(:xsd) { Dir.chdir(root) { Nokogiri::XML::Schema(File.read("metadata.xsd")) }} + let(:doc) { Dir.chdir(root) { Nokogiri::XML(File.read("example/datacite-example-presentation-v4.xml")) { |c| c.strict }}} + + it 'validates' do + expect(doc).to pass_validation(xsd) + end + + it 'has resourceTypeGeneral Poster' do + resource_type = doc.at("resourceType") + expect(resource_type["resourceTypeGeneral"]).to eq("Presentation") + expect(resource_type.text).to eq("Conference presentation") + end + + it 'has relatedIdentifier with relationType Other and relationTypeInformation' do + related_identifier = doc.search("relatedIdentifiers/relatedIdentifier").first + expect(related_identifier['relationType']).to eq('Other') + expect(related_identifier['relationTypeInformation']).to eq('is output of') + end +end diff --git a/spec/kernel-4/other_spec.rb b/spec/kernel-4/other_spec.rb index 8868a84..2fe3cb2 100644 --- a/spec/kernel-4/other_spec.rb +++ b/spec/kernel-4/other_spec.rb @@ -35,7 +35,7 @@ element.replace 'Dataset' errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } expect(errors.length).to eq(1) - expect(errors.last).to include("26:0: ERROR: Element '{http://datacite.org/schema/kernel-4}resourceType', attribute 'resourceTypeGeneral': [facet 'enumeration'] The value '' is not an element of the set {'Audiovisual', 'Award', 'Book', 'BookChapter', 'Collection', 'ComputationalNotebook', 'ConferencePaper', 'ConferenceProceeding', 'DataPaper', 'Dataset', 'Dissertation', 'Event', 'Image', 'Instrument', 'InteractiveResource', 'Journal', 'JournalArticle', 'Model', 'OutputManagementPlan', 'PeerReview', 'PhysicalObject', 'Preprint', 'Project', 'Report', 'Service', 'Software', 'Sound', 'Standard', 'StudyRegistration', 'Text', 'Workflow', 'Other'}") + expect(errors.last).to include("26:0: ERROR: Element '{http://datacite.org/schema/kernel-4}resourceType', attribute 'resourceTypeGeneral': [facet 'enumeration'] The value '' is not an element of the set {'Audiovisual', 'Award', 'Book', 'BookChapter', 'Collection', 'ComputationalNotebook', 'ConferencePaper', 'ConferenceProceeding', 'DataPaper', 'Dataset', 'Dissertation', 'Event', 'Image', 'Instrument', 'InteractiveResource', 'Journal', 'JournalArticle', 'Model', 'OutputManagementPlan', 'PeerReview', 'PhysicalObject', 'Poster', 'Preprint', 'Presentation', 'Project', 'Report', 'Service', 'Software', 'Sound', 'Standard', 'StudyRegistration', 'Text', 'Workflow', 'Other'}.") end it 'empty resourceType' do @@ -50,7 +50,7 @@ element.replace 'Dataset' errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } expect(errors.length).to eq(1) - expect(errors.first).to include("26:0: ERROR: Element '{http://datacite.org/schema/kernel-4}resourceType', attribute 'resourceTypeGeneral': [facet 'enumeration'] The value 'Conference' is not an element of the set {'Audiovisual', 'Award', 'Book', 'BookChapter', 'Collection', 'ComputationalNotebook', 'ConferencePaper', 'ConferenceProceeding', 'DataPaper', 'Dataset', 'Dissertation', 'Event', 'Image', 'Instrument', 'InteractiveResource', 'Journal', 'JournalArticle', 'Model', 'OutputManagementPlan', 'PeerReview', 'PhysicalObject', 'Preprint', 'Project', 'Report', 'Service', 'Software', 'Sound', 'Standard', 'StudyRegistration', 'Text', 'Workflow', 'Other'}.") + expect(errors.first).to include("26:0: ERROR: Element '{http://datacite.org/schema/kernel-4}resourceType', attribute 'resourceTypeGeneral': [facet 'enumeration'] The value 'Conference' is not an element of the set {'Audiovisual', 'Award', 'Book', 'BookChapter', 'Collection', 'ComputationalNotebook', 'ConferencePaper', 'ConferenceProceeding', 'DataPaper', 'Dataset', 'Dissertation', 'Event', 'Image', 'Instrument', 'InteractiveResource', 'Journal', 'JournalArticle', 'Model', 'OutputManagementPlan', 'PeerReview', 'PhysicalObject', 'Poster', 'Preprint', 'Presentation', 'Project', 'Report', 'Service', 'Software', 'Sound', 'Standard', 'StudyRegistration', 'Text', 'Workflow', 'Other'}.") end it 'resourceTypeGeneral Book' do @@ -157,6 +157,20 @@ errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } expect(errors.length).to eq(0) end + + it 'resourceTypeGeneral Poster' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'resourceTypeGeneral Presentation' do + element = doc.at("resourceType") + element.replace '' + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end end describe "relatedItemType" do @@ -177,6 +191,24 @@ errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } expect(errors.length).to eq(0) end + + it 'relatedItemType Poster' do + related_item = doc.search("relatedItems/relatedItem").first + related_item["relatedItemType"] = "Poster" + element = doc.at("relatedItems/relatedItem") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'relatedItemType Presentation' do + related_item = doc.search("relatedItems/relatedItem").first + related_item["relatedItemType"] = "Presentation" + element = doc.at("relatedItems/relatedItem") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end end describe "relatedIdentifier resourceTypeGeneral" do @@ -197,6 +229,36 @@ errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } expect(errors.length).to eq(0) end + + it 'relatedIdentifier resourceTypeGeneral Poster' do + related_item = doc.search("relatedIdentifiers/relatedIdentifier").first + related_item["resourceTypeGeneral"] = "Poster" + element = doc.at("relatedIdentifiers/relatedIdentifier") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + + it 'relatedIdentifier resourceTypeGeneral Presentation' do + related_item = doc.search("relatedIdentifiers/relatedIdentifier").first + related_item["resourceTypeGeneral"] = "Presentation" + element = doc.at("relatedIdentifiers/relatedIdentifier") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end + end + + describe 'relatedItem' do + it 'relatedItem with relationTypeInformation and relationType Other' do + related_item = doc.search("relatedItems/relatedItem").first + related_item['relationType'] = 'Other' + related_item['relationTypeInformation'] = 'is output of' + element = doc.at("relatedItems/relatedItem") + element.replace related_item.to_s + errors = xsd.validate(Nokogiri::XML(doc.to_xml)).map { |error| error.to_s } + expect(errors.length).to eq(0) + end end describe "description" do