Coverage for manila/tests/api/v2/test_messages.py: 100%
98 statements
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
1# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
13from unittest import mock
15import datetime
16from oslo_config import cfg
17import webob
19from manila.api.v2 import messages
20from manila import context
21from manila import exception
22from manila.message import api as message_api
23from manila.message import message_field
24from manila import policy
25from manila import test
26from manila.tests.api import fakes
27from manila.tests.api.v2 import stubs
29CONF = cfg.CONF
32class MessageApiTest(test.TestCase):
33 def setUp(self):
34 super(MessageApiTest, self).setUp()
35 self.controller = messages.MessagesController()
37 self.maxDiff = None
38 self.ctxt = context.RequestContext('admin', 'fake', True)
39 self.mock_object(policy, 'check_policy',
40 mock.Mock(return_value=True))
42 def _expected_message_from_controller(self, id, **kwargs):
43 message = stubs.stub_message(id, **kwargs)
44 links = [
45 {'href': 'http://localhost/share/v2/fake/messages/%s' % id,
46 'rel': 'self'},
47 {'href': 'http://localhost/share/fake/messages/%s' % id,
48 'rel': 'bookmark'},
49 ]
50 return {
51 'message': {
52 'id': message.get('id'),
53 'project_id': message.get('project_id'),
54 'user_message': "%s: %s" % (
55 message_field.translate_action(message.get('action_id')),
56 message_field.translate_detail(message.get('detail_id'))),
57 'request_id': message.get('request_id'),
58 'action_id': message.get('action_id'),
59 'detail_id': message.get('detail_id'),
60 'created_at': message.get('created_at'),
61 'message_level': message.get('message_level'),
62 'expires_at': message.get('expires_at'),
63 'links': links,
64 'resource_type': message.get('resource_type'),
65 'resource_id': message.get('resource_id'),
66 }
67 }
69 def test_show(self):
70 self.mock_object(message_api.API, 'get', stubs.stub_message_get)
72 req = fakes.HTTPRequest.blank(
73 '/v2/fake/messages/%s' % fakes.FAKE_UUID,
74 version=messages.MESSAGES_BASE_MICRO_VERSION)
75 req.environ['manila.context'] = self.ctxt
77 res_dict = self.controller.show(req, fakes.FAKE_UUID)
79 ex = self._expected_message_from_controller(fakes.FAKE_UUID)
80 self.assertEqual(ex, res_dict)
82 def test_show_with_resource(self):
83 resource_type = "FAKE_RESOURCE"
84 resource_id = "b1872cb2-4c5f-4072-9828-8a51b02926a3"
85 fake_message = stubs.stub_message(fakes.FAKE_UUID,
86 resource_type=resource_type,
87 resource_id=resource_id)
88 mock_get = mock.Mock(return_value=fake_message)
89 self.mock_object(message_api.API, 'get', mock_get)
91 req = fakes.HTTPRequest.blank(
92 '/v2/fake/messages/%s' % fakes.FAKE_UUID,
93 version=messages.MESSAGES_BASE_MICRO_VERSION,
94 base_url='http://localhost/share/v2')
95 req.environ['manila.context'] = self.ctxt
97 res_dict = self.controller.show(req, fakes.FAKE_UUID)
99 self.assertEqual(resource_type,
100 res_dict['message']['resource_type'])
101 self.assertEqual(resource_id,
102 res_dict['message']['resource_id'])
104 def test_show_not_found(self):
105 fake_not_found = exception.MessageNotFound(message_id=fakes.FAKE_UUID)
106 self.mock_object(message_api.API, 'get',
107 mock.Mock(side_effect=fake_not_found))
109 req = fakes.HTTPRequest.blank(
110 '/v2/fake/messages/%s' % fakes.FAKE_UUID,
111 version=messages.MESSAGES_BASE_MICRO_VERSION,
112 base_url='http://localhost/share/v2')
113 req.environ['manila.context'] = self.ctxt
115 self.assertRaises(webob.exc.HTTPNotFound, self.controller.show,
116 req, fakes.FAKE_UUID)
118 def test_show_pre_microversion(self):
119 self.mock_object(message_api.API, 'get', stubs.stub_message_get)
121 req = fakes.HTTPRequest.blank('/v2/fake/messages/%s' % fakes.FAKE_UUID,
122 version='2.35',
123 base_url='http://localhost/share/v2')
124 req.environ['manila.context'] = self.ctxt
126 self.assertRaises(exception.VersionNotFoundForAPIMethod,
127 self.controller.show, req, fakes.FAKE_UUID)
129 def test_delete(self):
130 self.mock_object(message_api.API, 'get', stubs.stub_message_get)
131 self.mock_object(message_api.API, 'delete')
133 req = fakes.HTTPRequest.blank(
134 '/v2/fake/messages/%s' % fakes.FAKE_UUID,
135 version=messages.MESSAGES_BASE_MICRO_VERSION)
136 req.environ['manila.context'] = self.ctxt
138 resp = self.controller.delete(req, fakes.FAKE_UUID)
140 self.assertEqual(204, resp.status_int)
141 self.assertTrue(message_api.API.delete.called)
143 def test_delete_not_found(self):
144 fake_not_found = exception.MessageNotFound(message_id=fakes.FAKE_UUID)
145 self.mock_object(message_api.API, 'get',
146 mock.Mock(side_effect=fake_not_found))
148 req = fakes.HTTPRequest.blank(
149 '/v2/fake/messages/%s' % fakes.FAKE_UUID,
150 version=messages.MESSAGES_BASE_MICRO_VERSION)
152 self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete,
153 req, fakes.FAKE_UUID)
155 def test_index(self):
156 msg1 = stubs.stub_message(fakes.get_fake_uuid())
157 msg2 = stubs.stub_message(fakes.get_fake_uuid())
158 self.mock_object(message_api.API, 'get_all', mock.Mock(
159 return_value=[msg1, msg2]))
160 req = fakes.HTTPRequest.blank(
161 '/v2/fake/messages',
162 version=messages.MESSAGES_BASE_MICRO_VERSION,
163 base_url='http://localhost/share/v2')
164 req.environ['manila.context'] = self.ctxt
166 res_dict = self.controller.index(req)
168 ex1 = self._expected_message_from_controller(msg1['id'])['message']
169 ex2 = self._expected_message_from_controller(msg2['id'])['message']
170 expected = {'messages': [ex1, ex2]}
171 self.assertDictEqual(expected, res_dict)
173 def test_index_with_limit_and_offset(self):
174 msg2 = stubs.stub_message(fakes.get_fake_uuid())
175 self.mock_object(message_api.API, 'get_all', mock.Mock(
176 return_value=[msg2]))
177 req = fakes.HTTPRequest.blank(
178 '/v2/fake/messages?limit=1&offset=1',
179 version=messages.MESSAGES_BASE_MICRO_VERSION)
180 req.environ['manila.context'] = self.ctxt
182 res_dict = self.controller.index(req)
184 ex2 = self._expected_message_from_controller(msg2['id'])['message']
185 self.assertEqual([ex2], res_dict['messages'])
187 def test_index_with_created_since_and_created_before(self):
188 msg = stubs.stub_message(
189 fakes.get_fake_uuid(),
190 created_at=datetime.datetime(
191 1900, 2, 1, 1, 1, 1, tzinfo=datetime.timezone.utc))
192 self.mock_object(message_api.API, 'get_all', mock.Mock(
193 return_value=[msg]))
194 req = fakes.HTTPRequest.blank(
195 '/fake/messages?created_since=1900-01-01T01:01:01&'
196 'created_before=1900-03-01T01:01:01',
197 version=messages.MESSAGES_QUERY_BY_TIMESTAMP,
198 base_url='http://localhost/share/v2')
199 req.environ['manila.context'] = self.ctxt
201 res_dict = self.controller.index(req)
203 ex2 = self._expected_message_from_controller(
204 msg['id'],
205 created_at=datetime.datetime(
206 1900, 2, 1, 1, 1, 1,
207 tzinfo=datetime.timezone.utc))['message']
208 self.assertEqual([ex2], res_dict['messages'])
210 def test_index_with_invalid_time_format(self):
211 req = fakes.HTTPRequest.blank(
212 '/messages?created_since=invalid_time_str',
213 version=messages.MESSAGES_QUERY_BY_TIMESTAMP,
214 base_url='http://localhost/share/v2')
215 req.environ['manila.context'] = self.ctxt
217 self.assertRaises(exception.ValidationError,
218 self.controller.index, req)