@@ -508,3 +508,102 @@ def test_std_metadata_values():
508
508
509
509
def test_raw_metadata ():
510
510
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