def test_dependent_attributes_structmap(schematron_fx, nspace): """Test attribute dependencies with another attribute. Some attributes become mandatory or disallowed, if another attribute is used. :schematron_fx: Schematron compile fixture :nspace: Namespace key of the attributes """ (mets, root) = parse_xml_file('mets_valid_complete.xml') elem_handler = find_element(root, 'structMap', 'mets') if nspace == 'fi': fix_version_17(root) # Both attributes set_attribute(elem_handler, 'PID', nspace, 'xxx') set_attribute(elem_handler, 'PIDTYPE', nspace, 'xxx') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0 # Just the second attribute del_attribute(elem_handler, 'PID', nspace) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1 # No attributes del_attribute(elem_handler, 'PIDTYPE', nspace) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0 # Just the first attribute set_attribute(elem_handler, 'PID', nspace, 'xxx') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1
def test_mdtype_items_rightsmd(schematron_fx): """Test that all valid metadata types and their versions work properly. :schematron_fx: Schematron compile fixture """ (mets, root) = parse_xml_file('mets_valid_complete.xml') elem_handler = find_element(root, 'rightsMD', 'mets') elem_handler = find_element(elem_handler, 'mdWrap', 'mets') set_attribute(elem_handler, 'MDTYPE', 'mets', 'PREMIS:RIGHTS') # Test that all MDTYPEVERSIONs work with all specifications for specversion in [ '1.5.0', '1.6.0', '1.7.0', '1.7.1', '1.7.2', '1.7.3', '1.7.4' ]: if specversion in ['1.7.0', '1.7.1', '1.7.3', '1.7.4']: fix_version_17(root) else: set_attribute(root, 'CATALOG', 'fikdk', specversion) set_attribute(root, 'SPECIFICATION', 'fikdk', specversion) for version in ['2.3', '2.2']: set_attribute(elem_handler, 'MDTYPEVERSION', 'mets', version) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0 # Test unknown version fix_version_17(root) set_attribute(elem_handler, 'MDTYPEVERSION', 'mets', 'xxx') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1
def test_mdtype_items_mdwrap(schematron_fx, context, mdtype, othermdtype, mdtypeversion): """Test that all valid metadata types and their versions work properly. :schematron_fx: Schematron compile fixture :context: METS section to be tested :mdtype: MDTYPE attribute value :othermdtype: OTHERMDTYPE attribute valur :mdtypeversion: MDTYPEVERSION attribute value """ (mets, root) = parse_xml_file('mets_valid_complete.xml') fix_version_17(root) elem_handler = find_element(root, context, 'mets') elem_handler = find_element(elem_handler, 'mdWrap', 'mets') set_attribute(elem_handler, 'MDTYPE', 'mets', mdtype) if othermdtype is not None: set_attribute(elem_handler, 'OTHERMDTYPE', 'mets', othermdtype) # Test that unknown OTHERMDTYPE gives error, if MDTYPE is not 'OTHER' set_attribute(elem_handler, 'MDTYPEVERSION', 'mets', mdtypeversion[0]) set_attribute(elem_handler, 'OTHERMDTYPE', 'mets', 'xxx') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) if mdtype == 'OTHER': assert svrl.count(SVRL_FAILED) == 0 else: assert svrl.count(SVRL_FAILED) == 1
def test_mdtype_items_digiprovmd(schematron_fx, mdtype, othermdtype, mdtypeversion): """Test that all valid metadata types and their versions work properly. :schematron_fx: Schematron compile fixture :mdtype: MDTYPE attribute value :othermdtype: OTHERMDTYPE attribute valur :mdtypeversion: MDTYPEVERSION attribute value """ (mets, root) = parse_xml_file('mets_valid_complete.xml') elem_handler = find_element(root, 'digiprovMD', 'mets') elem_handler = find_element(elem_handler, 'mdWrap', 'mets') set_attribute(elem_handler, 'MDTYPE', 'mets', mdtype) if othermdtype is not None: set_attribute(elem_handler, 'OTHERMDTYPE', 'mets', othermdtype) # Test that all MDTYPEVERSIONs work with all specifications for specversion in [ '1.5.0', '1.6.0', '1.7.0', '1.7.1', '1.7.2', '1.7.3', '1.7.4' ]: if specversion in ['1.7.0', '1.7.1', '1.7.2', '1.7.3', '1.7.4']: fix_version_17(root) else: set_attribute(root, 'CATALOG', 'fikdk', specversion) set_attribute(root, 'SPECIFICATION', 'fikdk', specversion) for version in mdtypeversion: set_attribute(elem_handler, 'MDTYPEVERSION', 'mets', version) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0 # Test unknown version fix_version_17(root) set_attribute(elem_handler, 'MDTYPEVERSION', 'mets', 'xxx') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1
def test_objid_unique(schematron_fx): """Check that error is given, if OBJID is not unique with METS IDs, except for CONTENTID that can be identical to OBJID. :schematron_fx: Schematron compile fixture """ (mets, root) = parse_xml_file('mets_valid_complete.xml') objid = get_attribute(root, 'OBJID', 'mets') contentid = get_attribute(root, 'CONTENTID', 'fikdk') set_attribute(root, 'CONTENTID', 'fikdk', objid) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0 set_attribute(root, 'CONTENTID', 'fikdk', contentid) elem_handler = find_element(root, 'dmdSec', 'mets') section_id = get_attribute(elem_handler, 'ID', 'mets') set_attribute(root, 'OBJID', 'mets', section_id) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1 set_attribute(root, 'OBJID', 'mets', objid) fix_version_17(root) set_attribute(root, 'CONTRACTID', 'fi', objid) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1
def test_value_items_root(schematron_fx, attribute, nspace, fixed): """Test that a value is required in a certain attributes. :schematron_fx: Schematron compile fixture :attribute: Attribute, where the value is required :nspace: Namespace key of the attribute :fixed: Boolean, if the required value is fixed """ (mets, root) = parse_xml_file('mets_valid_complete.xml') if nspace == 'fi': fix_version_17(root) # Use arbitrary value elem_handler = find_element(root, 'mets', 'mets') set_attribute(elem_handler, attribute, nspace, 'aaa') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) if fixed: assert svrl.count(SVRL_FAILED) == 1 else: assert svrl.count(SVRL_FAILED) == 0 # Use empty value set_attribute(elem_handler, attribute, nspace, '') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1
def test_valid_complete_sourcemd(schematron_fx): """Test valid METS, where all mandatory and optional METS elements and attributes have been used at least once. :schematron_fx: Schematron compile fixture """ (mets, root) = parse_xml_file('mets_valid_complete.xml') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0 # Use new specification fix_version_17(root) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0
def test_arbitrary_attributes_structmap(schematron_fx, context): """Test that arbitrary attributes are forbidden in METS anyAttribute sections. """ (mets, root) = parse_xml_file('mets_valid_complete.xml') elem_handler = find_element(root, context, 'mets') for spec in [None, '1.7.0']: if spec == '1.7.0': fix_version_17(root) for ns in ['fi', 'fikdk', 'dc']: set_attribute(elem_handler, 'xxx', ns, 'xxx') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1 del_attribute(elem_handler, 'xxx', ns)
def test_mandatory_agents(schematron_fx): """Test that mandatory agents work. """ (mets, root) = parse_xml_file('mets_valid_complete.xml') elem_handler = find_element(root, 'agent', 'mets') set_attribute(elem_handler, 'ROLE', 'mets', 'CREATOR') set_attribute(elem_handler, 'TYPE', 'mets', 'OTHER') set_attribute(elem_handler, 'OTHERTYPE', 'mets', 'SOFTWARE') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1 fix_version_17(root) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0
def test_contractid_format(catalog_fx): """Test that contractid allows only correctly formatted UUID """ (mets, root) = prepare_xml_for_tests() fix_version_17(root) (returncode, _, _) = catalog_fx(xmltree=mets) assert returncode == 0 set_attribute(root, 'CONTRACTID', 'fi', 'c5a193b3-bb63-4348-bd25-6c20bb72264b') (returncode, _, _) = catalog_fx(xmltree=mets) assert returncode == 3 set_attribute(root, 'CONTRACTID', 'fi', 'urn:uuid:xxx') (returncode, _, _) = catalog_fx(xmltree=mets) assert returncode == 3
def test_mandatory_items_root(schematron_fx, mandatory, nspace): """ :schematron_fx: Schematron compile fixture :mandatory: Mandatory attribute :nspace: Namespace key of the mandatory attribute """ (mets, root) = parse_xml_file('mets_valid_complete.xml') if nspace == 'fi': fix_version_17(root) elem_handler = find_element(root, 'mets', 'mets') # Remove mandatory attribute del_attribute(elem_handler, mandatory, nspace) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1
def test_new_mets_attributes_root(schematron_fx, specification, failed): """Test that CONTENTID, and CONTRACTID are disallowed in old catalog versions. :schematron_fx: Schematron compile fixture :specification: Specification to test :failed: Number of failures """ (mets, root) = parse_xml_file('mets_valid_complete.xml') if specification == '1.7.4': fix_version_17(root) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == failed else: set_attribute(root, 'CATALOG', 'fikdk', specification) set_attribute(root, 'SPECIFICATION', 'fikdk', specification) set_attribute(root, 'CONTRACTID', 'fikdk', specification) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == failed
def test_dependent_attributes_amdsec(schematron_fx, context, nspaces, attributes, error): """Test attribute dependencies with another attribute. Some attributes become mandatory or disallowed, if another attribute is used. :schematron_fx: Schematron compile fixture :context: Element where the attributes exist :nspaces: Namespace keys of the attributes (two) :attributes: Dependent attributes (two) :error: The error table [a, b, c, d] where the values are the number of expected errors. (a) both attributes missing, (b) first exists, (c) second exists, (d) both exist. """ (mets, root) = parse_xml_file('mets_valid_complete.xml') elem_handler = find_element(root, context, 'mets') if nspaces[0] == 'fi': fix_version_17(root) # Both attributes set_attribute(elem_handler, attributes[0], nspaces[0], 'xxx') set_attribute(elem_handler, attributes[1], nspaces[1], 'xxx') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == error[3] # Just the second attribute del_attribute(elem_handler, attributes[0], nspaces[0]) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == error[2] # No attributes del_attribute(elem_handler, attributes[1], nspaces[1]) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == error[0] # Just the first attribute set_attribute(elem_handler, attributes[0], nspaces[0], 'xxx') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == error[1]
def test_dependent_attributes_root(schematron_fx, nspaces, attributes, version): """Test attribute dependencies with another attribute. Some attributes become mandatory or disallowed, if another attribute is used. :schematron_fx: Schematron compile fixture :nspaces: Namespace keys of the attributes (two) :attributes: Dependent attributes (two) :version: Specification version """ (mets, root) = parse_xml_file('mets_valid_complete.xml') elem_handler = find_element(root, 'mets', 'mets') failed = 2 if nspaces[0] == 'fi': fix_version_17(root) failed = 1 # Both attributes set_attribute(elem_handler, attributes[0], nspaces[0], version) set_attribute(elem_handler, attributes[1], nspaces[1], version) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0 # Just the second attribute del_attribute(elem_handler, attributes[0], nspaces[0]) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0 # No attributes del_attribute(elem_handler, attributes[1], nspaces[1]) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == failed # Just the first attribute set_attribute(elem_handler, attributes[0], nspaces[0], version) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0
def test_catalog_mets_complete(catalog_fx): """Test valid METS, where all mandatory and optional METS elements and attributes have been used at least once. :catalog_fx: Schema catalog validation fixture """ (mets, root) = prepare_xml_for_tests() (returncode, _, _) = catalog_fx(xmltree=mets) assert returncode == 0 set_attribute(root, 'CATALOG', 'fikdk', '1.7.4') set_attribute(root, 'SPECIFICATION', 'fikdk', '1.7.4') (returncode, _, _) = catalog_fx(xmltree=mets) assert returncode == 3 # Use new specification fix_version_17(root) (returncode, _, _) = catalog_fx(xmltree=mets) assert returncode == 0 set_attribute(root, 'CATALOG', 'fi', '1.6.0') set_attribute(root, 'SPECIFICATION', 'fi', '1.6.0') (returncode, _, _) = catalog_fx(xmltree=mets) assert returncode == 3
def test_mdtype_namespace(schematron_fx, section, mdinfo): """Test that the check for comparing given metadata type and the actual metadata works. :schematron_fx: Schematron compile fixture :section: Context section to be tested :mdinfo: Working metadata info: [MDTYPE, OTHERMDTYPE, MDTYPEVERSION, root element in the metadata section, namespace of the root] """ xml = '''<mets:mets fi:CATALOG="1.6.0" xmlns:mets="%(mets)s" xmlns:premis="%(premis)s" xmlns:fi="%(fikdk)s" xmlns:dc="%(dc)s" xmlns:marc21="%(marc21)s" xmlns:ead="%(ead)s" xmlns:ead3="%(ead3)s" xmlns:lido="%(lido)s" xmlns:vra="%(vra)s" xmlns:mods="%(mods)s" xmlns:eac="%(eac)s" xmlns:ddilc32="%(ddilc32)s" xmlns:ddilc31="%(ddilc31)s" xmlns:ddicb25="%(ddicb25)s" xmlns:ddicb21="%(ddicb21)s" xmlns:mix="%(mix)s" xmlns:addml="%(addml)s" xmlns:audiomd="%(audiomd)s" xmlns:videomd="%(videomd)s"> <mets:dmdSec><mets:mdWrap MDTYPE='DC' MDTYPEVERSION='1.1'> <mets:xmlData> <dc:subject/></mets:xmlData></mets:mdWrap></mets:dmdSec> <mets:dmdSec><mets:mdWrap MDTYPE='DC' MDTYPEVERSION='1.1'> <mets:xmlData> <dc:subject/></mets:xmlData></mets:mdWrap></mets:dmdSec> <mets:amdSec> <mets:techMD> <mets:mdWrap MDTYPE='PREMIS:OBJECT' MDTYPEVERSION='2.3'> <mets:xmlData><premis:object/></mets:xmlData></mets:mdWrap> </mets:techMD> <mets:techMD> <mets:mdWrap MDTYPE='PREMIS:OBJECT' MDTYPEVERSION='2.3'> <mets:xmlData><premis:object/></mets:xmlData></mets:mdWrap> </mets:techMD> <mets:rightsMD> <mets:mdWrap MDTYPE="PREMIS:RIGHTS" MDTYPEVERSION='2.3'> <mets:xmlData><premis:rights/></mets:xmlData></mets:mdWrap> </mets:rightsMD> <mets:rightsMD> <mets:mdWrap MDTYPE="PREMIS:RIGHTS" MDTYPEVERSION='2.3'> <mets:xmlData><premis:rights/></mets:xmlData></mets:mdWrap> </mets:rightsMD> <mets:digiprovMD> <mets:mdWrap MDTYPE='PREMIS:EVENT' MDTYPEVERSION='2.3'> <mets:xmlData><premis:event/></mets:xmlData></mets:mdWrap> </mets:digiprovMD><mets:digiprovMD> <mets:mdWrap MDTYPE='PREMIS:EVENT' MDTYPEVERSION='2.3'> <mets:xmlData><premis:event/></mets:xmlData></mets:mdWrap> </mets:digiprovMD> </mets:amdSec></mets:mets>''' % NAMESPACES (mets, root) = parse_xml_string(xml) if mdinfo[1] == 'DATACITE': fix_version_17(root) # Test that the given combination works elem_section = find_element(root, section, 'mets') elem_wrap = find_element(elem_section, 'mdWrap', 'mets') set_attribute(elem_wrap, 'MDTYPE', 'mets', mdinfo[0]) if mdinfo[1] is not None: set_attribute(elem_wrap, 'OTHERMDTYPE', 'mets', mdinfo[1]) set_attribute(elem_wrap, 'MDTYPEVERSION', 'mets', mdinfo[2]) elem_handler = find_element(elem_wrap, 'xmlData', 'mets') elem_handler.clear() set_element(elem_handler, mdinfo[3], mdinfo[4]) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 0 # Wrong (empty) namespace elem_handler.clear() set_element(elem_handler, mdinfo[3], None) svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1 # Arbitrary MDTYPE (wrong) set_attribute(elem_wrap, 'MDTYPE', 'mets', 'xxx') if mdinfo[1] is not None: del_attribute(elem_wrap, 'OTHERMDTYPE', 'mets') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) set_attribute(elem_wrap, 'MDTYPE', 'mets', mdinfo[0]) if mdinfo[1] is not None: set_attribute(elem_wrap, 'OTHERMDTYPE', 'mets', mdinfo[1]) assert svrl.count(SVRL_FAILED) == 1 # Arbitrary MDTYPEVERSION (wrong) set_attribute(elem_wrap, 'MDTYPEVERSION', 'mets', 'xxx') svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) set_attribute(elem_wrap, 'MDTYPEVERSION', 'mets', mdinfo[2]) assert svrl.count(SVRL_FAILED) == 1 # Check that the metadata fails in other sections for othersection in ['dmdSec', 'techMD', 'rightsMD', 'digiprovMD']: if othersection != section: svrl = schematron_fx(schematronfile=SCHFILE, xmltree=mets) assert svrl.count(SVRL_FAILED) == 1