diff --git a/src/SymptomsCausedByVaccines/OptionsSetter.py b/src/SymptomsCausedByVaccines/OptionsSetter.py new file mode 100644 index 00000000000..68f170cc30d --- /dev/null +++ b/src/SymptomsCausedByVaccines/OptionsSetter.py @@ -0,0 +1,21 @@ +from bs4 import BeautifulSoup + + +class OptionsSetter: + + def setOptions(self, html, options): + soup = self._setBatchcodeOptions(self._parse(html), self._parseOptions(options)) + return str(soup) + + def _setBatchcodeOptions(self, soup, options): + batchcodeSelect = soup.find(id = "vaccineSelect") + batchcodeSelect.clear() + for option in options: + batchcodeSelect.append(option) + return soup + + def _parseOptions(self, options): + return [self._parse(option).option for option in options] + + def _parse(self, html): + return BeautifulSoup(html, 'lxml') diff --git a/src/SymptomsCausedByVaccines/OptionsSetterTest.py b/src/SymptomsCausedByVaccines/OptionsSetterTest.py new file mode 100644 index 00000000000..123435c7f5f --- /dev/null +++ b/src/SymptomsCausedByVaccines/OptionsSetterTest.py @@ -0,0 +1,69 @@ +import unittest +from SymptomsCausedByVaccines.OptionsSetter import OptionsSetter + +class OptionsSetterTest(unittest.TestCase): + + def test_setOptions(self): + # Given + optionsSetter = OptionsSetter() + + # When + htmlActual = optionsSetter.setOptions( + html=''' + + +

Test

+ + + + ''', + options=[ + '', + '']) + + # Then + assertEqualHTML( + htmlActual, + ''' + + +

Test

+ + + + ''') + +# FK-TODO: DRY with BatchcodeOptionsSetterTest.assertEqualHTML() +# adapted from https://stackoverflow.com/questions/8006909/pretty-print-assertequal-for-html-strings +def assertEqualHTML(string1, string2, file1='', file2=''): + u''' + Compare two unicode strings containing HTML. + A human friendly diff goes to logging.error() if they + are not equal, and an exception gets raised. + ''' + from bs4 import BeautifulSoup as bs + import difflib + + def short(mystr): + max = 20 + if len(mystr) > max: + return mystr[:max] + return mystr + p = [] + for mystr, file in [(string1, file1), (string2, file2)]: + if not isinstance(mystr, str): + raise Exception(u'string ist not unicode: %r %s' % + (short(mystr), file)) + soup = bs(mystr, 'lxml') + pretty = soup.prettify() + p.append(pretty) + if p[0] != p[1]: + for line in difflib.unified_diff(p[0].splitlines(), p[1].splitlines(), fromfile=file1, tofile=file2): + print(line) + print(p[0], ' != ', p[1]) + raise Exception('Not equal %s %s' % (file1, file2))