2021-11-12 17:50:40 +01:00
|
|
|
from unittest import TestCase
|
|
|
|
from unittest.mock import patch, MagicMock, call
|
|
|
|
|
|
|
|
from bs4 import BeautifulSoup
|
|
|
|
|
|
|
|
from stocksymbolscraper import scrape
|
|
|
|
|
|
|
|
|
|
|
|
class ScrapeTestCase(TestCase):
|
|
|
|
|
|
|
|
@patch.object(scrape, 'get_single_tr_data')
|
|
|
|
def test_extract_row_data(self, mock_get_single_tr_data: MagicMock):
|
|
|
|
foo = 'foo'
|
|
|
|
mock_get_single_tr_data.return_value = foo
|
|
|
|
input1, input2, input3 = MagicMock(), MagicMock(), MagicMock()
|
|
|
|
# Although the function expects BS4 Tag objects as arguments, we substitute with Mocks here
|
|
|
|
# because those arguments are immediately passed into another function, which we mock out anyway.
|
|
|
|
output = scrape.extract_row_data(input1, input2, input3)
|
|
|
|
expected_output = [foo, foo, foo]
|
|
|
|
self.assertListEqual(expected_output, output)
|
|
|
|
mock_get_single_tr_data.assert_has_calls([call(input1), call(input2), call(input3)])
|
|
|
|
|
2021-11-13 18:57:13 +01:00
|
|
|
@patch.object(scrape, 'get_str_from_td')
|
|
|
|
def test_get_single_tr_data(self, mock_get_str_from_td: MagicMock):
|
|
|
|
a, b, x = 'a', 'b', 'x'
|
|
|
|
mock_get_str_from_td.return_value = x
|
|
|
|
test_html = f'<tr> <td><a>{a}<small>({b})</small></a></td>' + \
|
|
|
|
f'<td>foo</td> <td>bar</td> <td>baz</td> </tr>'
|
|
|
|
test_tr = BeautifulSoup(test_html, scrape.HTML_PARSER).tr
|
|
|
|
test_tds = test_tr.find_all('td')
|
|
|
|
output = scrape.get_single_tr_data(test_tr)
|
|
|
|
expected_output = (a, b, x, x, x)
|
|
|
|
self.assertTupleEqual(expected_output, output)
|
|
|
|
mock_get_str_from_td.assert_has_calls([call(test_tds[1]), call(test_tds[2]), call(test_tds[3])])
|
|
|
|
|
|
|
|
test_html = f'<tr> <td><a>{a}<small>***{b}***</small></a></td>' + \
|
|
|
|
f'<td>foo</td> <td>bar</td> <td>baz</td> </tr>'
|
|
|
|
test_tr = BeautifulSoup(test_html, scrape.HTML_PARSER).tr
|
|
|
|
test_tds = test_tr.find_all('td')
|
|
|
|
output = scrape.get_single_tr_data(test_tr)
|
|
|
|
expected_output = (a, f'***{b}***', x, x, x)
|
|
|
|
self.assertTupleEqual(expected_output, output)
|
|
|
|
mock_get_str_from_td.assert_has_calls([call(test_tds[1]), call(test_tds[2]), call(test_tds[3])])
|
|
|
|
|
2021-11-12 17:50:40 +01:00
|
|
|
def test_get_str_from_td(self):
|
|
|
|
expected_output = 'foo bar'
|
2021-11-13 18:57:13 +01:00
|
|
|
test_td = BeautifulSoup(f'<td> {expected_output} </td>', scrape.HTML_PARSER).td
|
2021-11-12 17:50:40 +01:00
|
|
|
output = scrape.get_str_from_td(test_td)
|
|
|
|
self.assertEqual(expected_output, output)
|
|
|
|
|
|
|
|
expected_output = ''
|
2021-11-13 18:57:13 +01:00
|
|
|
test_td = BeautifulSoup('<td></td>', scrape.HTML_PARSER).td
|
2021-11-12 17:50:40 +01:00
|
|
|
output = scrape.get_str_from_td(test_td)
|
|
|
|
self.assertEqual(expected_output, output)
|
2021-11-13 18:57:13 +01:00
|
|
|
|
|
|
|
def test_trs_from_page(self):
|
|
|
|
# Tested function takes URL as argument (GET request is issued)
|
|
|
|
# HTML to be parsed could be substituted
|
|
|
|
#
|
|
|
|
pass
|