def test_input_exception(self):
        with mock.patch.dict(get_query_dashboard.os.environ,
                             {"Database_Location": "MyPostgresDatase"}):
            x = get_query_dashboard.lambda_handler('', '')

        assert (x["statusCode"] == 400)
        assert ("Invalid" in str(x['body']['Error']))
    def test_lambda_handler_output_error(self, mock_create_engine,
                                         mock_select):

        with mock.patch.dict(get_query_dashboard.os.environ,
                             {"Database_Location": "MyPostgresDatase"}):
            with mock.patch("get_query_dashboard.alchemy_functions")\
                    as mock_alchemy_functions:
                mock_alchemy_functions.to_df.side_effect = [
                    pd.DataFrame({
                        "query_reference": [0],
                        "ru_reference": ["1"],
                        "survey_period": ["2"],
                        "survey_code": ["3"]
                    }),
                    pd.DataFrame({}),
                    pd.DataFrame({}),
                    pd.DataFrame({}),
                    pd.DataFrame({}),
                    pd.DataFrame({})
                ]

                x = get_query_dashboard.lambda_handler({"query_reference": 0},
                                                       '')
                assert (x["statusCode"] == 500)
                assert ("Missing" in str(x['body']))
    def test_db_connection_exception_general(self, mock_create_engine):

        with mock.patch.dict(get_query_dashboard.os.environ,
                             {"Database_Location": "MyPostgresDatase"}):
            mock_create_engine.side_effect = Exception("Bad Me")
            x = get_query_dashboard.lambda_handler({"query_reference": 0}, '')

        assert (x["statusCode"] == 500)
        assert ("Failed To Connect" in str(x['body']['Error']))
        assert ("General Error" in str(x['body']['Error']))
    def test_db_connection_exception_driver(self, mock_create_engine):

        with mock.patch.dict(get_query_dashboard.os.environ,
                             {"Database_Location": "MyPostgresDatase"}):
            mock_create_engine.side_effect =\
                sqlalchemy.exc.NoSuchModuleError('', '', '')
            x = get_query_dashboard.lambda_handler({"query_reference": 0}, '')

        assert (x["statusCode"] == 500)
        assert ("Failed To Connect" in x['body']['Error'])
        assert ("Driver Error" in str(x['body']['Error']))
    def test_lambda_handler_query_fail_general(self, mock_create_engine,
                                               mock_select,
                                               mock_alchemy_functions):
        with mock.patch.dict(get_query_dashboard.os.environ,
                             {"Database_Location": "MyPostgresDatase"}):
            mock_select.side_effect = Exception("Bad Me")
            x = get_query_dashboard.lambda_handler({"query_reference": 0}, '')

            assert (x["statusCode"] == 500)
            assert ("Failed To Retrieve Data:" in x['body']['Error'])
            assert ("General Error" in str(x['body']['Error']))
    def test_lambda_handler_connection_close_general(self, mock_create_engine,
                                                     mock_select,
                                                     mock_alchemy_functions):

        with mock.patch.dict(get_query_dashboard.os.environ,
                             {"Database_Location": "MyPostgresDatase"}):

            with mock.patch("get_query_dashboard.Session") as mock_sesh:
                mock_session = AlchemyMagicMock()
                mock_sesh.return_value = mock_session
                mock_session.close.side_effect = Exception("Bad Me")
                x = get_query_dashboard.lambda_handler({"query_reference": 0},
                                                       '')

                assert (x["statusCode"] == 500)
                assert ("Database Session Closed Badly" in x['body']['Error'])
                assert ("General Error" in str(x['body']['Error']))
    def test_lambda_handler_select_fail_general(self, mock_create_engine,
                                                mock_select):

        with mock.patch.dict(get_query_dashboard.os.environ,
                             {"Database_Location": "MyPostgresDatase"}):
            with mock.patch("get_query_dashboard.alchemy_functions")\
                    as mock_alchemy_functions:
                mock_alchemy_functions.return_value\
                    .table_model.return_value = 'I Am A Table'
                mock_alchemy_functions.to_df.side_effect = [
                    pd.DataFrame({
                        "query_reference": [123456],
                        "ru_reference": ["xxxxx"],
                        "survey_code": ["xxxx"],
                        "survey_period": ["xxxxx"],
                        "current_period": ["xxxxx"],
                        "date_raised": ["2007-05-04"],
                        "industry_group": ["xxxx"],
                        "last_query_update": ["1999-12-16"],
                        "query_active": [True],
                        "query_description": ["xxxxx"],
                        "query_status": ["xxxxxx"],
                        "raised_by": ["xxxxxx"],
                        "results_state": ["xxxx"],
                        "query_type": ["Data Cleaning"],
                        "query_type_description": ["xxxxxxxxxxx"],
                        "general_specific_flag": [False],
                        "target_resolution_date": ["2000-09-11"]
                    }),
                    Exception("Bad Me")
                ]
                x = get_query_dashboard.lambda_handler({"query_reference": 0},
                                                       '')

            assert (x["statusCode"] == 500)
            assert ("Failed To Retrieve Data: step" in x['body']['Error'])
            assert ("General Error" in x['body']['Error'])
    def test_environment_variable_exception(self):
        x = get_query_dashboard.lambda_handler('', '')

        assert (x["statusCode"] == 500)
        assert ("Configuration Error:" in x['body']['Error'])
    def test_lambda_handler_happy_path(self, mock_create_engine, mock_select):

        with mock.patch.dict(get_query_dashboard.os.environ,
                             {"Database_Location": "MyPostgresDatase"}):
            with mock.patch("get_query_dashboard.alchemy_functions")\
                    as mock_alchemy_functions:
                mock_alchemy_functions.return_value\
                    .table_model.return_value = 'I Am A Table'
                mock_alchemy_functions.to_df.side_effect = [
                    pd.DataFrame({
                        "query_reference": [123456],
                        "ru_reference": ["xxxxx"],
                        "survey_code": ["xxxx"],
                        "survey_period": ["xxxxx"],
                        "current_period": ["xxxxx"],
                        "date_raised": ["2007-05-04"],
                        "industry_group": ["xxxx"],
                        "last_query_update": ["1999-12-16"],
                        "query_active": [True],
                        "query_description": ["xxxxx"],
                        "query_status": ["xxxxxx"],
                        "raised_by": ["xxxxxx"],
                        "results_state": ["xxxx"],
                        "query_type": ["Data Cleaning"],
                        "query_type_description": ["xxxxxxxxxxx"],
                        "general_specific_flag": [False],
                        "target_resolution_date": ["2000-09-11"]
                    }),
                    pd.DataFrame({
                        "run_id": [1],
                        "step": ["VETs"],
                        "error_code": ["xxxxx"],
                        "error_description": ["xxxxxxx"],
                        "query_reference": [123456],
                        "survey_code": ["xxxx"],
                        "survey_period": ["xxxx"],
                        "ru_reference": ["xxxx"]
                    }),
                    pd.DataFrame({
                        "question_number": ["1"],
                        "anomaly_description": ["xxxxx"],
                        "step": ["VETs"],
                        "run_id": [1],
                        "survey_code": ["xxxx"],
                        "survey_period": ["xxxx"],
                        "ru_reference": ["xxxx"]
                    }),
                    pd.DataFrame({
                        "failed_vet": [1],
                        "vet_description": ["xxxx"],
                        "step": ["VETs"],
                        "question_number": ["1"],
                        "run_id": [1],
                        "survey_code": ["xxxx"],
                        "survey_period": ["xxxx"],
                        "ru_reference": ["xxxx"]
                    }),
                    pd.DataFrame({
                        "query_reference": [123456],
                        "task_sequence_number": [1],
                        "next_planned_action": ["xxxxx"],
                        "response_required_by": ["2007-11-28"],
                        "task_description": ["xxxx"],
                        "task_responsibility": ["xxxx"],
                        "task_status": ["xxxxx"],
                        "when_action_required": ["2006-01-18"]
                    }),
                    pd.DataFrame({
                        "query_reference": [123456],
                        "task_sequence_number": [1],
                        "last_updated": ["2002-06-11"],
                        "task_update_description": ["xxxx"],
                        "updated_by": ["xxxx"]
                    })
                ]

                x = get_query_dashboard.lambda_handler({"query_reference": 0},
                                                       '')

                assert (x["statusCode"] == 200)
                assert ("Queries" in x['body'])