From 208da04a01a4b5de8dc34e62c87db4cfa4c0d9b6 Mon Sep 17 00:00:00 2001 From: "John L. Villalovos" Date: Fri, 14 Jan 2022 22:37:58 -0800 Subject: [PATCH] test: use 'responses' in test_mixins_methods.py Convert from httmock to responses in test_mixins_methods.py This leaves only one file left to convert --- tests/unit/mixins/test_mixin_methods.py | 337 ++++++++++++++---------- 1 file changed, 191 insertions(+), 146 deletions(-) diff --git a/tests/unit/mixins/test_mixin_methods.py b/tests/unit/mixins/test_mixin_methods.py index 626230e1c..6ccda404c 100644 --- a/tests/unit/mixins/test_mixin_methods.py +++ b/tests/unit/mixins/test_mixin_methods.py @@ -1,5 +1,5 @@ import pytest -from httmock import HTTMock, response, urlmatch # noqa +import responses from gitlab import base from gitlab.mixins import ( @@ -24,108 +24,127 @@ class FakeManager(base.RESTManager): _obj_cls = FakeObject +@responses.activate def test_get_mixin(gl): class M(GetMixin, FakeManager): pass - @urlmatch(scheme="http", netloc="localhost", path="/api/v4/tests/42", method="get") - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = '{"id": 42, "foo": "bar"}' - return response(200, content, headers, None, 5, request) + url = "http://localhost/api/v4/tests/42" + responses.add( + method=responses.GET, + url=url, + json={"id": 42, "foo": "bar"}, + status=200, + match_querystring=True, + ) - with HTTMock(resp_cont): - mgr = M(gl) - obj = mgr.get(42) - assert isinstance(obj, FakeObject) - assert obj.foo == "bar" - assert obj.id == 42 + mgr = M(gl) + obj = mgr.get(42) + assert isinstance(obj, FakeObject) + assert obj.foo == "bar" + assert obj.id == 42 + assert responses.assert_call_count(url, 1) is True +@responses.activate def test_refresh_mixin(gl): class TestClass(RefreshMixin, FakeObject): pass - @urlmatch(scheme="http", netloc="localhost", path="/api/v4/tests/42", method="get") - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = '{"id": 42, "foo": "bar"}' - return response(200, content, headers, None, 5, request) + url = "http://localhost/api/v4/tests/42" + responses.add( + method=responses.GET, + url=url, + json={"id": 42, "foo": "bar"}, + status=200, + match_querystring=True, + ) - with HTTMock(resp_cont): - mgr = FakeManager(gl) - obj = TestClass(mgr, {"id": 42}) - res = obj.refresh() - assert res is None - assert obj.foo == "bar" - assert obj.id == 42 + mgr = FakeManager(gl) + obj = TestClass(mgr, {"id": 42}) + res = obj.refresh() + assert res is None + assert obj.foo == "bar" + assert obj.id == 42 + assert responses.assert_call_count(url, 1) is True +@responses.activate def test_get_without_id_mixin(gl): class M(GetWithoutIdMixin, FakeManager): pass - @urlmatch(scheme="http", netloc="localhost", path="/api/v4/tests", method="get") - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = '{"foo": "bar"}' - return response(200, content, headers, None, 5, request) + url = "http://localhost/api/v4/tests" + responses.add( + method=responses.GET, + url=url, + json={"foo": "bar"}, + status=200, + match_querystring=True, + ) - with HTTMock(resp_cont): - mgr = M(gl) - obj = mgr.get() - assert isinstance(obj, FakeObject) - assert obj.foo == "bar" - assert not hasattr(obj, "id") + mgr = M(gl) + obj = mgr.get() + assert isinstance(obj, FakeObject) + assert obj.foo == "bar" + assert not hasattr(obj, "id") + assert responses.assert_call_count(url, 1) is True +@responses.activate def test_list_mixin(gl): class M(ListMixin, FakeManager): pass - @urlmatch(scheme="http", netloc="localhost", path="/api/v4/tests", method="get") - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = '[{"id": 42, "foo": "bar"},{"id": 43, "foo": "baz"}]' - return response(200, content, headers, None, 5, request) - - with HTTMock(resp_cont): - # test RESTObjectList - mgr = M(gl) - obj_list = mgr.list(as_list=False) - assert isinstance(obj_list, base.RESTObjectList) - for obj in obj_list: - assert isinstance(obj, FakeObject) - assert obj.id in (42, 43) - - # test list() - obj_list = mgr.list(all=True) - assert isinstance(obj_list, list) - assert obj_list[0].id == 42 - assert obj_list[1].id == 43 - assert isinstance(obj_list[0], FakeObject) - assert len(obj_list) == 2 + url = "http://localhost/api/v4/tests" + responses.add( + method=responses.GET, + url=url, + json=[{"id": 42, "foo": "bar"}, {"id": 43, "foo": "baz"}], + status=200, + match_querystring=True, + ) + + # test RESTObjectList + mgr = M(gl) + obj_list = mgr.list(as_list=False) + assert isinstance(obj_list, base.RESTObjectList) + for obj in obj_list: + assert isinstance(obj, FakeObject) + assert obj.id in (42, 43) + + # test list() + obj_list = mgr.list(all=True) + assert isinstance(obj_list, list) + assert obj_list[0].id == 42 + assert obj_list[1].id == 43 + assert isinstance(obj_list[0], FakeObject) + assert len(obj_list) == 2 + assert responses.assert_call_count(url, 2) is True +@responses.activate def test_list_other_url(gl): class M(ListMixin, FakeManager): pass - @urlmatch(scheme="http", netloc="localhost", path="/api/v4/others", method="get") - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = '[{"id": 42, "foo": "bar"}]' - return response(200, content, headers, None, 5, request) + url = "http://localhost/api/v4/others" + responses.add( + method=responses.GET, + url=url, + json=[{"id": 42, "foo": "bar"}], + status=200, + match_querystring=True, + ) - with HTTMock(resp_cont): - mgr = M(gl) - obj_list = mgr.list(path="/others", as_list=False) - assert isinstance(obj_list, base.RESTObjectList) - obj = obj_list.next() - assert obj.id == 42 - assert obj.foo == "bar" - with pytest.raises(StopIteration): - obj_list.next() + mgr = M(gl) + obj_list = mgr.list(path="/others", as_list=False) + assert isinstance(obj_list, base.RESTObjectList) + obj = obj_list.next() + assert obj.id == 42 + assert obj.foo == "bar" + with pytest.raises(StopIteration): + obj_list.next() def test_create_mixin_missing_attrs(gl): @@ -144,6 +163,7 @@ class M(CreateMixin, FakeManager): assert "foo" in str(error.value) +@responses.activate def test_create_mixin(gl): class M(CreateMixin, FakeManager): _create_attrs = base.RequiredOptional( @@ -151,20 +171,24 @@ class M(CreateMixin, FakeManager): ) _update_attrs = base.RequiredOptional(required=("foo",), optional=("bam",)) - @urlmatch(scheme="http", netloc="localhost", path="/api/v4/tests", method="post") - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = '{"id": 42, "foo": "bar"}' - return response(200, content, headers, None, 5, request) + url = "http://localhost/api/v4/tests" + responses.add( + method=responses.POST, + url=url, + json={"id": 42, "foo": "bar"}, + status=200, + match_querystring=True, + ) - with HTTMock(resp_cont): - mgr = M(gl) - obj = mgr.create({"foo": "bar"}) - assert isinstance(obj, FakeObject) - assert obj.id == 42 - assert obj.foo == "bar" + mgr = M(gl) + obj = mgr.create({"foo": "bar"}) + assert isinstance(obj, FakeObject) + assert obj.id == 42 + assert obj.foo == "bar" + assert responses.assert_call_count(url, 1) is True +@responses.activate def test_create_mixin_custom_path(gl): class M(CreateMixin, FakeManager): _create_attrs = base.RequiredOptional( @@ -172,18 +196,21 @@ class M(CreateMixin, FakeManager): ) _update_attrs = base.RequiredOptional(required=("foo",), optional=("bam",)) - @urlmatch(scheme="http", netloc="localhost", path="/api/v4/others", method="post") - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = '{"id": 42, "foo": "bar"}' - return response(200, content, headers, None, 5, request) + url = "http://localhost/api/v4/others" + responses.add( + method=responses.POST, + url=url, + json={"id": 42, "foo": "bar"}, + status=200, + match_querystring=True, + ) - with HTTMock(resp_cont): - mgr = M(gl) - obj = mgr.create({"foo": "bar"}, path="/others") - assert isinstance(obj, FakeObject) - assert obj.id == 42 - assert obj.foo == "bar" + mgr = M(gl) + obj = mgr.create({"foo": "bar"}, path="/others") + assert isinstance(obj, FakeObject) + assert obj.id == 42 + assert obj.foo == "bar" + assert responses.assert_call_count(url, 1) is True def test_update_mixin_missing_attrs(gl): @@ -202,6 +229,7 @@ class M(UpdateMixin, FakeManager): assert "foo" in str(error.value) +@responses.activate def test_update_mixin(gl): class M(UpdateMixin, FakeManager): _create_attrs = base.RequiredOptional( @@ -209,20 +237,24 @@ class M(UpdateMixin, FakeManager): ) _update_attrs = base.RequiredOptional(required=("foo",), optional=("bam",)) - @urlmatch(scheme="http", netloc="localhost", path="/api/v4/tests/42", method="put") - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = '{"id": 42, "foo": "baz"}' - return response(200, content, headers, None, 5, request) + url = "http://localhost/api/v4/tests/42" + responses.add( + method=responses.PUT, + url=url, + json={"id": 42, "foo": "baz"}, + status=200, + match_querystring=True, + ) - with HTTMock(resp_cont): - mgr = M(gl) - server_data = mgr.update(42, {"foo": "baz"}) - assert isinstance(server_data, dict) - assert server_data["id"] == 42 - assert server_data["foo"] == "baz" + mgr = M(gl) + server_data = mgr.update(42, {"foo": "baz"}) + assert isinstance(server_data, dict) + assert server_data["id"] == 42 + assert server_data["foo"] == "baz" + assert responses.assert_call_count(url, 1) is True +@responses.activate def test_update_mixin_no_id(gl): class M(UpdateMixin, FakeManager): _create_attrs = base.RequiredOptional( @@ -230,36 +262,42 @@ class M(UpdateMixin, FakeManager): ) _update_attrs = base.RequiredOptional(required=("foo",), optional=("bam",)) - @urlmatch(scheme="http", netloc="localhost", path="/api/v4/tests", method="put") - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = '{"foo": "baz"}' - return response(200, content, headers, None, 5, request) + url = "http://localhost/api/v4/tests" + responses.add( + method=responses.PUT, + url=url, + json={"foo": "baz"}, + status=200, + match_querystring=True, + ) - with HTTMock(resp_cont): - mgr = M(gl) - server_data = mgr.update(new_data={"foo": "baz"}) - assert isinstance(server_data, dict) - assert server_data["foo"] == "baz" + mgr = M(gl) + server_data = mgr.update(new_data={"foo": "baz"}) + assert isinstance(server_data, dict) + assert server_data["foo"] == "baz" + assert responses.assert_call_count(url, 1) is True +@responses.activate def test_delete_mixin(gl): class M(DeleteMixin, FakeManager): pass - @urlmatch( - scheme="http", netloc="localhost", path="/api/v4/tests/42", method="delete" + url = "http://localhost/api/v4/tests/42" + responses.add( + method=responses.DELETE, + url=url, + json="", + status=200, + match_querystring=True, ) - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = "" - return response(200, content, headers, None, 5, request) - with HTTMock(resp_cont): - mgr = M(gl) - mgr.delete(42) + mgr = M(gl) + mgr.delete(42) + assert responses.assert_call_count(url, 1) is True +@responses.activate def test_save_mixin(gl): class M(UpdateMixin, FakeManager): pass @@ -267,34 +305,41 @@ class M(UpdateMixin, FakeManager): class TestClass(SaveMixin, base.RESTObject): pass - @urlmatch(scheme="http", netloc="localhost", path="/api/v4/tests/42", method="put") - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = '{"id": 42, "foo": "baz"}' - return response(200, content, headers, None, 5, request) + url = "http://localhost/api/v4/tests/42" + responses.add( + method=responses.PUT, + url=url, + json={"id": 42, "foo": "baz"}, + status=200, + match_querystring=True, + ) - with HTTMock(resp_cont): - mgr = M(gl) - obj = TestClass(mgr, {"id": 42, "foo": "bar"}) - obj.foo = "baz" - obj.save() - assert obj._attrs["foo"] == "baz" - assert obj._updated_attrs == {} + mgr = M(gl) + obj = TestClass(mgr, {"id": 42, "foo": "bar"}) + obj.foo = "baz" + obj.save() + assert obj._attrs["foo"] == "baz" + assert obj._updated_attrs == {} + assert responses.assert_call_count(url, 1) is True +@responses.activate def test_set_mixin(gl): class M(SetMixin, FakeManager): pass - @urlmatch(scheme="http", netloc="localhost", path="/api/v4/tests/foo", method="put") - def resp_cont(url, request): - headers = {"Content-Type": "application/json"} - content = '{"key": "foo", "value": "bar"}' - return response(200, content, headers, None, 5, request) + url = "http://localhost/api/v4/tests/foo" + responses.add( + method=responses.PUT, + url=url, + json={"key": "foo", "value": "bar"}, + status=200, + match_querystring=True, + ) - with HTTMock(resp_cont): - mgr = M(gl) - obj = mgr.set("foo", "bar") - assert isinstance(obj, FakeObject) - assert obj.key == "foo" - assert obj.value == "bar" + mgr = M(gl) + obj = mgr.set("foo", "bar") + assert isinstance(obj, FakeObject) + assert obj.key == "foo" + assert obj.value == "bar" + assert responses.assert_call_count(url, 1) is True