Skip to content

Commit

Permalink
Fix: adaptar a classe de validação de ISSN's ao padrão adotado (#523)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
Rossi-Luciano and robertatakenaka authored Jan 8, 2024
1 parent 89a088e commit 4a0a5dc
Show file tree
Hide file tree
Showing 3 changed files with 179 additions and 78 deletions.
4 changes: 4 additions & 0 deletions packtools/sps/validation/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ class ValidationRelatedArticleException(Exception):
...


class ValidationIssnsException(Exception):
...


class ValidationLicenseException(Exception):
...

Expand Down
116 changes: 86 additions & 30 deletions packtools/sps/validation/journal_meta.py
Original file line number Diff line number Diff line change
@@ -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
---------
<article xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" dtd-version="1.0" article-type="research-article" xml:lang="pt">
<front>
<journal-meta>
<issn pub-type="ppub">0034-8910</issn>
<issn pub-type="epub">1518-8787</issn>
</journal-meta>
</front>
</article>
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': '<issn pub-type="ppub">0034-8910</issn>',
'got_value': '<issn pub-type="ppub">0034-8910</issn>',
'message': 'Got <issn pub-type="ppub">0034-8910</issn> expected <issn pub-type="ppub">0034-8910</issn>',
'advice': None
},
{
'title': 'Journal ISSN element validation',
'xpath': './/journal-meta//issn[@pub-type="epub"]',
'validation_type': 'value',
'response': 'OK',
'expected_value': '<issn pub-type="epub">1518-8787</issn>',
'got_value': '<issn pub-type="epub">1518-8787</issn>',
'message': 'Got <issn pub-type="epub">1518-8787</issn> expected <issn pub-type="epub">1518-8787</issn>',
'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': '<issn pub-type="{}">{}</issn>'.format(tp, issn_expected),
'got_value': '<issn pub-type="{}">{}</issn>'.format(tp, issn_obtained),
'message': 'Got <issn pub-type="{}">{}</issn> expected <issn pub-type="{}">{}</issn>'.format(
tp, issn_obtained, tp, issn_expected
),
'advice': None if is_valid else 'Provide an ISSN value as expected: <issn pub-type="{}">{}</issn>'.format(tp, issn_expected),
}


class AcronymValidation:
Expand Down Expand Up @@ -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',
Expand All @@ -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
137 changes: 89 additions & 48 deletions tests/sps/validation/test_journal_meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -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': '<issn pub-type="ppub">0103-5053</issn>',
'got_value': '<issn pub-type="ppub">0103-5053</issn>',
'message': 'Got <issn pub-type="ppub">0103-5053</issn> expected <issn pub-type="ppub">0103-5053</issn>',
'advice': None
},
{
'title': 'Journal ISSN element validation',
'xpath': './/journal-meta//issn[@pub-type="epub"]',
'validation_type': 'value',
'response': 'OK',
'expected_value': '<issn pub-type="epub">1678-4790</issn>',
'got_value': '<issn pub-type="epub">1678-4790</issn>',
'message': 'Got <issn pub-type="epub">1678-4790</issn> expected <issn pub-type="epub">1678-4790</issn>',
'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': '<issn pub-type="ppub">0103-5054</issn>',
'got_value': '<issn pub-type="ppub">0103-5053</issn>',
'message': 'Got <issn pub-type="ppub">0103-5053</issn> expected <issn pub-type="ppub">0103-5054</issn>',
'advice': 'Provide an ISSN value as expected: <issn pub-type="ppub">0103-5054</issn>'
},
{
'title': 'Journal ISSN element validation',
'xpath': './/journal-meta//issn[@pub-type="epub"]',
'validation_type': 'value',
'response': 'ERROR',
'expected_value': '<issn pub-type="epub">1678-4791</issn>',
'got_value': '<issn pub-type="epub">1678-4790</issn>',
'message': 'Got <issn pub-type="epub">1678-4790</issn> expected <issn pub-type="epub">1678-4791</issn>',
'advice': 'Provide an ISSN value as expected: <issn pub-type="epub">1678-4791</issn>'
}
]
for i, item in enumerate(obtained):
with self.subTest(i):
self.assertDictEqual(expected[i], item)


class AcronymTest(TestCase):
Expand Down Expand Up @@ -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': '<issn pub-type="ppub">0103-5053</issn>',
'got_value': '<issn pub-type="ppub">0103-5053</issn>',
'message': 'Got <issn pub-type="ppub">0103-5053</issn> expected <issn pub-type="ppub">0103-5053</issn>',
'advice': None
},
{
'title': 'Journal ISSN element validation',
'xpath': './/journal-meta//issn[@pub-type="epub"]',
'validation_type': 'value',
'response': 'OK',
'expected_value': '<issn pub-type="epub">1678-4790</issn>',
'got_value': '<issn pub-type="epub">1678-4790</issn>',
'message': 'Got <issn pub-type="epub">1678-4790</issn> expected <issn pub-type="epub">1678-4790</issn>',
'advice': None
},
dict(
object='journal acronym',
output_expected='hcsm',
Expand All @@ -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',
Expand Down

0 comments on commit 4a0a5dc

Please sign in to comment.