def test_run_athena_task(self) -> None:
     mock_client = Mock()
     mock_client_factory = Mock(get_athena_client=Mock(return_value=mock_client))
     mock_task = Mock(
         spec=AwsAthenaTask, run=Mock(side_effect=lambda client: task_report() if client == mock_client else None)
     )
     self.assertEqual(task_report(), AwsTaskRunner(mock_client_factory)._run_task(mock_task))
    def test_run_tasks(self) -> None:
        succeeding_task_1 = athena_task(description="some task")
        succeeding_task_1._run_task = lambda _: {"outcome_1": "success_1"}

        succeeding_task_2 = athena_task(description="other task")
        succeeding_task_2._run_task = lambda _: {"outcome_2": "success_2"}

        failing_task = athena_task(account=account("5678", "wrong account"),
                                   description="boom")
        failing_task._run_task = lambda _: _raise(AwsScannerException("oops"))

        tasks = [succeeding_task_1, failing_task, succeeding_task_2]

        with self.assertLogs("AwsParallelTaskRunner",
                             level="ERROR") as error_log:
            reports = AwsParallelTaskRunner(Mock()).run(tasks)

        self.assertEqual(2, len(reports),
                         "there should only be two task reports")
        self.assertIn(
            task_report(description="some task",
                        results={"outcome_1": "success_1"},
                        partition=None), reports)
        self.assertIn(
            task_report(description="other task",
                        results={"outcome_2": "success_2"},
                        partition=None), reports)

        self.assertEqual(
            [
                "ERROR:AwsParallelTaskRunner:task 'boom' for 'wrong account (5678)' failed with: 'oops'"
            ],
            error_log.output,
        )
    def test_run(self) -> None:
        tasks = [athena_task(description="task_34"), athena_task(description="task_23")]
        report = [task_report(description="task_34"), task_report(description="task_23")]

        task_runner = AwsTaskRunner(Mock())
        mock_run_tasks = Mock(return_value=report)
        with patch.object(task_runner, "_run_tasks", mock_run_tasks):
            self.assertEqual(report, task_runner.run(tasks))

        mock_run_tasks.assert_called_once_with(tasks)
 def _assert_task_run(self, task_type, task_args, query, query_results,
                      results):
     for task_index, query_result in enumerate(query_results):
         athena = Mock(run_query=Mock(return_value=query_result))
         task = self.__build_task_under_test(task_type=task_type,
                                             task_args=task_args)
         self.assertEqual(
             task_report(description=task._description,
                         results=results[task_index]), task.run(athena))
         athena.run_query.assert_called_once_with(database="some_db",
                                                  query=query)
Exemple #5
0
class TestAwsAthenaCleanerTask(AwsScannerTestCase):
    database_mappings = {
        "db_1": ["table_1", "table_2", "table_3"],
        "some_prefix_db_2": ["table_1", "table_2"],
        "db_3": ["table_1"],
        "some_prefix_db_4": ["table_1", "table_2", "table_3"],
        "some_prefix_db_5": [],
    }
    expected_report = task_report(
        account=account("555666777888", "cloudtrail"),
        description="clean scanner leftovers",
        partition=None,
        results={
            "dropped_tables": [
                "some_prefix_db_2.table_1",
                "some_prefix_db_2.table_2",
                "some_prefix_db_4.table_1",
                "some_prefix_db_4.table_2",
                "some_prefix_db_4.table_3",
            ],
            "dropped_databases":
            ["some_prefix_db_2", "some_prefix_db_4", "some_prefix_db_5"],
        },
    )

    def test_clean_task_databases(self) -> None:
        mock_athena = Mock(
            list_databases=Mock(
                return_value=list(self.database_mappings.keys())),
            list_tables=Mock(
                side_effect=lambda db: self.database_mappings.get(db)),
        )
        self.assertEqual(self.expected_report,
                         AwsAthenaCleanerTask().run(mock_athena))
        mock_athena.assert_has_calls([
            call.list_databases(),
            call.list_tables("some_prefix_db_2"),
            call.drop_table("some_prefix_db_2", "table_1"),
            call.drop_table("some_prefix_db_2", "table_2"),
            call.list_tables("some_prefix_db_4"),
            call.drop_table("some_prefix_db_4", "table_1"),
            call.drop_table("some_prefix_db_4", "table_2"),
            call.drop_table("some_prefix_db_4", "table_3"),
            call.list_tables("some_prefix_db_5"),
            call.drop_database("some_prefix_db_2"),
            call.drop_database("some_prefix_db_4"),
            call.drop_database("some_prefix_db_5"),
        ])
    def test_run(self) -> None:
        task_class = "src.tasks.aws_cloudtrail_task.AwsCloudTrailTask"
        results = {"key": "val"}
        mock_athena = Mock()
        mocks = Mock(setup=Mock(),
                     task=Mock(return_value=results),
                     teardown=Mock())

        with patch(f"{task_class}._setup", mocks.setup):
            with patch(f"{task_class}._run_task", mocks.task):
                with patch(f"{task_class}._teardown", mocks.teardown):
                    self.assertEqual(task_report(),
                                     cloudtrail_task().run(mock_athena))
        mocks.assert_has_calls([
            call.setup(mock_athena),
            call.task(mock_athena),
            call.teardown(mock_athena)
        ])
Exemple #7
0
 def test_run(self) -> None:
     with patch("src.tasks.aws_task.AwsTask._run_task",
                return_value={"key": "val"}):
         self.assertEqual(task_report(partition=None),
                          aws_task().run(Mock()))
 def test_run_s3_task(self) -> None:
     client = Mock()
     client_factory = Mock(get_s3_client=Mock(side_effect=lambda acc: client if acc == account() else None))
     task = s3_task()
     task.run = Mock(side_effect=lambda c: task_report() if c == client else None)  # type: ignore
     self.assertEqual(task_report(), AwsTaskRunner(client_factory)._run_task(task))
Exemple #9
0
 def test_serialize_complex_object_with_optional_properties(self) -> None:
     self.assertEqual(
         ('{"account": {"identifier": "account_id", "name": "account_name"}, "description": "task", '
          '"results": {"key": "val"}}'),
         to_json(task_report(partition=None)),
     )
Exemple #10
0
def build_test_report(description):
    return [task_report(description=description, results={"key": "val"})]