def test_query_task_update_insert_fail_general(self, mock_create_engine,
                                                   mock_refresh):
        with mock.patch.dict(create_query.os.environ,
                             {"Database_Location": "sweden"}):
            with open('tests/fixtures/test_data.txt') as infile:
                test_data = json.load(infile)

            with mock.patch("create_query.Session.add") as mock_insert:
                with mock.patch("create_query.Session.query") as mock_return:
                    mock_return.return_value.all.return_value = pd.DataFrame(
                        {0: [1]})
                    mock_therest = mock.Mock()

                    #  So many 'mock_therest's are needed
                    #  due to the nature of the test data used.
                    mock_insert.side_effect = [
                        mock_therest, mock_therest, mock_therest, mock_therest,
                        mock_therest, mock_therest, mock_therest, mock_therest,
                        Exception("Bad Me")
                    ]

                    x = create_query.lambda_handler(test_data, '')

            assert (x["statusCode"] == 500)
            assert ("Failed To Insert Data: query_task_update"
                    in x['body']['Error'])
            assert ("General Error" in str(x['body']['Error']))
    def test_input_data_exception(self):
        with open('tests/fixtures/test_data.txt') as infile:
            test_data = json.load(infile)
            with mock.patch.dict(create_query.os.environ,
                                 {"Database_Location": "sweden"}):
                test_data.pop('query_type')
                x = create_query.lambda_handler("MIKE", '')

        assert (x["statusCode"] == 400)
        assert ("Invalid" in str(x['body']['Error']))
    def test_db_connection_exception_general(self, mock_create_engine):
        with open('tests/fixtures/test_data.txt') as infile:
            test_data = json.load(infile)
            with mock.patch.dict(create_query.os.environ,
                                 {"Database_Location": "sweden"}):

                mock_create_engine.side_effect = Exception("Bad Me")

                x = create_query.lambda_handler(test_data, '')
        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 open('tests/fixtures/test_data.txt') as infile:
            test_data = json.load(infile)
            with mock.patch.dict(create_query.os.environ,
                                 {"Database_Location": "MyPostgresDatase"}):
                mock_create_engine.side_effect =\
                    db.exc.NoSuchModuleError('', '', '')
                x = create_query.lambda_handler(test_data, '')

        assert (x["statusCode"] == 500)
        assert ("Failed To Connect" in x['body']['Error'])
        assert ("Driver Error" in str(x['body']['Error']))
    def test_query_table_insert_fail_general(self, mock_create_engine,
                                             mock_insert, mock_refresh):
        with mock.patch.dict(create_query.os.environ,
                             {"Database_Location": "sweden"}):
            with open('tests/fixtures/test_data.txt') as infile:
                test_data = json.load(infile)
            mock_insert.side_effect = Exception("Bad Me")

            x = create_query.lambda_handler(test_data, '')

            assert (x["statusCode"] == 500)
            assert ("Failed To Insert Data: query" in x['body']['Error'])
            assert ("General Error" in str(x['body']['Error']))
    def test_lambda_handler_happy_path(self, mock_create_engine, mock_insert,
                                       mock_refresh):
        with mock.patch.dict(create_query.os.environ,
                             {"Database_Location": "sweden"}):
            with open('tests/fixtures/test_data.txt') as infile:
                test_data = json.load(infile)
            with mock.patch("create_query.Session.query") as mock_return:
                mock_return.return_value.all.return_value = pd.DataFrame(
                    {0: [1]})

                x = create_query.lambda_handler(test_data, '')

            assert (x["statusCode"] == 201)
            assert ("Successfully" in x['body']['Success'])
    def test_commit_fail_general(self, mock_create_engine, mock_insert):
        with mock.patch.dict(create_query.os.environ,
                             {"Database_Location": "sweden"}):
            with open('tests/fixtures/test_data.txt') as infile:
                test_data = json.load(infile)
            with mock.patch("create_query.Session") as mock_sesh:
                mock_session = AlchemyMagicMock()
                mock_sesh.return_value = mock_session
                mock_session.commit.side_effect = Exception("Bad Me")
                mock_insert.return_value.values.return_value\
                    .returning.return_value\
                    .on_conflict_do_nothing.return_value = "bob"
                x = create_query.lambda_handler(test_data, '')

                assert (x["statusCode"] == 500)
                assert ("Failed To Commit" in x['body']['Error'])
                assert ("General Error" in str(x['body']['Error']))
    def test_close_fail(self, mock_create_engine, mock_insert):
        with mock.patch.dict(create_query.os.environ,
                             {"Database_Location": "sweden"}):
            with open('tests/fixtures/test_data.txt') as infile:
                test_data = json.load(infile)
            with mock.patch("create_query.Session") as mock_sesh:
                mock_session = AlchemyMagicMock()
                mock_sesh.return_value = mock_session
                mock_session.close.side_effect =\
                    db.exc.OperationalError("", "", "")
                mock_insert.return_value.values.return_value\
                    .returning.return_value\
                    .on_conflict_do_nothing.return_value = "bob"

                x = create_query.lambda_handler(test_data, '')

                assert (x["statusCode"] == 500)
                assert ("Database Session Closed Badly" in x['body']['Error'])
                assert ("Operational Error" in str(x['body']['Error']))
    def test_failed_vet_insert_fail(self, mock_create_engine, mock_refresh):
        with mock.patch.dict(create_query.os.environ,
                             {"Database_Location": "sweden"}):
            with open('tests/fixtures/test_data.txt') as infile:
                test_data = json.load(infile)
            with mock.patch("create_query.Session.add") as mock_insert:
                with mock.patch("create_query.Session.query") as mock_return:
                    mock_return.return_value.all.return_value = pd.DataFrame(
                        {0: [1]})
                    mock_therest = mock.Mock()
                    mock_insert.side_effect = [
                        mock_therest, mock_therest, mock_therest,
                        db.exc.OperationalError("", "", "")
                    ]
                    x = create_query.lambda_handler(test_data, '')

            assert (x["statusCode"] == 500)
            assert ("Failed To Insert Data: failed_vet" in x['body']['Error'])
            assert ("Operational Error" in str(x['body']['Error']))
    def test_environment_variable_exception(self):
        x = create_query.lambda_handler("MIKE", '')

        assert (x["statusCode"] == 500)
        assert ("Configuration Error:" in x['body']['Error'])