def test_get_report(self):
        """ Test get report merged from multiple files into one """
        # arrange
        vals = {
            (datetime(2018, 4, 5), datetime(2018, 4, 5, 23, 59, 59)): { 'module_1': { 'a': 1, 'c': 1 }, 'module_2': { 'x': 1, 'y': 2 } }, 
            (datetime(2018, 4, 4), datetime(2018, 4, 4, 23, 59, 59)): { 'module_1': { 'b': 2, 'c': 2 }, 'module_2': { 'x': 2 } }
        }

        def side_effect(*args):
            return vals[args]

        mock_report_builder = report_builder.ErrorReportBuilder('env', 'user', 'password')
        mock_report_builder.build_report = mock.MagicMock(side_effect=side_effect)

        qed1week = reporter.ErrorCompareReporter('env', datetime.today(), 'safeid_user', 'safeid_password', 'smtp_user', 'smtp_password')
        dates = [
            (datetime(2018, 4, 5), datetime(2018, 4, 5, 23, 59, 59)),
            (datetime(2018, 4, 4), datetime(2018, 4, 4, 23, 59, 59))
        ]
        
        # act
        report = qed1week._get_report(mock_report_builder, dates)

        # assert
        self.assertEqual(report, { 'module_1': { 'a': [1], 'b': [2], 'c': [1, 2] }, 'module_2': { 'x': [1, 2], 'y': [2] } })
    def test_build_report_report_exist(self, mock_open, mock_pickle, mock_os):
        # arrange
        builder = report_builder.ErrorReportBuilder('some_env', 'user', 'password')

        builder._get_history_data_path = mock.MagicMock(return_value='history_data')

        mock_os.path.join.return_value = 'path_exists'
        mock_os.path.isfile.return_value = True

        mock_pickle.load.return_value = { 'module': { 'key': 1 } }

        mock_open.return_value = True

        start_time = datetime(2018, 4, 8)
        end_time = datetime(2018, 4, 8, 23, 59, 59)

        # act
        report = builder.build_report(start_time, end_time)

        # assert
        self.assertEqual(report, { 'module': { 'key': 1 } })

        mock_os.path.join.assert_called_with('history_data', '2018_04_08_00_00__2018_04_08_23_59.pkl')
        mock_os.path.isfile.assert_called_with('path_exists')
        mock_open.assert_called_with('path_exists', 'rb')
        mock_pickle.load.assert_called_with(True)
    def test_process_html(self):
        # arrange
        builder = report_builder.ErrorReportBuilder('some_env', 'user', 'password')

        html_path = os.path.join(
            os.path.dirname(inspect.getfile(self.__class__)),
            'test_fixture',
            'sample_errorgui_page.html')

        with open(html_path, 'r') as f:
            content = f.read()

        html = pq(content)

        # act
        report = builder._process_html(html)

        # assert
        self.assertEqual(
            report, 
            {
                'Document': { 'document_error_key_1': 1, 'document_error_key_2': 2 },
                'Search': { 'search_error_key': 2 },
                'Website': { 'website_error_key_1': 3, 'website_error_key_2': 5 }
            }
        )
    def test_get_history_data_path_dir_not_exist(self, mock_os):
        # arrange
        builder = report_builder.ErrorReportBuilder('some_env', 'user', 'password')
        mock_os.path.join.return_value = 'history_data'
        mock_os.path.isdir.return_value = False
        mock_os.makedirs.return_value = True

        # act
        history_dir = builder._get_history_data_path()

        # assert
        expected_dir = 'history_data'
        self.assertEqual(history_dir, expected_dir)

        mock_os.path.isdir.assert_called_with(expected_dir)
        mock_os.makedirs.assert_called_with(expected_dir)
    def test_load_report(self):
        # arrange
        builder = report_builder.ErrorReportBuilder('some_env', 'user', 'password')

        builder.report_retriever.get_html = mock.MagicMock(return_value='<html></html>')
        builder._process_html = mock.MagicMock(return_value={ 'module': { 'key': 1 } })

        start_time = datetime(2018, 4, 8)
        end_time = datetime(2018, 4, 8, 23, 59, 59)

        # act
        report = builder._load_report(start_time, end_time)

        # assert
        self.assertEqual(report, { 'module': { 'key': 1 } })

        
        builder.report_retriever.get_html.assert_called_with(start_time, end_time)