from unittest import TestCase
from unittest.mock import patch
import os

from aws_lambda_builders.actions import ActionFailedError
from aws_lambda_builders.workflows.java.actions import JavaCopyDependenciesAction, JavaMoveDependenciesAction


class TestJavaCopyDependenciesAction(TestCase):
    @patch("aws_lambda_builders.workflows.java.utils.OSUtils")
    def setUp(self, MockOSUtils):
        self.os_utils = MockOSUtils.return_value
        self.os_utils.copy.side_effect = lambda src, dst: dst
        self.artifacts_dir = "artifacts_dir"
        self.dependencies_dir = "dependencies_dir"

    def test_copies_artifacts(self):
        self.os_utils.copytree.side_effect = lambda src, dst: None
        self.os_utils.copy.side_effect = lambda src, dst: None

        action = JavaCopyDependenciesAction(self.artifacts_dir, self.dependencies_dir, self.os_utils)
        action.execute()

        self.os_utils.copytree.assert_called_with(
            os.path.join(self.artifacts_dir, "lib"), os.path.join(self.dependencies_dir, "lib")
        )

    def test_error_in_artifact_copy_raises_action_error(self):
        self.os_utils.copytree.side_effect = Exception("scandir failed!")
        action = JavaCopyDependenciesAction(self.artifacts_dir, self.dependencies_dir, self.os_utils)
        with self.assertRaises(ActionFailedError) as raised:
            action.execute()
        self.assertEqual(raised.exception.args[0], "scandir failed!")


class TestJavaMoveDependenciesAction(TestCase):
    @patch("aws_lambda_builders.workflows.java.utils.OSUtils")
    def setUp(self, MockOSUtils):
        self.os_utils = MockOSUtils.return_value
        self.artifacts_dir = "artifacts_dir"
        self.dependencies_dir = "dependencies_dir"

    def test_copies_artifacts(self):
        self.os_utils.move.side_effect = lambda src, dst: None

        action = JavaMoveDependenciesAction(self.artifacts_dir, self.dependencies_dir, self.os_utils)
        action.execute()

        self.os_utils.move.assert_called_with(
            os.path.join(self.artifacts_dir, "lib"), os.path.join(self.dependencies_dir, "lib")
        )

    def test_error_in_artifact_copy_raises_action_error(self):
        self.os_utils.move.side_effect = Exception("scandir failed!")
        action = JavaMoveDependenciesAction(self.artifacts_dir, self.dependencies_dir, self.os_utils)
        with self.assertRaises(ActionFailedError) as raised:
            action.execute()
        self.assertEqual(raised.exception.args[0], "scandir failed!")