def test_adhoc_success_after_scheduled_failure(self, _): """ Query execution success resets the failure counter, even if it runs as an adhoc query. """ q = self.factory.create_query(query_text="SELECT 1, 2", schedule={"interval": 300}) with patch.object(PostgreSQL, "run_query") as qr: qr.side_effect = ValueError("broken") result = execute_query( "SELECT 1, 2", self.factory.data_source.id, {"query_id": q.id}, scheduled_query_id=q.id, user_id=self.factory.user.id, ) self.assertTrue(isinstance(result, QueryExecutionError)) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 1) with patch.object(PostgreSQL, "run_query") as qr: qr.return_value = ([1, 2], None) execute_query( "SELECT 1, 2", self.factory.data_source.id, {"query_id": q.id}, user_id=self.factory.user.id, ) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 0)
def test_success_after_failure(self): """ Query execution success resets the failure counter. """ cm = mock.patch( "celery.app.task.Context.delivery_info", {"routing_key": "test"} ) q = self.factory.create_query( query_text="SELECT 1, 2", schedule={"interval": 300} ) with cm, mock.patch.object(PostgreSQL, "run_query") as qr: qr.side_effect = ValueError("broken") with self.assertRaises(QueryExecutionError): execute_query( "SELECT 1, 2", self.factory.data_source.id, {}, scheduled_query_id=q.id, ) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 1) with cm, mock.patch.object(PostgreSQL, "run_query") as qr: qr.return_value = ([1, 2], None) execute_query( "SELECT 1, 2", self.factory.data_source.id, {}, scheduled_query_id=q.id ) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 0)
def test_failure_scheduled(self, _): """ Scheduled queries that fail have their failure recorded. """ q = self.factory.create_query(query_text="SELECT 1, 2", schedule={"interval": 300}) with patch.object(PostgreSQL, "run_query") as qr: qr.side_effect = ValueError("broken") result = execute_query( "SELECT 1, 2", self.factory.data_source.id, {"query_id": q.id}, scheduled_query_id=q.id, ) self.assertTrue(isinstance(result, QueryExecutionError)) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 1) result = execute_query( "SELECT 1, 2", self.factory.data_source.id, {"query_id": q.id}, scheduled_query_id=q.id, ) self.assertTrue(isinstance(result, QueryExecutionError)) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 2)
def test_failure_scheduled(self): """ Scheduled queries that fail have their failure recorded. """ cm = mock.patch( "celery.app.task.Context.delivery_info", {"routing_key": "test"} ) q = self.factory.create_query( query_text="SELECT 1, 2", schedule={"interval": 300} ) with cm, mock.patch.object(PostgreSQL, "run_query") as qr: qr.side_effect = ValueError("broken") with self.assertRaises(QueryExecutionError): execute_query( "SELECT 1, 2", self.factory.data_source.id, {}, scheduled_query_id=q.id, ) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 1) with self.assertRaises(QueryExecutionError): execute_query( "SELECT 1, 2", self.factory.data_source.id, {}, scheduled_query_id=q.id, ) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 2)
def test_success(self, _): """ ``execute_query`` invokes the query runner and stores a query result. """ with patch.object(PostgreSQL, "run_query") as qr: query_result_data = {"columns": [], "rows": []} qr.return_value = (json_dumps(query_result_data), None) result_id = execute_query("SELECT 1, 2", self.factory.data_source.id, {}) self.assertEqual(1, qr.call_count) result = models.QueryResult.query.get(result_id) self.assertEqual(result.data, query_result_data)
def test_success(self): """ ``execute_query`` invokes the query runner and stores a query result. """ cm = mock.patch("celery.app.task.Context.delivery_info", {'routing_key': 'test'}) with cm, mock.patch.object(PostgreSQL, "run_query") as qr: query_result_data = {"columns": [], "rows": []} qr.return_value = (json_dumps(query_result_data), None) result_id = execute_query("SELECT 1, 2", self.factory.data_source.id, {}) self.assertEqual(1, qr.call_count) result = models.QueryResult.query.get(result_id) self.assertEqual(result.data, query_result_data)
def test_doesnt_change_updated_at_timestamp(self): cm = mock.patch("celery.app.task.Context.delivery_info", {'routing_key': 'test'}) month_ago = utcnow() + datetime.timedelta(-30) q = self.factory.create_query(query_text="SELECT 1, 2", schedule={"interval": 300}, updated_at=month_ago) with cm, mock.patch.object(PostgreSQL, "run_query") as qr: qr.side_effect = ValueError("broken") with self.assertRaises(QueryExecutionError): execute_query("SELECT 1, 2", self.factory.data_source.id, {}, scheduled_query_id=q.id) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 1) self.assertEqual(q.updated_at, month_ago) with cm, mock.patch.object(PostgreSQL, "run_query") as qr: qr.return_value = ([1, 2], None) execute_query("SELECT 1, 2", self.factory.data_source.id, {}, scheduled_query_id=q.id) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 0) self.assertEqual(q.updated_at, month_ago)
def test_success_scheduled(self, _): """ Scheduled queries remember their latest results. """ q = self.factory.create_query(query_text="SELECT 1, 2", schedule={"interval": 300}) with patch.object(PostgreSQL, "run_query") as qr: qr.return_value = ([1, 2], None) result_id = execute_query("SELECT 1, 2", self.factory.data_source.id, {}, scheduled_query_id=q.id) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 0) result = models.QueryResult.query.get(result_id) self.assertEqual(q.latest_query_data, result)
def test_success_scheduled(self): """ Scheduled queries remember their latest results. """ cm = mock.patch("celery.app.task.Context.delivery_info", {'routing_key': 'test'}) q = self.factory.create_query(query_text="SELECT 1, 2", schedule={"interval": 300}) with cm, mock.patch.object(PostgreSQL, "run_query") as qr: qr.return_value = ([1, 2], None) result_id = execute_query( "SELECT 1, 2", self.factory.data_source.id, {}, scheduled_query_id=q.id) q = models.Query.get_by_id(q.id) self.assertEqual(q.schedule_failures, 0) result = models.QueryResult.query.get(result_id) self.assertEqual(q.latest_query_data, result)