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

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. 

12 

13from unittest import mock 

14 

15import datetime 

16from oslo_config import cfg 

17import webob 

18 

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 

28 

29CONF = cfg.CONF 

30 

31 

32class MessageApiTest(test.TestCase): 

33 def setUp(self): 

34 super(MessageApiTest, self).setUp() 

35 self.controller = messages.MessagesController() 

36 

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)) 

41 

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 } 

68 

69 def test_show(self): 

70 self.mock_object(message_api.API, 'get', stubs.stub_message_get) 

71 

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 

76 

77 res_dict = self.controller.show(req, fakes.FAKE_UUID) 

78 

79 ex = self._expected_message_from_controller(fakes.FAKE_UUID) 

80 self.assertEqual(ex, res_dict) 

81 

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) 

90 

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 

96 

97 res_dict = self.controller.show(req, fakes.FAKE_UUID) 

98 

99 self.assertEqual(resource_type, 

100 res_dict['message']['resource_type']) 

101 self.assertEqual(resource_id, 

102 res_dict['message']['resource_id']) 

103 

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)) 

108 

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 

114 

115 self.assertRaises(webob.exc.HTTPNotFound, self.controller.show, 

116 req, fakes.FAKE_UUID) 

117 

118 def test_show_pre_microversion(self): 

119 self.mock_object(message_api.API, 'get', stubs.stub_message_get) 

120 

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 

125 

126 self.assertRaises(exception.VersionNotFoundForAPIMethod, 

127 self.controller.show, req, fakes.FAKE_UUID) 

128 

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') 

132 

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 

137 

138 resp = self.controller.delete(req, fakes.FAKE_UUID) 

139 

140 self.assertEqual(204, resp.status_int) 

141 self.assertTrue(message_api.API.delete.called) 

142 

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)) 

147 

148 req = fakes.HTTPRequest.blank( 

149 '/v2/fake/messages/%s' % fakes.FAKE_UUID, 

150 version=messages.MESSAGES_BASE_MICRO_VERSION) 

151 

152 self.assertRaises(webob.exc.HTTPNotFound, self.controller.delete, 

153 req, fakes.FAKE_UUID) 

154 

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 

165 

166 res_dict = self.controller.index(req) 

167 

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) 

172 

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 

181 

182 res_dict = self.controller.index(req) 

183 

184 ex2 = self._expected_message_from_controller(msg2['id'])['message'] 

185 self.assertEqual([ex2], res_dict['messages']) 

186 

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 

200 

201 res_dict = self.controller.index(req) 

202 

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']) 

209 

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 

216 

217 self.assertRaises(exception.ValidationError, 

218 self.controller.index, req)