diff --git a/livebridge/web/__init__.py b/livebridge/web/__init__.py index 36eed1a..97d4412 100644 --- a/livebridge/web/__init__.py +++ b/livebridge/web/__init__.py @@ -111,14 +111,13 @@ async def index_handler(self, request): async def control_get(self, request): control_doc = await self.app["controller"].load_control_doc() - self.control_etag = self._get_etag(control_doc) - return web.json_response(control_doc, headers={"Etag": self.control_etag}) + return web.json_response(control_doc, headers={"Etag": self._get_etag(control_doc)}) async def control_put(self, request): try: # check etag first control_doc = await self.app["controller"].load_control_doc() - if not self.control_etag or self._get_etag(control_doc) != request.headers.get("If-Match"): + if self._get_etag(control_doc) != request.headers.get("If-Match"): return web.json_response({"error": "Precondition Failed."}, status=412) # handle data await request.post() diff --git a/setup.py b/setup.py index 30ed34e..e928e3b 100644 --- a/setup.py +++ b/setup.py @@ -49,6 +49,7 @@ "asynctest==0.11.1", "bleach==2.1.2", "dsnparse==0.1.11", + "pymongo>=3.6.0", "motor==1.2.1", "python-dateutil==2.6.1", "PyYAML==3.12", diff --git a/tests/test_logger.py b/tests/test_logger.py index 56db1bf..fda4b9f 100644 --- a/tests/test_logger.py +++ b/tests/test_logger.py @@ -25,5 +25,4 @@ def test_logger(self): from livebridge.logger import logger assert type(logger) is logging.RootLogger assert type(logger.handlers[0]) is logging.StreamHandler - assert type(logger.handlers[1]) is logging.FileHandler logger.handlers = [] diff --git a/tests/test_web.py b/tests/test_web.py index 1e25edc..e516aba 100644 --- a/tests/test_web.py +++ b/tests/test_web.py @@ -30,8 +30,8 @@ async def get_application(self): "port": 9990, "auth": {"user": "test", "password": "testpwd"}} self.controller = asynctest.MagicMock(spec="livebridge.controller.Controller") - self.server = WebApi(config=self.config, controller=self.controller, loop=self.loop) - return self.server.app + server = WebApi(config=self.config, controller=self.controller, loop=self.loop) + return server.app @unittest_run_loop async def test_init_with_loop(self): @@ -47,13 +47,15 @@ async def test_init_with_loop(self): assert self.loop.create_server.call_args[0][2] == 9990 self.client.session.close() - def test_shutdown(self): - self.server.loop = unittest.mock.MagicMock() - self.server.loop.run_until_complete = unittest.mock.MagicMock() - self.server.srv = unittest.mock.MagicMock() - self.server.srv.close = unittest.mock.MagicMock() - self.server.shutdown() - assert self.server.loop.run_until_complete.call_count == 4 + @unittest_run_loop + async def test_shutdown(self): + server = WebApi(config=self.config, controller=self.controller, loop=self.loop) + server.loop = unittest.mock.MagicMock() + server.loop.run_until_complete = unittest.mock.MagicMock() + server.srv = unittest.mock.MagicMock() + server.srv.close = unittest.mock.MagicMock() + server.shutdown() + assert server.loop.run_until_complete.call_count == 4 async def _get_token(self): data = {"username": self.config["auth"]["user"], @@ -123,8 +125,7 @@ async def test_get_controldata(self): @unittest_run_loop async def test_put_controldata(self): data = '{"foo": "bla"}' - self.server.control_etag = self.server._get_etag(data) - headers = {"X-Auth-Token": await self._get_token(), "If-Match": self.server.control_etag} + headers = {"X-Auth-Token": await self._get_token(), "If-Match": "51a47b5c06e23b9abfe95f84fea5e21e"} self.controller.load_control_doc = asynctest.CoroutineMock(return_value=data) self.controller.save_control_data = asynctest.CoroutineMock(return_value=True) res = await self.client.request("PUT", "/api/v1/controldata", data=data, headers=headers) @@ -135,7 +136,8 @@ async def test_put_controldata(self): # etag is not matched self.server.control_etag = None - res = await self.client.request("PUT", "/api/v1/controldata", data=data, headers=headers) + invalid_etag = {"X-Auth-Token": await self._get_token(), "If-Match": "foo"} + res = await self.client.request("PUT", "/api/v1/controldata", data=data, headers=invalid_etag) assert res.status == 412 self.server.control_etag = "123456"