diff --git a/slack_cli_hooks/hooks/check_update.py b/slack_cli_hooks/hooks/check_update.py index 7b9fa08..b8aa89b 100644 --- a/slack_cli_hooks/hooks/check_update.py +++ b/slack_cli_hooks/hooks/check_update.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import json from http.client import HTTPResponse +import sys from types import ModuleType from typing import Any, Dict, List, Optional from urllib import request @@ -99,5 +100,5 @@ def build_output(dependencies: List[ModuleType] = DEPENDENCIES) -> Dict[str, Any if __name__ == "__main__": - PROTOCOL = build_protocol() + PROTOCOL = build_protocol(argv=sys.argv) PROTOCOL.respond(json.dumps(build_output())) diff --git a/slack_cli_hooks/hooks/doctor.py b/slack_cli_hooks/hooks/doctor.py index a64bcd6..c88e503 100644 --- a/slack_cli_hooks/hooks/doctor.py +++ b/slack_cli_hooks/hooks/doctor.py @@ -1,11 +1,9 @@ #!/usr/bin/env python import json import platform +import sys -from slack_cli_hooks.protocol import ( - Protocol, - build_protocol, -) +from slack_cli_hooks.protocol import Protocol, build_protocol PROTOCOL: Protocol @@ -28,5 +26,5 @@ } if __name__ == "__main__": - PROTOCOL = build_protocol() + PROTOCOL = build_protocol(argv=sys.argv) PROTOCOL.respond(json.dumps(doctor_payload)) diff --git a/slack_cli_hooks/hooks/get_hooks.py b/slack_cli_hooks/hooks/get_hooks.py index 2894fbd..5b28f61 100644 --- a/slack_cli_hooks/hooks/get_hooks.py +++ b/slack_cli_hooks/hooks/get_hooks.py @@ -1,12 +1,8 @@ #!/usr/bin/env python import json import sys -from slack_cli_hooks.protocol import ( - Protocol, - MessageBoundaryProtocol, - DefaultProtocol, - build_protocol, -) + +from slack_cli_hooks.protocol import DefaultProtocol, MessageBoundaryProtocol, Protocol, build_protocol PROTOCOL: Protocol @@ -30,5 +26,5 @@ } if __name__ == "__main__": - PROTOCOL = build_protocol() + PROTOCOL = build_protocol(argv=sys.argv) PROTOCOL.respond(json.dumps(hooks_payload)) diff --git a/slack_cli_hooks/hooks/get_manifest.py b/slack_cli_hooks/hooks/get_manifest.py index 79a5caa..160c2ed 100644 --- a/slack_cli_hooks/hooks/get_manifest.py +++ b/slack_cli_hooks/hooks/get_manifest.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import os import re +import sys from typing import List from slack_cli_hooks.error import CliError @@ -46,5 +47,5 @@ def get_manifest(working_directory: str) -> str: if __name__ == "__main__": - PROTOCOL = build_protocol() + PROTOCOL = build_protocol(argv=sys.argv) PROTOCOL.respond(get_manifest(os.getcwd())) diff --git a/slack_cli_hooks/hooks/start.py b/slack_cli_hooks/hooks/start.py index ca0fe72..af0a50e 100644 --- a/slack_cli_hooks/hooks/start.py +++ b/slack_cli_hooks/hooks/start.py @@ -40,5 +40,5 @@ def start(working_directory: str) -> None: if __name__ == "__main__": - PROTOCOL = build_protocol() + PROTOCOL = build_protocol(argv=sys.argv) start(os.getcwd()) diff --git a/slack_cli_hooks/protocol/__init__.py b/slack_cli_hooks/protocol/__init__.py index f24ce45..22fdc0d 100644 --- a/slack_cli_hooks/protocol/__init__.py +++ b/slack_cli_hooks/protocol/__init__.py @@ -1,23 +1,19 @@ import argparse -import sys from typing import List + from .default_protocol import DefaultProtocol from .message_boundary_protocol import MessageBoundaryProtocol from .protocol import Protocol -__all__ = [ - "DefaultProtocol", - "MessageBoundaryProtocol", - "Protocol", -] +__all__ = ["DefaultProtocol", "MessageBoundaryProtocol", "Protocol"] -def build_protocol(argv: List[str] = sys.argv[1:]) -> Protocol: +def build_protocol(argv: List[str]) -> Protocol: parser = argparse.ArgumentParser() parser.add_argument("--protocol", type=str, required=False) parser.add_argument("--boundary", type=str, required=False) - args, unknown = parser.parse_known_args(args=argv) + args, unknown = parser.parse_known_args(args=argv[1:]) if args.protocol == MessageBoundaryProtocol.name: return MessageBoundaryProtocol(boundary=args.boundary) diff --git a/slack_cli_hooks/protocol/message_boundary_protocol.py b/slack_cli_hooks/protocol/message_boundary_protocol.py index db987e4..0974041 100644 --- a/slack_cli_hooks/protocol/message_boundary_protocol.py +++ b/slack_cli_hooks/protocol/message_boundary_protocol.py @@ -1,4 +1,5 @@ import logging + from .protocol import Protocol diff --git a/tests/mock_protocol.py b/tests/mock_protocol.py new file mode 100644 index 0000000..189755e --- /dev/null +++ b/tests/mock_protocol.py @@ -0,0 +1,38 @@ +from unittest.mock import Mock + +from slack_cli_hooks.protocol.protocol import Protocol + + +def debug(self, msg: str, *args, **kwargs): + """This is a mock""" + pass + + +def info(self, msg: str, *args, **kwargs): + """This is a mock""" + pass + + +def warning(self, msg: str, *args, **kwargs): + """This is a mock""" + pass + + +def error(self, msg: str, *args, **kwargs): + """This is a mock""" + pass + + +def respond(self, data: str): + """This is a mock""" + pass + + +class MockProtocol(Protocol): + name: str = "MockProtocol" + + debug = Mock(spec=debug, return_value=None) + info = Mock(spec=info, return_value=None) + warning = Mock(spec=warning, return_value=None) + error = Mock(spec=error, return_value=None) + respond = Mock(spec=respond, return_value=None) diff --git a/tests/mock_socket_mode_server.py b/tests/mock_socket_mode_server.py index c3b1703..a223776 100644 --- a/tests/mock_socket_mode_server.py +++ b/tests/mock_socket_mode_server.py @@ -1,9 +1,10 @@ import json import threading import time -from urllib.request import urlopen -from urllib.error import URLError from unittest import TestCase +from urllib.error import URLError +from urllib.request import urlopen + from flask import Flask from gevent import pywsgi from geventwebsocket.handler import WebSocketHandler diff --git a/tests/mock_web_api_server.py b/tests/mock_web_api_server.py index 7b81ab6..3c01d6b 100644 --- a/tests/mock_web_api_server.py +++ b/tests/mock_web_api_server.py @@ -5,7 +5,7 @@ from http.server import HTTPServer, SimpleHTTPRequestHandler from typing import Type from unittest import TestCase -from urllib.parse import urlparse, ParseResult +from urllib.parse import ParseResult, urlparse class MockHandler(SimpleHTTPRequestHandler): diff --git a/tests/scenario_test/test_app/app.py b/tests/scenario_test/test_app/app.py index cfa0358..bf0b475 100644 --- a/tests/scenario_test/test_app/app.py +++ b/tests/scenario_test/test_app/app.py @@ -1,7 +1,7 @@ import os -from slack_sdk import WebClient from slack_bolt.app import App +from slack_sdk import WebClient from utils import get_test_socket_mode_handler, wait_for_test_socket_connection web_client = WebClient(base_url="http://localhost:8888", token=os.environ.get("SLACK_BOT_TOKEN")) diff --git a/tests/scenario_test/test_app/my_app.py b/tests/scenario_test/test_app/my_app.py index e5af42b..97cbe80 100644 --- a/tests/scenario_test/test_app/my_app.py +++ b/tests/scenario_test/test_app/my_app.py @@ -1,7 +1,7 @@ import os -from slack_sdk import WebClient from slack_bolt.app import App +from slack_sdk import WebClient from utils import get_test_socket_mode_handler, wait_for_test_socket_connection web_client = WebClient(base_url="http://localhost:8888", token=os.environ.get("SLACK_BOT_TOKEN")) diff --git a/tests/scenario_test/test_app/utils.py b/tests/scenario_test/test_app/utils.py index 201036c..85d2b54 100644 --- a/tests/scenario_test/test_app/utils.py +++ b/tests/scenario_test/test_app/utils.py @@ -1,6 +1,6 @@ import time - from typing import Optional + from slack_bolt.adapter.socket_mode.builtin import SocketModeHandler from slack_bolt.app.app import App diff --git a/tests/scenario_test/test_check_update.py b/tests/scenario_test/test_check_update.py index 9f64d2a..81fd28a 100644 --- a/tests/scenario_test/test_check_update.py +++ b/tests/scenario_test/test_check_update.py @@ -3,13 +3,13 @@ from slack_cli_hooks.hooks import check_update from slack_cli_hooks.hooks.check_update import build_output -from slack_cli_hooks.protocol.default_protocol import DefaultProtocol +from tests.mock_protocol import MockProtocol from tests.utils import build_fake_dependency, build_fake_pypi_urlopen class TestGetManifest: def setup_method(self): - check_update.PROTOCOL = DefaultProtocol() + check_update.PROTOCOL = MockProtocol() def test_build_output(self): test_project = "test_proj" diff --git a/tests/scenario_test/test_get_hooks.py b/tests/scenario_test/test_get_hooks.py index 26d358e..305d63a 100644 --- a/tests/scenario_test/test_get_hooks.py +++ b/tests/scenario_test/test_get_hooks.py @@ -1,10 +1,21 @@ import json import runpy +import sys +from unittest.mock import patch from slack_cli_hooks.hooks import get_hooks, get_manifest, start class TestGetHooks: + + def setup_method(self): + cli_args = [get_hooks.__name__, "--protocol", "message-boundaries", "--boundary", ""] + self.argv_mock = patch.object(sys, "argv", cli_args) + self.argv_mock.start() + + def teardown_method(self): + self.argv_mock.stop() + def test_get_manifest(self, capsys): runpy.run_module(get_hooks.__name__, run_name="__main__") diff --git a/tests/scenario_test/test_get_manifest.py b/tests/scenario_test/test_get_manifest.py index bc26522..32c5bd7 100644 --- a/tests/scenario_test/test_get_manifest.py +++ b/tests/scenario_test/test_get_manifest.py @@ -1,17 +1,26 @@ import json import os import runpy +import sys +from unittest.mock import patch + import pytest + from slack_cli_hooks.error import CliError from slack_cli_hooks.hooks import get_manifest class TestGetManifest: + def setup_method(self): + cli_args = [get_manifest.__name__, "--protocol", "message-boundaries", "--boundary", ""] + self.argv_mock = patch.object(sys, "argv", cli_args) + self.argv_mock.start() self.cwd = os.getcwd() def teardown_method(self): os.chdir(self.cwd) + self.argv_mock.stop() def test_get_manifest_script(self, capsys): working_directory = "tests/scenario_test/test_app" diff --git a/tests/scenario_test/test_start.py b/tests/scenario_test/test_start.py index 175e93b..d4cb405 100644 --- a/tests/scenario_test/test_start.py +++ b/tests/scenario_test/test_start.py @@ -1,8 +1,11 @@ +import os import runpy +import sys +from unittest.mock import patch + import pytest -import os -from slack_cli_hooks.error import CliError +from slack_cli_hooks.error import CliError from slack_cli_hooks.hooks import start from tests.mock_socket_mode_server import start_socket_mode_server, stop_socket_mode_server from tests.mock_web_api_server import cleanup_mock_web_api_server, setup_mock_web_api_server @@ -18,9 +21,15 @@ def setup_method(self): os.environ["SLACK_APP_TOKEN"] = "xapp-A111-222-xyz" setup_mock_web_api_server(self) start_socket_mode_server(self, 3012) + + cli_args = [start.__name__, "--protocol", "message-boundaries", "--boundary", ""] + self.argv_mock = patch.object(sys, "argv", cli_args) + self.argv_mock.start() + self.cwd = os.getcwd() def teardown_method(self): + self.argv_mock.stop() os.chdir(self.cwd) os.environ.pop("SLACK_BOT_TOKEN", None) os.environ.pop("SLACK_APP_TOKEN", None) diff --git a/tests/slack_cli_hooks/hooks/test_check_update.py b/tests/slack_cli_hooks/hooks/test_check_update.py index c590855..edcae65 100644 --- a/tests/slack_cli_hooks/hooks/test_check_update.py +++ b/tests/slack_cli_hooks/hooks/test_check_update.py @@ -2,8 +2,8 @@ from urllib import request import pytest - from packaging.version import Version + from slack_cli_hooks.error import PypiError from slack_cli_hooks.hooks import check_update from slack_cli_hooks.hooks.check_update import ( @@ -14,7 +14,7 @@ pypi_get, pypi_get_json, ) -from slack_cli_hooks.protocol.default_protocol import DefaultProtocol +from tests.mock_protocol import MockProtocol from tests.utils import build_fake_dependency, build_fake_pypi_urlopen @@ -22,7 +22,7 @@ class TestRelease: test_project = "test_proj" def setup_method(self): - check_update.PROTOCOL = DefaultProtocol() + check_update.PROTOCOL = MockProtocol() def test_release_with_same_version(self): release = Release(name=self.test_project, current=Version("0.0.0"), latest=Version("0.0.0")) @@ -57,7 +57,7 @@ def test_release_with_major_upgrade(self): class TestCheckUpdate: def setup_method(self): - check_update.PROTOCOL = DefaultProtocol() + check_update.PROTOCOL = MockProtocol() def test_pypi_get(self): test_project = "test_proj" diff --git a/tests/slack_cli_hooks/hooks/test_get_hooks.py b/tests/slack_cli_hooks/hooks/test_get_hooks.py index 9980a35..0dc7426 100644 --- a/tests/slack_cli_hooks/hooks/test_get_hooks.py +++ b/tests/slack_cli_hooks/hooks/test_get_hooks.py @@ -1,4 +1,5 @@ import re + from slack_cli_hooks.hooks.get_hooks import hooks_payload diff --git a/tests/slack_cli_hooks/hooks/test_get_manifest.py b/tests/slack_cli_hooks/hooks/test_get_manifest.py index 783a29e..a2b18c7 100644 --- a/tests/slack_cli_hooks/hooks/test_get_manifest.py +++ b/tests/slack_cli_hooks/hooks/test_get_manifest.py @@ -1,6 +1,7 @@ from unittest import mock import pytest + from slack_cli_hooks.error import CliError from slack_cli_hooks.hooks.get_manifest import filter_directories, find_file_path diff --git a/tests/slack_cli_hooks/protocol/test_protocol_factory.py b/tests/slack_cli_hooks/protocol/test_protocol_factory.py index c926a24..21818b5 100644 --- a/tests/slack_cli_hooks/protocol/test_protocol_factory.py +++ b/tests/slack_cli_hooks/protocol/test_protocol_factory.py @@ -1,15 +1,16 @@ -from slack_cli_hooks.protocol import build_protocol, DefaultProtocol, MessageBoundaryProtocol, Protocol +from slack_cli_hooks.protocol import MessageBoundaryProtocol, Protocol, build_protocol +from slack_cli_hooks.protocol.default_protocol import DefaultProtocol class TestProtocolFactory: def test_default(self): args = [] - protocol = build_protocol(args) + protocol = build_protocol(argv=args) assert isinstance(protocol, Protocol) assert isinstance(protocol, DefaultProtocol) def test_message_boundaries(self): args = [f"--protocol={MessageBoundaryProtocol.name}", "--bound=boundary"] - protocol = build_protocol(args) + protocol = build_protocol(argv=args) assert isinstance(protocol, Protocol) assert isinstance(protocol, MessageBoundaryProtocol)