From fb7d8ce57296b5897827545351d6c15bf3ebdc49 Mon Sep 17 00:00:00 2001 From: Steve Baker Date: Fri, 17 Apr 2020 16:29:24 +1200 Subject: [PATCH] Don't use wsme test webapp for patch tests Instead, use the pecan test webapp in BaseApiTest. This reduces exposure to wsme imports, and results in a test harness which is closer to the running app. Change-Id: I6b736a21f6bc54790a84de3b6900c27eb1c738f1 Story: 1651346 --- ironic/tests/unit/api/base.py | 4 +- .../unit/api/controllers/v1/test_types.py | 40 +++++++++++-------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/ironic/tests/unit/api/base.py b/ironic/tests/unit/api/base.py index d26308e825..5d4ab99b88 100644 --- a/ironic/tests/unit/api/base.py +++ b/ironic/tests/unit/api/base.py @@ -44,6 +44,8 @@ class BaseApiTest(db_base.DbTestCase): SOURCE_DATA = {'test_source': {'somekey': '666'}} + root_controller = 'ironic.api.controllers.root.RootController' + def setUp(self): super(BaseApiTest, self).setUp() cfg.CONF.set_override("auth_version", "v3", @@ -68,7 +70,7 @@ class BaseApiTest(db_base.DbTestCase): self.app_config = { 'app': { - 'root': 'ironic.api.controllers.root.RootController', + 'root': self.root_controller, 'modules': ['ironic.api'], 'static_root': '%s/public' % root_dir, 'debug': True, diff --git a/ironic/tests/unit/api/controllers/v1/test_types.py b/ironic/tests/unit/api/controllers/v1/test_types.py index 69bc3f1b55..dbf548516e 100644 --- a/ironic/tests/unit/api/controllers/v1/test_types.py +++ b/ironic/tests/unit/api/controllers/v1/test_types.py @@ -19,14 +19,16 @@ from http import client as http_client import platform import mock -import webtest +from pecan import rest import wsme from ironic.api.controllers.v1 import types +from ironic.api import expose from ironic.api import types as atypes from ironic.common import exception from ironic.common import utils from ironic.tests import base +from ironic.tests.unit.api import base as api_base from ironic.tests.unit.api.utils import fake_event_validator @@ -102,21 +104,27 @@ class MyPatchType(types.JsonPatchType): return ['/internal'] -class MyRoot(wsme.WSRoot): +class MyTest(rest.RestController): """Helper class for TestJsonPatchType tests.""" - @wsme.expose([str], body=[MyPatchType]) @wsme.validate([MyPatchType]) - def test(self, patch): + @expose.expose([str], body=[MyPatchType]) + def patch(self, patch): return patch -class TestJsonPatchType(base.TestCase): +class MyRoot(rest.RestController): + test = MyTest() + + +class TestJsonPatchType(api_base.BaseApiTest): + + root_controller = ('ironic.tests.unit.api.controllers.v1.' + 'test_types.MyRoot') @mock.patch.object(platform, '_syscmd_uname', lambda *x: '') def setUp(self): super(TestJsonPatchType, self).setUp() - self.app = webtest.TestApp(MyRoot(['restjson']).wsgiapp()) def _patch_json(self, params, expect_errors=False): return self.app.patch_json('/test', params=params, @@ -144,14 +152,14 @@ class TestJsonPatchType(base.TestCase): patch = [{'path': '/internal', 'op': 'replace', 'value': 'foo'}] ret = self._patch_json(patch, True) self.assertEqual(http_client.BAD_REQUEST, ret.status_int) - self.assertTrue(ret.json['faultstring']) + self.assertTrue(ret.json['error_message']) def test_cannot_update_internal_dict_attr(self): patch = [{'path': '/internal/test', 'op': 'replace', 'value': 'foo'}] ret = self._patch_json(patch, True) self.assertEqual(http_client.BAD_REQUEST, ret.status_int) - self.assertTrue(ret.json['faultstring']) + self.assertTrue(ret.json['error_message']) def test_mandatory_attr(self): patch = [{'op': 'replace', 'path': '/mandatory', 'value': 'foo'}] @@ -163,49 +171,49 @@ class TestJsonPatchType(base.TestCase): patch = [{'op': 'remove', 'path': '/mandatory'}] ret = self._patch_json(patch, True) self.assertEqual(http_client.BAD_REQUEST, ret.status_int) - self.assertTrue(ret.json['faultstring']) + self.assertTrue(ret.json['error_message']) def test_cannot_remove_extra_non_removable_attr(self): patch = [{'op': 'remove', 'path': '/non_removable'}] ret = self._patch_json(patch, True) self.assertEqual(http_client.BAD_REQUEST, ret.status_int) - self.assertTrue(ret.json['faultstring']) + self.assertTrue(ret.json['error_message']) def test_missing_required_fields_path(self): missing_path = [{'op': 'remove'}] ret = self._patch_json(missing_path, True) self.assertEqual(http_client.BAD_REQUEST, ret.status_int) - self.assertTrue(ret.json['faultstring']) + self.assertTrue(ret.json['error_message']) def test_missing_required_fields_op(self): missing_op = [{'path': '/foo'}] ret = self._patch_json(missing_op, True) self.assertEqual(http_client.BAD_REQUEST, ret.status_int) - self.assertTrue(ret.json['faultstring']) + self.assertTrue(ret.json['error_message']) def test_invalid_op(self): patch = [{'path': '/foo', 'op': 'invalid'}] ret = self._patch_json(patch, True) self.assertEqual(http_client.BAD_REQUEST, ret.status_int) - self.assertTrue(ret.json['faultstring']) + self.assertTrue(ret.json['error_message']) def test_invalid_path(self): patch = [{'path': 'invalid-path', 'op': 'remove'}] ret = self._patch_json(patch, True) self.assertEqual(http_client.BAD_REQUEST, ret.status_int) - self.assertTrue(ret.json['faultstring']) + self.assertTrue(ret.json['error_message']) def test_cannot_add_with_no_value(self): patch = [{'path': '/extra/foo', 'op': 'add'}] ret = self._patch_json(patch, True) self.assertEqual(http_client.BAD_REQUEST, ret.status_int) - self.assertTrue(ret.json['faultstring']) + self.assertTrue(ret.json['error_message']) def test_cannot_replace_with_no_value(self): patch = [{'path': '/foo', 'op': 'replace'}] ret = self._patch_json(patch, True) self.assertEqual(http_client.BAD_REQUEST, ret.status_int) - self.assertTrue(ret.json['faultstring']) + self.assertTrue(ret.json['error_message']) class TestBooleanType(base.TestCase):