diff --git a/packtools/sps/models/media.py b/packtools/sps/models/media.py new file mode 100644 index 000000000..29d7fd773 --- /dev/null +++ b/packtools/sps/models/media.py @@ -0,0 +1,41 @@ +from packtools.sps.utils.xml_utils import get_parent_context, put_parent_context + + +class Media: + def __init__(self, node): + self.node = node + + @property + def mimetype(self): + return self.node.get("mimetype") + + @property + def mime_subtype(self): + return self.node.get("mime-subtype") + + @property + def xlink_href(self): + return self.node.get("{http://www.w3.org/1999/xlink}href") + + @property + def data(self): + return { + "mimetype": self.mimetype, + "mime_subtype": self.mime_subtype, + "xlink_href": self.xlink_href, + } + + +class ArticleMedias: + def __init__(self, xml_tree): + self.xml_tree = xml_tree + + def data(self): + for node, lang, article_type, parent, parent_id in get_parent_context( + self.xml_tree + ): + for media_node in node.xpath(".//media"): + media_data = Media(media_node).data + yield put_parent_context( + media_data, lang, article_type, parent, parent_id + ) diff --git a/packtools/sps/validation/media.py b/packtools/sps/validation/media.py new file mode 100644 index 000000000..1109b1d66 --- /dev/null +++ b/packtools/sps/validation/media.py @@ -0,0 +1,46 @@ +from ..models.media import ArticleMedias +from ..validation.utils import format_response + + +class MediaValidation: + def __init__(self, xmltree): + self.xmltree = xmltree + self.medias = ArticleMedias(xmltree).data() + + def validate_media_existence(self, error_level="WARNING"): + for media in self.medias: + yield format_response( + title="validation of elements", + parent=media.get("parent"), + parent_id=media.get("parent_id"), + parent_article_type=media.get("parent_article_type"), + parent_lang=media.get("parent_lang"), + item="media", + sub_item=None, + validation_type="exist", + is_valid=True, + expected="media element", + obtained="media element", + advice=None, + data=media, + error_level="OK", + ) + else: + yield format_response( + title="validation of elements", + parent="article", + parent_id=None, + parent_article_type=self.xmltree.get("article-type"), + parent_lang=self.xmltree.get( + "{http://www.w3.org/XML/1998/namespace}lang" + ), + item="media", + sub_item=None, + validation_type="exist", + is_valid=False, + expected=" element", + obtained=None, + advice="Consider adding a element to include multimedia content related to the article.", + data=None, + error_level=error_level, + ) diff --git a/tests/sps/models/test_media.py b/tests/sps/models/test_media.py new file mode 100644 index 000000000..3017a9e5d --- /dev/null +++ b/tests/sps/models/test_media.py @@ -0,0 +1,90 @@ +import unittest +from lxml import etree + +from packtools.sps.models.media import Media, ArticleMedias + + +class MediaTest(unittest.TestCase): + def setUp(self): + xml_str = """ +
+ + + + + +
+ """ + self.xml_tree = etree.fromstring(xml_str) + self.media = Media(self.xml_tree.xpath(".//media")[0]) + + def test_mimetype(self): + self.assertEqual(self.media.mimetype, "video") + + def test_mime_subtype(self): + self.assertEqual(self.media.mime_subtype, "mp4") + + def test_xlink_href(self): + self.assertEqual(self.media.xlink_href, "media1.mp4") + + def test_data(self): + expected = { + "mimetype": "video", + "mime_subtype": "mp4", + "xlink_href": "media1.mp4", + } + obtained = self.media.data + self.assertDictEqual(expected, obtained) + + +class ArticleMediasTest(unittest.TestCase): + def setUp(self): + xml_str = """ +
+ + + + + + + + + + + + +
+ """ + self.xml_tree = etree.fromstring(xml_str) + + def test_data(self): + obtained = list(ArticleMedias(self.xml_tree).data()) + expected = [ + { + "mimetype": "video", + "mime_subtype": "mp4", + "xlink_href": "media1.mp4", + "parent": "article", + "parent_article_type": "research-article", + "parent_id": None, + "parent_lang": "pt", + }, + { + "mimetype": "audio", + "mime_subtype": "mp3", + "xlink_href": "media2.mp3", + "parent": "sub-article", + "parent_article_type": "translation", + "parent_id": None, + "parent_lang": "en", + }, + ] + for i, item in enumerate(expected): + with self.subTest(i): + self.assertDictEqual(item, obtained[i]) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/sps/validation/test_media.py b/tests/sps/validation/test_media.py new file mode 100644 index 000000000..c75b144b1 --- /dev/null +++ b/tests/sps/validation/test_media.py @@ -0,0 +1,121 @@ +import unittest +from lxml import etree + +from packtools.sps.validation.media import MediaValidation + + +class MediaValidationTest(unittest.TestCase): + def test_media_validation_no_elements(self): + self.maxDiff = None + xmltree = etree.fromstring( + '
' + "" + "

Some text content without media.

" + "" + "
" + ) + obtained = list(MediaValidation(xmltree).validate_media_existence()) + + expected = [ + { + "title": "validation of elements", + "parent": "article", + "parent_id": None, + "parent_article_type": "research-article", + "parent_lang": "pt", + "item": "media", + "sub_item": None, + "validation_type": "exist", + "response": "WARNING", + "expected_value": " element", + "got_value": None, + "message": "Got None, expected element", + "advice": "Consider adding a element to include multimedia content related to the article.", + "data": None, + } + ] + + for i, item in enumerate(expected): + with self.subTest(i): + self.assertDictEqual(item, obtained[i]) + + def test_media_validation_with_elements(self): + self.maxDiff = None + xmltree = etree.fromstring( + '
' + "" + '' + "" + "" + "" + '' + "" + '' + "" + "" + "" + "" + "
" + ) + obtained = list(MediaValidation(xmltree).validate_media_existence()) + + expected = [ + { + "title": "validation of elements", + "parent": "article", + "parent_id": None, + "parent_article_type": "research-article", + "parent_lang": "pt", + "item": "media", + "sub_item": None, + "validation_type": "exist", + "response": "OK", + "expected_value": "media element", + "got_value": "media element", + "message": "Got media element, expected media element", + "advice": None, + "data": { + "mimetype": "video", + "mime_subtype": "mp4", + "xlink_href": "media1.mp4", + "parent": "article", + "parent_id": None, + "parent_article_type": "research-article", + "parent_lang": "pt", + }, + }, + { + "title": "validation of elements", + "parent": "sub-article", + "parent_id": None, + "parent_article_type": "translation", + "parent_lang": "en", + "item": "media", + "sub_item": None, + "validation_type": "exist", + "response": "OK", + "expected_value": "media element", + "got_value": "media element", + "message": "Got media element, expected media element", + "advice": None, + "data": { + "mimetype": "audio", + "mime_subtype": "mp3", + "xlink_href": "media2.mp3", + "parent": "sub-article", + "parent_id": None, + "parent_article_type": "translation", + "parent_lang": "en", + }, + }, + ] + + for i, item in enumerate(expected): + with self.subTest(i): + self.assertDictEqual(item, obtained[i]) + + +if __name__ == "__main__": + unittest.main()