@@ -508,3 +508,102 @@ def test_std_metadata_values():
508508
509509def test_raw_metadata ():
510510 assert metadata .Metadata (name = "Name" , value = b"hello" )
511+
512+
513+ def test_decorators ():
514+ @metadata .allow_empty
515+ class MyMetadata (metadata .XCustomTextMetadata ): ...
516+
517+ assert MyMetadata ("Test" , "value" ).libzim_value == b"value"
518+
519+ @metadata .allow_duplicates
520+ class MyMetadata2 (metadata .TextListBasedMetadata ):
521+ join_list_with = "|"
522+
523+ assert (
524+ MyMetadata2 (name = "Test" , value = ["value" , "hello" , "value" ]).libzim_value
525+ == b"value|hello|value"
526+ )
527+
528+ raw_value = "\t \n \r \n \t A val \t \a with \b control chars\v \n "
529+
530+ class MyMetadata3 (metadata .TextBasedMetadata ):
531+ require_text_cleanup = False
532+
533+ assert MyMetadata3 (name = "Test" , value = raw_value ).libzim_value == raw_value .encode (
534+ "UTF-8"
535+ )
536+
537+ @metadata .allow_duplicates
538+ class MyMetadata4 (metadata .TextListBasedMetadata ):
539+ require_textlist_cleanup = False
540+ join_list_with = "|"
541+
542+ assert MyMetadata4 (
543+ name = "Test" , value = (raw_value , raw_value )
544+ ).libzim_value == "|" .join ([raw_value , raw_value ]).encode ("UTF-8" )
545+
546+
547+ def test_custom_ones ():
548+ textval = "value"
549+ value = textval .encode ("UTF-8" )
550+ assert metadata .CustomMetadata ("Test" , value ).libzim_value == value
551+ assert metadata .XCustomMetadata ("Name" , value ).libzim_value == value
552+ assert metadata .XCustomMetadata ("Name" , value ).name == "X-Name"
553+ assert metadata .CustomTextMetadata ("Test" , textval ).libzim_value == value
554+ assert metadata .XCustomTextMetadata ("Name" , textval ).libzim_value == value
555+ assert metadata .XCustomTextMetadata ("Name" , textval ).name == "X-Name"
556+ with pytest .raises (ValueError , match = "must be X- prefixed" ):
557+ metadata .CustomMetadata ("Name" , value )
558+ with pytest .raises (ValueError , match = "must be X- prefixed" ):
559+ metadata .CustomTextMetadata ("Name" , textval )
560+
561+
562+ def test_mandatory_zim_metadata_keys ():
563+ # as per the spec on 2024-12-13
564+ assert len (metadata .MANDATORY_ZIM_METADATA_KEYS ) >= 8
565+ assert "Illustration_48x48@1" in metadata .MANDATORY_ZIM_METADATA_KEYS
566+
567+
568+ def test_default_dev_zim_metadata ():
569+ assert isinstance (metadata .DEFAULT_DEV_ZIM_METADATA , metadata .StandardMetadataList )
570+ # as per the spec on 2024-12-13
571+ assert len (metadata .DEFAULT_DEV_ZIM_METADATA .values ()) == 8
572+
573+
574+ def test_get_binary_from (png_image ):
575+ with open (png_image , "rb" ) as fh :
576+ png_data = fh .read ()
577+ # bytes input
578+ assert metadata .Metadata (value = png_data , name = "Test" ).libzim_value == png_data
579+ # io.BytesIO input
580+ assert (
581+ metadata .Metadata (value = io .BytesIO (png_data ), name = "Test" ).libzim_value
582+ == png_data
583+ )
584+ # BaseIO input
585+ with open (png_image , "rb" ) as fh :
586+ assert metadata .Metadata (value = fh , name = "Test" ).libzim_value == png_data
587+
588+ # unseekbale BaseIO
589+ def notseekable ():
590+ return False
591+
592+ with open (png_image , "rb" ) as fh :
593+ fh .seekable = notseekable
594+ assert metadata .Metadata (value = fh , name = "Test" ).libzim_value == png_data
595+
596+
597+ def test_ensure_missingname_raises ():
598+ with pytest .raises (OSError , match = "name missing" ):
599+ metadata .Metadata (b"yello" )
600+
601+
602+ def test_mimetype_usage ():
603+ mimetype = "video/webm"
604+ assert metadata .Metadata (b"hello" , "Test" , mimetype = mimetype ).mimetype == mimetype
605+ assert metadata .Metadata (b"hello" , "Test" ).mimetype == "text/plain;charset=UTF-8"
606+ assert (
607+ metadata .DEFAULT_DEV_ZIM_METADATA .Illustration_48x48_at_1 .mimetype
608+ == "image/png"
609+ )
0 commit comments