Beispiel #1
0
    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)
Beispiel #2
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)
Beispiel #3
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)
Beispiel #4
0
 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)
Beispiel #5
0
 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)
Beispiel #6
0
 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)
Beispiel #7
0
    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)
Beispiel #8
0
 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)
Beispiel #9
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={"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)