From 4a0a5dc570e42955633526e428bb472aa7870605 Mon Sep 17 00:00:00 2001 From: Luciano <41302084+Rossi-Luciano@users.noreply.github.com> Date: Mon, 8 Jan 2024 09:24:33 -0300 Subject: [PATCH] =?UTF-8?q?Fix:=20adaptar=20a=20classe=20de=20valida=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20ISSN's=20ao=20padr=C3=A3o=20adotado=20(#523)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refatora classe de validação para ISSN's * Adapta os testes às modificações * Adiciona classe de exceção * Corrige 'docstring' * Altera a instanciação de 'self.journal_issns' * Torna 'issns_dict' obrigatório * Atualiza 'docstring' * Altera procedimento de validação * Adapta testes às alterações na validação --------- Co-authored-by: Roberta Takenaka <505143+robertatakenaka@users.noreply.github.com> --- packtools/sps/validation/exceptions.py | 4 + packtools/sps/validation/journal_meta.py | 116 +++++++++++++----- tests/sps/validation/test_journal_meta.py | 137 ++++++++++++++-------- 3 files changed, 179 insertions(+), 78 deletions(-) diff --git a/packtools/sps/validation/exceptions.py b/packtools/sps/validation/exceptions.py index 9f9035bc5..d46feb69e 100644 --- a/packtools/sps/validation/exceptions.py +++ b/packtools/sps/validation/exceptions.py @@ -43,6 +43,10 @@ class ValidationRelatedArticleException(Exception): ... +class ValidationIssnsException(Exception): + ... + + class ValidationLicenseException(Exception): ... diff --git a/packtools/sps/validation/journal_meta.py b/packtools/sps/validation/journal_meta.py index 666630a39..8758ea80f 100644 --- a/packtools/sps/validation/journal_meta.py +++ b/packtools/sps/validation/journal_meta.py @@ -1,29 +1,81 @@ from ..models.journal_meta import ISSN, Acronym, Title, Publisher +from packtools.sps.validation.exceptions import ValidationIssnsException class ISSNValidation: - def __init__(self, xmltree): + def __init__(self, xmltree, issns_dict=None): self.xmltree = xmltree self.journal_issns = ISSN(xmltree) - - def validate_epub(self, expected_value): - resp_epub = dict( - object='issn epub', - output_expected=expected_value, - output_obteined=self.journal_issns.epub, - match=(expected_value == self.journal_issns.epub) - - ) - return resp_epub - - def validate_ppub(self, expected_value): - resp_ppub = dict( - object='issn ppub', - output_expected=expected_value, - output_obteined=self.journal_issns.ppub, - match=(expected_value == self.journal_issns.ppub) - ) - return resp_ppub + self.issns_dict = issns_dict + + def validate_issn(self, issns_dict): + """ + Checks whether the ISSN value is as expected. + + XML input + --------- +
+ + + 0034-8910 + 1518-8787 + + +
+ + Params + ------ + issns_dict : dict, such as: + { + 'ppub': '0034-8910', + 'epub': '1518-8787' + } + + Returns + ------- + list of dictionaries, such as: + [ + { + 'title': 'Journal ISSN element validation', + 'xpath': './/journal-meta//issn[@pub-type="ppub"]', + 'validation_type': 'value', + 'response': 'OK', + 'expected_value': '0034-8910', + 'got_value': '0034-8910', + 'message': 'Got 0034-8910 expected 0034-8910', + 'advice': None + }, + { + 'title': 'Journal ISSN element validation', + 'xpath': './/journal-meta//issn[@pub-type="epub"]', + 'validation_type': 'value', + 'response': 'OK', + 'expected_value': '1518-8787', + 'got_value': '1518-8787', + 'message': 'Got 1518-8787 expected 1518-8787', + 'advice': None + } + ] + """ + issns_dict = issns_dict or self.issns_dict + if not issns_dict or type(issns_dict) is not dict: + raise ValidationIssnsException("The function requires a list of ISSNs in dictionary format") + + for tp, issn_expected in issns_dict.items(): + issn_obtained = self.journal_issns.epub if tp == "epub" else self.journal_issns.ppub + is_valid = issn_expected == issn_obtained + yield { + 'title': 'Journal ISSN element validation', + 'xpath': './/journal-meta//issn[@pub-type="{}"]'.format(tp), + 'validation_type': 'value', + 'response': 'OK' if is_valid else 'ERROR', + 'expected_value': '{}'.format(tp, issn_expected), + 'got_value': '{}'.format(tp, issn_obtained), + 'message': 'Got {} expected {}'.format( + tp, issn_obtained, tp, issn_expected + ), + 'advice': None if is_valid else 'Provide an ISSN value as expected: {}'.format(tp, issn_expected), + } class AcronymValidation: @@ -88,8 +140,10 @@ def validate(self, expected_values): ''' expected_values is a dict like: { - 'issn_epub': '0103-5053', - 'issn_ppub': '1678-4790', + 'issns': { + 'ppub': '0103-5053', + 'epub': '1678-4790' + }, 'acronym': 'hcsm', 'journal-title': 'História, Ciências, Saúde-Manguinhos', 'abbrev-journal-title': 'Hist. cienc. saude-Manguinhos', @@ -102,12 +156,14 @@ def validate(self, expected_values): title = TitleValidation(self.xmltree) publisher = PublisherValidation(self.xmltree) - resp_journal_meta = [ - issn.validate_epub(expected_values['issn_epub']), - issn.validate_ppub(expected_values['issn_ppub']), - acronym.validate_text(expected_values['acronym']), - title.validate_journal_title(expected_values['journal-title']), - title.validate_abbreviated_journal_title(expected_values['abbrev-journal-title']), - publisher.validate_publishers_names(expected_values['publisher-name']) - ] + resp_journal_meta = list(issn.validate_issn(expected_values['issns'])) + + resp_journal_meta.extend( + [ + acronym.validate_text(expected_values['acronym']), + title.validate_journal_title(expected_values['journal-title']), + title.validate_abbreviated_journal_title(expected_values['abbrev-journal-title']), + publisher.validate_publishers_names(expected_values['publisher-name']) + ] + ) return resp_journal_meta diff --git a/tests/sps/validation/test_journal_meta.py b/tests/sps/validation/test_journal_meta.py index 4581f1bd8..44f42189d 100644 --- a/tests/sps/validation/test_journal_meta.py +++ b/tests/sps/validation/test_journal_meta.py @@ -21,45 +21,75 @@ def setUp(self): ) self.issns = ISSNValidation(self.xmltree) - def test_issn_epub_match(self): - expected = dict( - object='issn epub', - output_expected='1678-4790', - output_obteined='1678-4790', - match=True + def test_validate_issn_ok(self): + self.maxDiff = None + obtained = self.issns.validate_issn( + { + 'ppub': '0103-5053', + 'epub': '1678-4790' + } ) - obtained = self.issns.validate_epub('1678-4790') - self.assertDictEqual(expected, obtained) - def test_issn_epub_no_match(self): - expected = dict( - object='issn epub', - output_expected='1678-4791', - output_obteined='1678-4790', - match=False - ) - obtained = self.issns.validate_epub('1678-4791') - self.assertDictEqual(expected, obtained) + expected = [ + { + 'title': 'Journal ISSN element validation', + 'xpath': './/journal-meta//issn[@pub-type="ppub"]', + 'validation_type': 'value', + 'response': 'OK', + 'expected_value': '0103-5053', + 'got_value': '0103-5053', + 'message': 'Got 0103-5053 expected 0103-5053', + 'advice': None + }, + { + 'title': 'Journal ISSN element validation', + 'xpath': './/journal-meta//issn[@pub-type="epub"]', + 'validation_type': 'value', + 'response': 'OK', + 'expected_value': '1678-4790', + 'got_value': '1678-4790', + 'message': 'Got 1678-4790 expected 1678-4790', + 'advice': None + } + ] + for i, item in enumerate(obtained): + with self.subTest(i): + self.assertDictEqual(expected[i], item) - def test_issn_ppub_match(self): - expected = dict( - object='issn ppub', - output_expected='0103-5053', - output_obteined='0103-5053', - match=True + def test_validate_issn_not_ok(self): + self.maxDiff = None + obtained = self.issns.validate_issn( + { + 'ppub': '0103-5054', + 'epub': '1678-4791' + } ) - obtained = self.issns.validate_ppub('0103-5053') - self.assertDictEqual(expected, obtained) - def test_issn_ppub_no_match(self): - expected = dict( - object='issn ppub', - output_expected='0103-5051', - output_obteined='0103-5053', - match=False - ) - obtained = self.issns.validate_ppub('0103-5051') - self.assertDictEqual(expected, obtained) + expected = [ + { + 'title': 'Journal ISSN element validation', + 'xpath': './/journal-meta//issn[@pub-type="ppub"]', + 'validation_type': 'value', + 'response': 'ERROR', + 'expected_value': '0103-5054', + 'got_value': '0103-5053', + 'message': 'Got 0103-5053 expected 0103-5054', + 'advice': 'Provide an ISSN value as expected: 0103-5054' + }, + { + 'title': 'Journal ISSN element validation', + 'xpath': './/journal-meta//issn[@pub-type="epub"]', + 'validation_type': 'value', + 'response': 'ERROR', + 'expected_value': '1678-4791', + 'got_value': '1678-4790', + 'message': 'Got 1678-4790 expected 1678-4791', + 'advice': 'Provide an ISSN value as expected: 1678-4791' + } + ] + for i, item in enumerate(obtained): + with self.subTest(i): + self.assertDictEqual(expected[i], item) class AcronymTest(TestCase): @@ -285,19 +315,28 @@ def setUp(self): self.journal_meta = JournalMetaValidation(self.xmltree) def test_journal_meta_match(self): + self.maxDiff = None expected = [ - dict( - object='issn epub', - output_expected='1678-4790', - output_obteined='1678-4790', - match=True - ), - dict( - object='issn ppub', - output_expected='0103-5053', - output_obteined='0103-5053', - match=True - ), + { + 'title': 'Journal ISSN element validation', + 'xpath': './/journal-meta//issn[@pub-type="ppub"]', + 'validation_type': 'value', + 'response': 'OK', + 'expected_value': '0103-5053', + 'got_value': '0103-5053', + 'message': 'Got 0103-5053 expected 0103-5053', + 'advice': None + }, + { + 'title': 'Journal ISSN element validation', + 'xpath': './/journal-meta//issn[@pub-type="epub"]', + 'validation_type': 'value', + 'response': 'OK', + 'expected_value': '1678-4790', + 'got_value': '1678-4790', + 'message': 'Got 1678-4790 expected 1678-4790', + 'advice': None + }, dict( object='journal acronym', output_expected='hcsm', @@ -324,8 +363,10 @@ def test_journal_meta_match(self): ) ] obtained = self.journal_meta.validate({ - 'issn_epub': '1678-4790', - 'issn_ppub': '0103-5053', + 'issns': { + 'ppub': '0103-5053', + 'epub': '1678-4790' + }, 'acronym': 'hcsm', 'journal-title': 'História, Ciências, Saúde-Manguinhos', 'abbrev-journal-title': 'Hist. cienc. saude-Manguinhos',