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=300) with cm, mock.patch.object(PostgreSQL, "run_query") as qr: qr.exception = ValueError("broken") execute_query("SELECT 1, 2", self.factory.data_source.id, {}, scheduled_query_id=q.id) self.assertEqual(q.schedule_failures, 1) 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. """ cm = mock.patch("celery.app.task.Context.delivery_info", {'routing_key': 'test'}) 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, {}) self.assertEqual(1, qr.call_count) result = models.QueryResult.query.get(result_id) self.assertEqual(result.data, '{1,2}')
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=300) with cm, mock.patch.object(PostgreSQL, "run_query") as qr: qr.exception = ValueError("broken") execute_query("SELECT 1, 2", self.factory.data_source.id, {}, scheduled_query_id=q.id) models.db.session.refresh(q) 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) models.db.session.refresh(q) 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_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=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)
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)