diff --git a/exhibition/command.py b/exhibition/command.py index d09b1e2..d3d83c2 100644 --- a/exhibition/command.py +++ b/exhibition/command.py @@ -56,12 +56,15 @@ def gen(): @exhibition.command(short_help="Serve site locally") -def serve(): +@click.option("-s", "--server", default="localhost", help="Hostname to serve the site at.") +@click.option("-p", "--port", default=8000, type=int, help="Port to serve the site at.") +def serve(server, port): """ Serve files from deploy_path as a webserver would """ settings = config.Config.from_path(config.SITE_YAML_PATH) - httpd, thread = utils.serve(settings) + server_address = (server, port) + httpd, thread = utils.serve(settings, server_address) try: thread.join() diff --git a/exhibition/tests/test_command.py b/exhibition/tests/test_command.py index 3656a7e..d71c570 100644 --- a/exhibition/tests/test_command.py +++ b/exhibition/tests/test_command.py @@ -48,7 +48,8 @@ def test_serve(self, config_mock, serve_mock): self.assertEqual(result.exit_code, 0) self.assertEqual(serve_mock.call_count, 1) - self.assertEqual(serve_mock.call_args, ((config_mock.return_value,), {})) + expected_args = ((config_mock.return_value, ("localhost", 8000)), {}) + self.assertEqual(serve_mock.call_args, expected_args) self.assertEqual(config_mock.call_args, ((config.SITE_YAML_PATH,), {})) self.assertEqual(serve_mock.return_value[0].shutdown.call_count, 0) @@ -59,12 +60,31 @@ def test_serve(self, config_mock, serve_mock): result = runner.invoke(command.exhibition, ["serve"]) self.assertEqual(result.exit_code, 0) self.assertEqual(serve_mock.call_count, 2) - self.assertEqual(serve_mock.call_args, ((config_mock.return_value,), {})) + expected_args = ((config_mock.return_value, ("localhost", 8000)), {}) + self.assertEqual(serve_mock.call_args, expected_args) self.assertEqual(config_mock.call_args, ((config.SITE_YAML_PATH,), {})) self.assertEqual(serve_mock.return_value[0].shutdown.call_count, 1) self.assertEqual(serve_mock.return_value[1].join.call_count, 2) + # Undoing the KeyboardInterrupt + serve_mock.return_value[1].join.side_effect = None + # Now testing w args + config_mock.reset_mock() + serve_mock.reset_mock() + serve_mock.return_value[0].reset_mock() + serve_mock.return_value[1].reset_mock() + addr_options = ["serve", "--server", "localhost", "--port", "8001"] + result = runner.invoke(command.exhibition, addr_options) + + self.assertEqual(result.exit_code, 0) + self.assertEqual(serve_mock.call_count, 1) + expected_args = ((config_mock.return_value, ("localhost", 8001)), {}) + self.assertEqual(serve_mock.call_args, expected_args) + + self.assertEqual(serve_mock.return_value[0].shutdown.call_count, 0) + self.assertEqual(serve_mock.return_value[1].join.call_count, 1) + @mock.patch.object(command, "logger") def test_exhibition(self, log_mock): @command.exhibition.command() diff --git a/exhibition/tests/test_serve.py b/exhibition/tests/test_serve.py index 428a588..1ac5bc3 100644 --- a/exhibition/tests/test_serve.py +++ b/exhibition/tests/test_serve.py @@ -93,7 +93,8 @@ def tearDown(self): self.server.server_close() def get_server(self, settings): - httpd, thread = serve(settings) + server_address = ("localhost", 8000) + httpd, thread = serve(settings, server_address) self.server = httpd def test_fetch_file(self): diff --git a/exhibition/utils.py b/exhibition/utils.py index 92d0222..14c025d 100644 --- a/exhibition/utils.py +++ b/exhibition/utils.py @@ -85,7 +85,7 @@ def end_headers(self): return super().end_headers() -def serve(settings): +def serve(settings, server_address): """ Serves the generated site from ``deploy_path`` @@ -93,8 +93,6 @@ def serve(settings): """ logger = logging.getLogger("exhibition.server") - server_address = ('localhost', 8000) - # this is quite ewwww, but whatever. class ExhibitionHTTPRequestHandler(ExhibitionBaseHTTPRequestHandler): _settings = settings