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)]) @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' {a}({b})' + \ f'foo bar baz ' 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' {a}***{b}***' + \ f'foo bar baz ' 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])]) def test_get_str_from_td(self): expected_output = 'foo bar' test_td = BeautifulSoup(f' {expected_output} ', scrape.HTML_PARSER).td output = scrape.get_str_from_td(test_td) self.assertEqual(expected_output, output) expected_output = '' test_td = BeautifulSoup('', scrape.HTML_PARSER).td output = scrape.get_str_from_td(test_td) self.assertEqual(expected_output, output) def test_trs_from_page(self): # Tested function takes URL as argument (GET request is issued) # HTML to be parsed could be substituted # pass