root / snf-pithos-app / pithos / api / test / accounts.py @ 7e402b46
History | View | Annotate | Download (20.9 kB)
1 | f3787696 | Sofia Papagiannaki | #!/usr/bin/env python
|
---|---|---|---|
2 | f3787696 | Sofia Papagiannaki | #coding=utf8
|
3 | f3787696 | Sofia Papagiannaki | |
4 | f3787696 | Sofia Papagiannaki | # Copyright 2011-2013 GRNET S.A. All rights reserved.
|
5 | f3787696 | Sofia Papagiannaki | #
|
6 | f3787696 | Sofia Papagiannaki | # Redistribution and use in source and binary forms, with or
|
7 | f3787696 | Sofia Papagiannaki | # without modification, are permitted provided that the following
|
8 | f3787696 | Sofia Papagiannaki | # conditions are met:
|
9 | f3787696 | Sofia Papagiannaki | #
|
10 | f3787696 | Sofia Papagiannaki | # 1. Redistributions of source code must retain the above
|
11 | f3787696 | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
12 | f3787696 | Sofia Papagiannaki | # disclaimer.
|
13 | f3787696 | Sofia Papagiannaki | #
|
14 | f3787696 | Sofia Papagiannaki | # 2. Redistributions in binary form must reproduce the above
|
15 | f3787696 | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
16 | f3787696 | Sofia Papagiannaki | # disclaimer in the documentation and/or other materials
|
17 | f3787696 | Sofia Papagiannaki | # provided with the distribution.
|
18 | f3787696 | Sofia Papagiannaki | #
|
19 | f3787696 | Sofia Papagiannaki | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
20 | f3787696 | Sofia Papagiannaki | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
21 | f3787696 | Sofia Papagiannaki | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
22 | f3787696 | Sofia Papagiannaki | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
23 | f3787696 | Sofia Papagiannaki | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
24 | f3787696 | Sofia Papagiannaki | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
25 | f3787696 | Sofia Papagiannaki | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
26 | f3787696 | Sofia Papagiannaki | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
27 | f3787696 | Sofia Papagiannaki | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
28 | f3787696 | Sofia Papagiannaki | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
29 | f3787696 | Sofia Papagiannaki | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
30 | f3787696 | Sofia Papagiannaki | # POSSIBILITY OF SUCH DAMAGE.
|
31 | f3787696 | Sofia Papagiannaki | #
|
32 | f3787696 | Sofia Papagiannaki | # The views and conclusions contained in the software and
|
33 | f3787696 | Sofia Papagiannaki | # documentation are those of the authors and should not be
|
34 | f3787696 | Sofia Papagiannaki | # interpreted as representing official policies, either expressed
|
35 | f3787696 | Sofia Papagiannaki | # or implied, of GRNET S.A.
|
36 | f3787696 | Sofia Papagiannaki | |
37 | bc4f25c0 | Sofia Papagiannaki | from pithos.api.test import (PithosAPITest, AssertMappingInvariant, |
38 | bc4f25c0 | Sofia Papagiannaki | DATE_FORMATS) |
39 | f3787696 | Sofia Papagiannaki | |
40 | d6a92fa0 | Sofia Papagiannaki | from synnefo.lib import join_urls |
41 | d6a92fa0 | Sofia Papagiannaki | |
42 | f3787696 | Sofia Papagiannaki | import time as _time |
43 | f3787696 | Sofia Papagiannaki | import datetime |
44 | f3787696 | Sofia Papagiannaki | |
45 | 8b5c1106 | Sofia Papagiannaki | import django.utils.simplejson as json |
46 | f3787696 | Sofia Papagiannaki | |
47 | f3787696 | Sofia Papagiannaki | class AccountHead(PithosAPITest): |
48 | f3787696 | Sofia Papagiannaki | def test_get_account_meta(self): |
49 | f3787696 | Sofia Papagiannaki | cnames = ['apples', 'bananas', 'kiwis', 'oranges', 'pears'] |
50 | f3787696 | Sofia Papagiannaki | |
51 | f3787696 | Sofia Papagiannaki | # create containers
|
52 | f3787696 | Sofia Papagiannaki | uploaded_bytes = 0
|
53 | f3787696 | Sofia Papagiannaki | for cname in cnames: |
54 | f3787696 | Sofia Papagiannaki | self.create_container(cname)
|
55 | f3787696 | Sofia Papagiannaki | |
56 | f3787696 | Sofia Papagiannaki | # upload object
|
57 | f3787696 | Sofia Papagiannaki | name, data, resp = self.upload_object(cname)
|
58 | f3787696 | Sofia Papagiannaki | uploaded_bytes += len(data)
|
59 | f3787696 | Sofia Papagiannaki | |
60 | f3787696 | Sofia Papagiannaki | # set account meta
|
61 | f3787696 | Sofia Papagiannaki | self.update_account_meta({'foo': 'bar'}) |
62 | f3787696 | Sofia Papagiannaki | |
63 | f3787696 | Sofia Papagiannaki | account_info = self.get_account_info()
|
64 | f3787696 | Sofia Papagiannaki | self.assertTrue('X-Account-Meta-Foo' in account_info) |
65 | f3787696 | Sofia Papagiannaki | self.assertEqual(account_info['X-Account-Meta-Foo'], 'bar') |
66 | f3787696 | Sofia Papagiannaki | |
67 | f3787696 | Sofia Papagiannaki | # list containers
|
68 | f3787696 | Sofia Papagiannaki | containers = self.list_containers()
|
69 | f3787696 | Sofia Papagiannaki | self.assertEqual(int(account_info['X-Account-Container-Count']), |
70 | f3787696 | Sofia Papagiannaki | len(containers))
|
71 | f3787696 | Sofia Papagiannaki | usage = 0
|
72 | f3787696 | Sofia Papagiannaki | for c in containers: |
73 | f3787696 | Sofia Papagiannaki | # list objects
|
74 | f3787696 | Sofia Papagiannaki | objects = self.list_objects(c['name']) |
75 | f3787696 | Sofia Papagiannaki | self.assertEqual(c['count'], len(objects)) |
76 | f3787696 | Sofia Papagiannaki | csum = sum([o['bytes'] for o in objects]) |
77 | f3787696 | Sofia Papagiannaki | self.assertEqual(int(c['bytes']), csum) |
78 | f3787696 | Sofia Papagiannaki | usage += int(c['bytes']) |
79 | f3787696 | Sofia Papagiannaki | |
80 | f3787696 | Sofia Papagiannaki | self.assertEqual(
|
81 | f3787696 | Sofia Papagiannaki | int(account_info['x-account-bytes-used']) + uploaded_bytes, |
82 | f3787696 | Sofia Papagiannaki | usage) |
83 | f3787696 | Sofia Papagiannaki | |
84 | f3787696 | Sofia Papagiannaki | def test_get_account_meta_until(self): |
85 | 8b5c1106 | Sofia Papagiannaki | cnames = ['apples', 'bananas', 'kiwis'] |
86 | 8b5c1106 | Sofia Papagiannaki | |
87 | 8b5c1106 | Sofia Papagiannaki | # create containers
|
88 | 8b5c1106 | Sofia Papagiannaki | uploaded_bytes = 0
|
89 | 8b5c1106 | Sofia Papagiannaki | for cname in cnames: |
90 | 8b5c1106 | Sofia Papagiannaki | self.create_container(cname)
|
91 | 8b5c1106 | Sofia Papagiannaki | |
92 | 8b5c1106 | Sofia Papagiannaki | # upload object
|
93 | 8b5c1106 | Sofia Papagiannaki | name, data, resp = self.upload_object(cname)
|
94 | 8b5c1106 | Sofia Papagiannaki | uploaded_bytes += len(data)
|
95 | 8b5c1106 | Sofia Papagiannaki | |
96 | f3787696 | Sofia Papagiannaki | self.update_account_meta({'foo': 'bar'}) |
97 | f3787696 | Sofia Papagiannaki | |
98 | f3787696 | Sofia Papagiannaki | account_info = self.get_account_info()
|
99 | f3787696 | Sofia Papagiannaki | t = datetime.datetime.strptime(account_info['Last-Modified'],
|
100 | f3787696 | Sofia Papagiannaki | DATE_FORMATS[2])
|
101 | f3787696 | Sofia Papagiannaki | t1 = t + datetime.timedelta(seconds=1)
|
102 | f3787696 | Sofia Papagiannaki | until = int(_time.mktime(t1.timetuple()))
|
103 | f3787696 | Sofia Papagiannaki | |
104 | f3787696 | Sofia Papagiannaki | _time.sleep(2)
|
105 | 8b5c1106 | Sofia Papagiannaki | |
106 | 8b5c1106 | Sofia Papagiannaki | # add containers
|
107 | 8b5c1106 | Sofia Papagiannaki | cnames = ['oranges', 'pears'] |
108 | 8b5c1106 | Sofia Papagiannaki | for cname in cnames: |
109 | 8b5c1106 | Sofia Papagiannaki | self.create_container(cname)
|
110 | 8b5c1106 | Sofia Papagiannaki | |
111 | 8b5c1106 | Sofia Papagiannaki | # upload object
|
112 | 8b5c1106 | Sofia Papagiannaki | self.upload_object(cname)
|
113 | 8b5c1106 | Sofia Papagiannaki | |
114 | f3787696 | Sofia Papagiannaki | self.update_account_meta({'quality': 'AAA'}) |
115 | f3787696 | Sofia Papagiannaki | |
116 | f3787696 | Sofia Papagiannaki | account_info = self.get_account_info()
|
117 | f3787696 | Sofia Papagiannaki | t = datetime.datetime.strptime(account_info['Last-Modified'],
|
118 | f3787696 | Sofia Papagiannaki | DATE_FORMATS[-1])
|
119 | f3787696 | Sofia Papagiannaki | last_modified = int(_time.mktime(t.timetuple()))
|
120 | f3787696 | Sofia Papagiannaki | assert until < last_modified
|
121 | f3787696 | Sofia Papagiannaki | |
122 | f3787696 | Sofia Papagiannaki | self.assertTrue('X-Account-Meta-Quality' in account_info) |
123 | f3787696 | Sofia Papagiannaki | self.assertTrue('X-Account-Meta-Foo' in account_info) |
124 | f3787696 | Sofia Papagiannaki | |
125 | f3787696 | Sofia Papagiannaki | account_info = self.get_account_info(until=until)
|
126 | f3787696 | Sofia Papagiannaki | self.assertTrue('X-Account-Meta-Quality' not in account_info) |
127 | f3787696 | Sofia Papagiannaki | self.assertTrue('X-Account-Meta-Foo' in account_info) |
128 | f3787696 | Sofia Papagiannaki | self.assertTrue('X-Account-Until-Timestamp' in account_info) |
129 | f3787696 | Sofia Papagiannaki | t = datetime.datetime.strptime( |
130 | f3787696 | Sofia Papagiannaki | account_info['X-Account-Until-Timestamp'], DATE_FORMATS[2]) |
131 | f3787696 | Sofia Papagiannaki | self.assertTrue(int(_time.mktime(t1.timetuple())) <= until) |
132 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Account-Container-Count' in account_info) |
133 | 8b5c1106 | Sofia Papagiannaki | self.assertEqual(int(account_info['X-Account-Container-Count']), 3) |
134 | 8b5c1106 | Sofia Papagiannaki | self.assertTrue('X-Account-Bytes-Used' in account_info) |
135 | f3787696 | Sofia Papagiannaki | |
136 | f3787696 | Sofia Papagiannaki | def test_get_account_meta_until_invalid_date(self): |
137 | f3787696 | Sofia Papagiannaki | self.update_account_meta({'quality': 'AAA'}) |
138 | f3787696 | Sofia Papagiannaki | meta = self.get_account_meta(until='-1') |
139 | 6ee6677e | Sofia Papagiannaki | self.assertTrue('Quality' in meta) |
140 | f3787696 | Sofia Papagiannaki | |
141 | f3787696 | Sofia Papagiannaki | |
142 | f3787696 | Sofia Papagiannaki | class AccountGet(PithosAPITest): |
143 | f3787696 | Sofia Papagiannaki | def setUp(self): |
144 | f3787696 | Sofia Papagiannaki | PithosAPITest.setUp(self)
|
145 | f3787696 | Sofia Papagiannaki | cnames = ['apples', 'bananas', 'kiwis', 'oranges', 'pears'] |
146 | f3787696 | Sofia Papagiannaki | |
147 | f3787696 | Sofia Papagiannaki | # create containers
|
148 | f3787696 | Sofia Papagiannaki | uploaded_bytes = 0
|
149 | f3787696 | Sofia Papagiannaki | for cname in cnames: |
150 | f3787696 | Sofia Papagiannaki | self.create_container(cname)
|
151 | f3787696 | Sofia Papagiannaki | |
152 | f3787696 | Sofia Papagiannaki | # upload object
|
153 | f3787696 | Sofia Papagiannaki | name, data, resp = self.upload_object(cname)
|
154 | f3787696 | Sofia Papagiannaki | uploaded_bytes += len(data)
|
155 | f3787696 | Sofia Papagiannaki | |
156 | f3787696 | Sofia Papagiannaki | def test_list(self): |
157 | f3787696 | Sofia Papagiannaki | #list containers: row format
|
158 | f3787696 | Sofia Papagiannaki | containers = self.list_containers(format=None) |
159 | f3787696 | Sofia Papagiannaki | self.assertEquals(containers,
|
160 | f3787696 | Sofia Papagiannaki | ['apples', 'bananas', 'kiwis', 'oranges', 'pears']) |
161 | f3787696 | Sofia Papagiannaki | |
162 | 8b5c1106 | Sofia Papagiannaki | def test_list_until(self): |
163 | 8b5c1106 | Sofia Papagiannaki | account_info = self.get_account_info()
|
164 | 8b5c1106 | Sofia Papagiannaki | t = datetime.datetime.strptime(account_info['Last-Modified'],
|
165 | 8b5c1106 | Sofia Papagiannaki | DATE_FORMATS[2])
|
166 | 8b5c1106 | Sofia Papagiannaki | t1 = t + datetime.timedelta(seconds=1)
|
167 | 8b5c1106 | Sofia Papagiannaki | until = int(_time.mktime(t1.timetuple()))
|
168 | 8b5c1106 | Sofia Papagiannaki | |
169 | 8b5c1106 | Sofia Papagiannaki | _time.sleep(2)
|
170 | 8b5c1106 | Sofia Papagiannaki | |
171 | 8b5c1106 | Sofia Papagiannaki | self.create_container()
|
172 | 8b5c1106 | Sofia Papagiannaki | |
173 | 8b5c1106 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
174 | 8b5c1106 | Sofia Papagiannaki | r = self.get('%s?until=%s' % (url, until)) |
175 | 8b5c1106 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
176 | 8b5c1106 | Sofia Papagiannaki | containers = r.content.split('\n')
|
177 | 8b5c1106 | Sofia Papagiannaki | if '' in containers: |
178 | 8b5c1106 | Sofia Papagiannaki | containers.remove('')
|
179 | 8b5c1106 | Sofia Papagiannaki | self.assertEqual(containers,
|
180 | 8b5c1106 | Sofia Papagiannaki | ['apples', 'bananas', 'kiwis', 'oranges', 'pears']) |
181 | 8b5c1106 | Sofia Papagiannaki | |
182 | 8b5c1106 | Sofia Papagiannaki | |
183 | 8b5c1106 | Sofia Papagiannaki | r = self.get('%s?until=%s&format=json' % (url, until)) |
184 | 8b5c1106 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
185 | 8b5c1106 | Sofia Papagiannaki | try:
|
186 | 8b5c1106 | Sofia Papagiannaki | containers = json.loads(r.content) |
187 | 8b5c1106 | Sofia Papagiannaki | except:
|
188 | 8b5c1106 | Sofia Papagiannaki | self.fail('json format expected') |
189 | 8b5c1106 | Sofia Papagiannaki | self.assertEqual([c['name'] for c in containers], |
190 | 8b5c1106 | Sofia Papagiannaki | ['apples', 'bananas', 'kiwis', 'oranges', 'pears']) |
191 | 8b5c1106 | Sofia Papagiannaki | |
192 | 3a19e99b | Sofia Papagiannaki | def test_list_shared(self): |
193 | 3a19e99b | Sofia Papagiannaki | # upload and publish object
|
194 | 3a19e99b | Sofia Papagiannaki | oname, data, resp = self.upload_object('apples') |
195 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'apples', oname) |
196 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_PUBLIC='true') |
197 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
198 | 3a19e99b | Sofia Papagiannaki | |
199 | 3a19e99b | Sofia Papagiannaki | # upload and share object
|
200 | 3a19e99b | Sofia Papagiannaki | other, data, resp = self.upload_object('bananas') |
201 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user, 'bananas', other) |
202 | 3a19e99b | Sofia Papagiannaki | r = self.post(url, content_type='', HTTP_X_OBJECT_SHARING='read=alice') |
203 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
204 | 3a19e99b | Sofia Papagiannaki | |
205 | 3a19e99b | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
206 | 3a19e99b | Sofia Papagiannaki | |
207 | 3a19e99b | Sofia Papagiannaki | # list shared containers
|
208 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?public=' % url) |
209 | 3a19e99b | Sofia Papagiannaki | objects = r.content.split('\n')
|
210 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
211 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
212 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(objects, ['apples']) |
213 | 3a19e99b | Sofia Papagiannaki | |
214 | 3a19e99b | Sofia Papagiannaki | # list shared containers
|
215 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?shared=' % url) |
216 | 3a19e99b | Sofia Papagiannaki | objects = r.content.split('\n')
|
217 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
218 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
219 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(objects, ['bananas']) |
220 | 3a19e99b | Sofia Papagiannaki | |
221 | 3a19e99b | Sofia Papagiannaki | # list public and shared containers
|
222 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?public=&shared=' % url) |
223 | 3a19e99b | Sofia Papagiannaki | objects = r.content.split('\n')
|
224 | 3a19e99b | Sofia Papagiannaki | if '' in objects: |
225 | 3a19e99b | Sofia Papagiannaki | objects.remove('')
|
226 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(objects, ['apples', 'bananas']) |
227 | 3a19e99b | Sofia Papagiannaki | |
228 | 3a19e99b | Sofia Papagiannaki | # assert forbidden public container listing
|
229 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?public=' % url, user='alice') |
230 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
231 | 3a19e99b | Sofia Papagiannaki | |
232 | 3a19e99b | Sofia Papagiannaki | # assert forbidden shared & public container listing
|
233 | 3a19e99b | Sofia Papagiannaki | r = self.get('%s?public=&shared=' % url, user='alice') |
234 | 3a19e99b | Sofia Papagiannaki | self.assertEqual(r.status_code, 403) |
235 | 3a19e99b | Sofia Papagiannaki | |
236 | f3787696 | Sofia Papagiannaki | def test_list_with_limit(self): |
237 | f3787696 | Sofia Papagiannaki | containers = self.list_containers(format=None, limit=2) |
238 | f3787696 | Sofia Papagiannaki | self.assertEquals(len(containers), 2) |
239 | f3787696 | Sofia Papagiannaki | self.assertEquals(containers, ['apples', 'bananas']) |
240 | f3787696 | Sofia Papagiannaki | |
241 | f3787696 | Sofia Papagiannaki | def test_list_with_marker(self): |
242 | f3787696 | Sofia Papagiannaki | containers = self.list_containers(format=None, limit=2, |
243 | f3787696 | Sofia Papagiannaki | marker='bananas')
|
244 | f3787696 | Sofia Papagiannaki | self.assertEquals(containers, ['kiwis', 'oranges']) |
245 | f3787696 | Sofia Papagiannaki | |
246 | f3787696 | Sofia Papagiannaki | containers = self.list_containers(format=None, limit=2, |
247 | f3787696 | Sofia Papagiannaki | marker='oranges')
|
248 | f3787696 | Sofia Papagiannaki | self.assertEquals(containers, ['pears']) |
249 | f3787696 | Sofia Papagiannaki | |
250 | f3787696 | Sofia Papagiannaki | def test_list_json_with_marker(self): |
251 | f3787696 | Sofia Papagiannaki | containers = self.list_containers(format='json', limit=2, |
252 | f3787696 | Sofia Papagiannaki | marker='bananas')
|
253 | f3787696 | Sofia Papagiannaki | self.assert_extended(containers, 'json', 'container', 2) |
254 | f3787696 | Sofia Papagiannaki | self.assertEqual(containers[0]['name'], 'kiwis') |
255 | f3787696 | Sofia Papagiannaki | self.assertEqual(containers[1]['name'], 'oranges') |
256 | f3787696 | Sofia Papagiannaki | |
257 | f3787696 | Sofia Papagiannaki | containers = self.list_containers(format='json', limit=2, |
258 | f3787696 | Sofia Papagiannaki | marker='oranges')
|
259 | f3787696 | Sofia Papagiannaki | self.assert_extended(containers, 'json', 'container', 1) |
260 | f3787696 | Sofia Papagiannaki | self.assertEqual(containers[0]['name'], 'pears') |
261 | f3787696 | Sofia Papagiannaki | |
262 | f3787696 | Sofia Papagiannaki | def test_list_xml_with_marker(self): |
263 | f3787696 | Sofia Papagiannaki | xml = self.list_containers(format='xml', limit=2, marker='bananas') |
264 | f3787696 | Sofia Papagiannaki | self.assert_extended(xml, 'xml', 'container', 2) |
265 | f3787696 | Sofia Papagiannaki | nodes = xml.getElementsByTagName('name')
|
266 | f3787696 | Sofia Papagiannaki | self.assertTrue(len(nodes) <= 2) |
267 | f3787696 | Sofia Papagiannaki | names = [n.childNodes[0].data for n in nodes] |
268 | f3787696 | Sofia Papagiannaki | self.assertEqual(names, ['kiwis', 'oranges']) |
269 | f3787696 | Sofia Papagiannaki | |
270 | f3787696 | Sofia Papagiannaki | xml = self.list_containers(format='xml', limit=2, marker='oranges') |
271 | f3787696 | Sofia Papagiannaki | self.assert_extended(xml, 'xml', 'container', 1) |
272 | f3787696 | Sofia Papagiannaki | nodes = xml.getElementsByTagName('name')
|
273 | f3787696 | Sofia Papagiannaki | self.assertTrue(len(nodes) <= 2) |
274 | f3787696 | Sofia Papagiannaki | names = [n.childNodes[0].data for n in nodes] |
275 | f3787696 | Sofia Papagiannaki | self.assertEqual(names, ['pears']) |
276 | f3787696 | Sofia Papagiannaki | |
277 | f3787696 | Sofia Papagiannaki | def test_if_modified_since(self): |
278 | f3787696 | Sofia Papagiannaki | account_info = self.get_account_info()
|
279 | f3787696 | Sofia Papagiannaki | last_modified = account_info['Last-Modified']
|
280 | f3787696 | Sofia Papagiannaki | t1 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
281 | f3787696 | Sofia Papagiannaki | t1_formats = map(t1.strftime, DATE_FORMATS)
|
282 | f3787696 | Sofia Papagiannaki | |
283 | f3787696 | Sofia Papagiannaki | # Check not modified
|
284 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
285 | f3787696 | Sofia Papagiannaki | for t in t1_formats: |
286 | d6a92fa0 | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
|
287 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 304) |
288 | f3787696 | Sofia Papagiannaki | |
289 | f3787696 | Sofia Papagiannaki | # modify account: add container
|
290 | f3787696 | Sofia Papagiannaki | _time.sleep(1)
|
291 | f3787696 | Sofia Papagiannaki | self.create_container('c1') |
292 | f3787696 | Sofia Papagiannaki | |
293 | f3787696 | Sofia Papagiannaki | # Check modified
|
294 | f3787696 | Sofia Papagiannaki | for t in t1_formats: |
295 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
|
296 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
297 | f3787696 | Sofia Papagiannaki | self.assertEqual(
|
298 | f3787696 | Sofia Papagiannaki | r.content.split('\n')[:-1], |
299 | f3787696 | Sofia Papagiannaki | ['apples', 'bananas', 'c1', 'kiwis', 'oranges', 'pears']) |
300 | f3787696 | Sofia Papagiannaki | |
301 | f3787696 | Sofia Papagiannaki | account_info = self.get_account_info()
|
302 | f3787696 | Sofia Papagiannaki | last_modified = account_info['Last-Modified']
|
303 | f3787696 | Sofia Papagiannaki | t2 = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
304 | f3787696 | Sofia Papagiannaki | t2_formats = map(t2.strftime, DATE_FORMATS)
|
305 | f3787696 | Sofia Papagiannaki | |
306 | f3787696 | Sofia Papagiannaki | # modify account: update account meta
|
307 | f3787696 | Sofia Papagiannaki | _time.sleep(1)
|
308 | f3787696 | Sofia Papagiannaki | self.update_account_meta({'foo': 'bar'}) |
309 | f3787696 | Sofia Papagiannaki | |
310 | f3787696 | Sofia Papagiannaki | # Check modified
|
311 | f3787696 | Sofia Papagiannaki | for t in t2_formats: |
312 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE=t)
|
313 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
314 | f3787696 | Sofia Papagiannaki | self.assertEqual(
|
315 | f3787696 | Sofia Papagiannaki | r.content.split('\n')[:-1], |
316 | f3787696 | Sofia Papagiannaki | ['apples', 'bananas', 'c1', 'kiwis', 'oranges', 'pears']) |
317 | f3787696 | Sofia Papagiannaki | |
318 | f3787696 | Sofia Papagiannaki | def test_if_modified_since_invalid_date(self): |
319 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
320 | 3a19e99b | Sofia Papagiannaki | r = self.get(url, HTTP_IF_MODIFIED_SINCE='Monday') |
321 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
322 | f3787696 | Sofia Papagiannaki | self.assertEqual(
|
323 | f3787696 | Sofia Papagiannaki | r.content.split('\n')[:-1], |
324 | f3787696 | Sofia Papagiannaki | ['apples', 'bananas', 'kiwis', 'oranges', 'pears']) |
325 | f3787696 | Sofia Papagiannaki | |
326 | f3787696 | Sofia Papagiannaki | def test_if_not_modified_since(self): |
327 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
328 | f3787696 | Sofia Papagiannaki | account_info = self.get_account_info()
|
329 | f3787696 | Sofia Papagiannaki | last_modified = account_info['Last-Modified']
|
330 | f3787696 | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
331 | f3787696 | Sofia Papagiannaki | |
332 | f3787696 | Sofia Papagiannaki | # Check unmodified
|
333 | f3787696 | Sofia Papagiannaki | t1 = t + datetime.timedelta(seconds=1)
|
334 | f3787696 | Sofia Papagiannaki | t1_formats = map(t1.strftime, DATE_FORMATS)
|
335 | f3787696 | Sofia Papagiannaki | for t in t1_formats: |
336 | d6a92fa0 | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
|
337 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
338 | f3787696 | Sofia Papagiannaki | self.assertEqual(
|
339 | f3787696 | Sofia Papagiannaki | r.content.split('\n')[:-1], |
340 | f3787696 | Sofia Papagiannaki | ['apples', 'bananas', 'kiwis', 'oranges', 'pears']) |
341 | f3787696 | Sofia Papagiannaki | |
342 | f3787696 | Sofia Papagiannaki | # modify account: add container
|
343 | f3787696 | Sofia Papagiannaki | _time.sleep(2)
|
344 | f3787696 | Sofia Papagiannaki | self.create_container('c1') |
345 | f3787696 | Sofia Papagiannaki | |
346 | f3787696 | Sofia Papagiannaki | account_info = self.get_account_info()
|
347 | f3787696 | Sofia Papagiannaki | last_modified = account_info['Last-Modified']
|
348 | f3787696 | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
349 | f3787696 | Sofia Papagiannaki | t2 = t - datetime.timedelta(seconds=1)
|
350 | f3787696 | Sofia Papagiannaki | t2_formats = map(t2.strftime, DATE_FORMATS)
|
351 | f3787696 | Sofia Papagiannaki | |
352 | f3787696 | Sofia Papagiannaki | # Check modified
|
353 | f3787696 | Sofia Papagiannaki | for t in t2_formats: |
354 | d6a92fa0 | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
|
355 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 412) |
356 | f3787696 | Sofia Papagiannaki | |
357 | f3787696 | Sofia Papagiannaki | # modify account: update account meta
|
358 | f3787696 | Sofia Papagiannaki | _time.sleep(1)
|
359 | f3787696 | Sofia Papagiannaki | self.update_account_meta({'foo': 'bar'}) |
360 | f3787696 | Sofia Papagiannaki | |
361 | f3787696 | Sofia Papagiannaki | account_info = self.get_account_info()
|
362 | f3787696 | Sofia Papagiannaki | last_modified = account_info['Last-Modified']
|
363 | f3787696 | Sofia Papagiannaki | t = datetime.datetime.strptime(last_modified, DATE_FORMATS[-1])
|
364 | f3787696 | Sofia Papagiannaki | t3 = t - datetime.timedelta(seconds=1)
|
365 | f3787696 | Sofia Papagiannaki | t3_formats = map(t3.strftime, DATE_FORMATS)
|
366 | f3787696 | Sofia Papagiannaki | |
367 | f3787696 | Sofia Papagiannaki | # Check modified
|
368 | f3787696 | Sofia Papagiannaki | for t in t3_formats: |
369 | d6a92fa0 | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE=t)
|
370 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 412) |
371 | f3787696 | Sofia Papagiannaki | |
372 | f3787696 | Sofia Papagiannaki | def test_if_unmodified_since_invalid_date(self): |
373 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
374 | d6a92fa0 | Sofia Papagiannaki | r = self.get(url, HTTP_IF_UNMODIFIED_SINCE='Monday') |
375 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 200) |
376 | f3787696 | Sofia Papagiannaki | self.assertEqual(
|
377 | f3787696 | Sofia Papagiannaki | r.content.split('\n')[:-1], |
378 | f3787696 | Sofia Papagiannaki | ['apples', 'bananas', 'kiwis', 'oranges', 'pears']) |
379 | f3787696 | Sofia Papagiannaki | |
380 | f3787696 | Sofia Papagiannaki | |
381 | f3787696 | Sofia Papagiannaki | class AccountPost(PithosAPITest): |
382 | f3787696 | Sofia Papagiannaki | def setUp(self): |
383 | f3787696 | Sofia Papagiannaki | PithosAPITest.setUp(self)
|
384 | f3787696 | Sofia Papagiannaki | cnames = ['apples', 'bananas', 'kiwis', 'oranges', 'pears'] |
385 | f3787696 | Sofia Papagiannaki | |
386 | f3787696 | Sofia Papagiannaki | # create containers
|
387 | f3787696 | Sofia Papagiannaki | uploaded_bytes = 0
|
388 | f3787696 | Sofia Papagiannaki | for cname in cnames: |
389 | f3787696 | Sofia Papagiannaki | self.create_container(cname)
|
390 | f3787696 | Sofia Papagiannaki | |
391 | f3787696 | Sofia Papagiannaki | # upload object
|
392 | f3787696 | Sofia Papagiannaki | name, data, resp = self.upload_object(cname)
|
393 | f3787696 | Sofia Papagiannaki | uploaded_bytes += len(data)
|
394 | f3787696 | Sofia Papagiannaki | |
395 | f3787696 | Sofia Papagiannaki | # set account meta
|
396 | f3787696 | Sofia Papagiannaki | self.update_account_meta({'foo': 'bar'}) |
397 | f3787696 | Sofia Papagiannaki | |
398 | f3787696 | Sofia Papagiannaki | def test_update_meta(self): |
399 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
400 | f3787696 | Sofia Papagiannaki | with AssertMappingInvariant(self.get_account_groups): |
401 | f3787696 | Sofia Papagiannaki | initial = self.get_account_meta()
|
402 | f3787696 | Sofia Papagiannaki | |
403 | f3787696 | Sofia Papagiannaki | meta = {'test': 'tost', 'ping': 'pong'} |
404 | f3787696 | Sofia Papagiannaki | kwargs = dict(('HTTP_X_ACCOUNT_META_%s' % k, str(v)) |
405 | f3787696 | Sofia Papagiannaki | for k, v in meta.items()) |
406 | d6a92fa0 | Sofia Papagiannaki | r = self.post('%s?update=' % url, **kwargs) |
407 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
408 | f3787696 | Sofia Papagiannaki | |
409 | f3787696 | Sofia Papagiannaki | meta.update(initial) |
410 | f3787696 | Sofia Papagiannaki | account_meta = self.get_account_meta()
|
411 | 6ee6677e | Sofia Papagiannaki | (self.assertTrue(k in account_meta) for k in meta.keys()) |
412 | 6ee6677e | Sofia Papagiannaki | (self.assertEqual(account_meta[k], v) for k, v in meta.items()) |
413 | f3787696 | Sofia Papagiannaki | |
414 | f3787696 | Sofia Papagiannaki | def test_reset_meta(self): |
415 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
416 | f3787696 | Sofia Papagiannaki | with AssertMappingInvariant(self.get_account_groups): |
417 | f3787696 | Sofia Papagiannaki | meta = {'test': 'tost', 'ping': 'pong'} |
418 | f3787696 | Sofia Papagiannaki | self.update_account_meta(meta)
|
419 | f3787696 | Sofia Papagiannaki | |
420 | f3787696 | Sofia Papagiannaki | new_meta = {'test': 'test33'} |
421 | f3787696 | Sofia Papagiannaki | kwargs = dict((
|
422 | f3787696 | Sofia Papagiannaki | 'HTTP_X_ACCOUNT_META_%s' % k, str(v) |
423 | f3787696 | Sofia Papagiannaki | ) for k, v in new_meta.items()) |
424 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, **kwargs)
|
425 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
426 | f3787696 | Sofia Papagiannaki | |
427 | f3787696 | Sofia Papagiannaki | account_meta = self.get_account_meta()
|
428 | 6ee6677e | Sofia Papagiannaki | (self.assertTrue(k in account_meta) for k in new_meta.keys()) |
429 | 6ee6677e | Sofia Papagiannaki | (self.assertEqual(account_meta[k], v) for k, v in new_meta.items()) |
430 | f3787696 | Sofia Papagiannaki | |
431 | 6ee6677e | Sofia Papagiannaki | (self.assertTrue(k not in account_meta) for k in meta.keys()) |
432 | f3787696 | Sofia Papagiannaki | |
433 | f3787696 | Sofia Papagiannaki | def test_delete_meta(self): |
434 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
435 | f3787696 | Sofia Papagiannaki | with AssertMappingInvariant(self.get_account_groups): |
436 | f3787696 | Sofia Papagiannaki | meta = {'test': 'tost', 'ping': 'pong'} |
437 | f3787696 | Sofia Papagiannaki | self.update_account_meta(meta)
|
438 | f3787696 | Sofia Papagiannaki | |
439 | f3787696 | Sofia Papagiannaki | kwargs = dict(
|
440 | f3787696 | Sofia Papagiannaki | ('HTTP_X_ACCOUNT_META_%s' % k, '') for k, v in meta.items()) |
441 | d6a92fa0 | Sofia Papagiannaki | r = self.post('%s?update=' % url, **kwargs) |
442 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
443 | f3787696 | Sofia Papagiannaki | |
444 | f3787696 | Sofia Papagiannaki | account_meta = self.get_account_meta()
|
445 | f3787696 | Sofia Papagiannaki | |
446 | 6ee6677e | Sofia Papagiannaki | (self.assertTrue(k not in account_meta) for k in meta.keys()) |
447 | f3787696 | Sofia Papagiannaki | |
448 | f3787696 | Sofia Papagiannaki | def test_set_account_groups(self): |
449 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
450 | f3787696 | Sofia Papagiannaki | with AssertMappingInvariant(self.get_account_meta): |
451 | f3787696 | Sofia Papagiannaki | pithosdevs = ['verigak', 'gtsouk', 'chazapis'] |
452 | d6a92fa0 | Sofia Papagiannaki | r = self.post('%s?update=' % url, |
453 | d6a92fa0 | Sofia Papagiannaki | HTTP_X_ACCOUNT_GROUP_PITHOSDEV=','.join(pithosdevs))
|
454 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
455 | f3787696 | Sofia Papagiannaki | |
456 | f3787696 | Sofia Papagiannaki | account_groups = self.get_account_groups()
|
457 | 6ee6677e | Sofia Papagiannaki | self.assertTrue('Pithosdev' in self.get_account_groups()) |
458 | 6ee6677e | Sofia Papagiannaki | self.assertEqual(account_groups['Pithosdev'], |
459 | 6ee6677e | Sofia Papagiannaki | ','.join(sorted(pithosdevs))) |
460 | f3787696 | Sofia Papagiannaki | |
461 | f3787696 | Sofia Papagiannaki | clientdevs = ['pkanavos', 'mvasilak'] |
462 | d6a92fa0 | Sofia Papagiannaki | r = self.post('%s?update=' % url, |
463 | d6a92fa0 | Sofia Papagiannaki | HTTP_X_ACCOUNT_GROUP_CLIENTSDEV=','.join(clientdevs))
|
464 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
465 | f3787696 | Sofia Papagiannaki | |
466 | f3787696 | Sofia Papagiannaki | account_groups = self.get_account_groups()
|
467 | 6ee6677e | Sofia Papagiannaki | self.assertTrue('Pithosdev' in account_groups) |
468 | 6ee6677e | Sofia Papagiannaki | self.assertTrue('Clientsdev' in account_groups) |
469 | 6ee6677e | Sofia Papagiannaki | self.assertEqual(account_groups['Pithosdev'], |
470 | 6ee6677e | Sofia Papagiannaki | ','.join(sorted(pithosdevs))) |
471 | 6ee6677e | Sofia Papagiannaki | self.assertEqual(account_groups['Clientsdev'], |
472 | 6ee6677e | Sofia Papagiannaki | ','.join(sorted(clientdevs))) |
473 | f3787696 | Sofia Papagiannaki | |
474 | f3787696 | Sofia Papagiannaki | clientdevs = ['mvasilak']
|
475 | d6a92fa0 | Sofia Papagiannaki | r = self.post('%s?update=' % url, |
476 | d6a92fa0 | Sofia Papagiannaki | HTTP_X_ACCOUNT_GROUP_CLIENTSDEV=''.join(clientdevs))
|
477 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
478 | f3787696 | Sofia Papagiannaki | |
479 | f3787696 | Sofia Papagiannaki | account_groups = self.get_account_groups()
|
480 | 6ee6677e | Sofia Papagiannaki | self.assertTrue('Pithosdev' in account_groups) |
481 | 6ee6677e | Sofia Papagiannaki | self.assertTrue('Clientsdev' in account_groups) |
482 | 6ee6677e | Sofia Papagiannaki | self.assertEqual(account_groups['Pithosdev'], |
483 | 6ee6677e | Sofia Papagiannaki | ','.join(sorted(pithosdevs))) |
484 | 6ee6677e | Sofia Papagiannaki | self.assertEqual(account_groups['Clientsdev'], |
485 | 6ee6677e | Sofia Papagiannaki | ','.join(sorted(clientdevs))) |
486 | f3787696 | Sofia Papagiannaki | |
487 | f3787696 | Sofia Papagiannaki | def test_reset_account_groups(self): |
488 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
489 | f3787696 | Sofia Papagiannaki | with AssertMappingInvariant(self.get_account_meta): |
490 | f3787696 | Sofia Papagiannaki | groups = {'pithosdev': ['verigak', 'gtsouk', 'chazapis'], |
491 | f3787696 | Sofia Papagiannaki | 'clientsdev': ['pkanavos', 'mvasilak']} |
492 | f3787696 | Sofia Papagiannaki | headers = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, ','.join(v)) |
493 | f3787696 | Sofia Papagiannaki | for k, v in groups.iteritems()) |
494 | d6a92fa0 | Sofia Papagiannaki | r = self.post('%s?update=' % url, **headers) |
495 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
496 | f3787696 | Sofia Papagiannaki | |
497 | f3787696 | Sofia Papagiannaki | groups = {'pithosdev': ['verigak', |
498 | f3787696 | Sofia Papagiannaki | 'gtsouk',
|
499 | f3787696 | Sofia Papagiannaki | 'chazapis',
|
500 | f3787696 | Sofia Papagiannaki | 'papagian']}
|
501 | f3787696 | Sofia Papagiannaki | headers = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, ','.join(v)) |
502 | f3787696 | Sofia Papagiannaki | for k, v in groups.iteritems()) |
503 | f3787696 | Sofia Papagiannaki | account_meta = self.get_account_meta()
|
504 | 6ee6677e | Sofia Papagiannaki | headers.update(dict(('HTTP_X_ACCOUNT_META_%s' % |
505 | 6ee6677e | Sofia Papagiannaki | k.upper().replace('-', '_'), v) for |
506 | 6ee6677e | Sofia Papagiannaki | k, v in account_meta.iteritems()))
|
507 | d6a92fa0 | Sofia Papagiannaki | r = self.post(url, **headers)
|
508 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
509 | f3787696 | Sofia Papagiannaki | |
510 | f3787696 | Sofia Papagiannaki | account_groups = self.get_account_groups()
|
511 | 6ee6677e | Sofia Papagiannaki | self.assertTrue('Pithosdev' in account_groups) |
512 | 6ee6677e | Sofia Papagiannaki | self.assertTrue('Clientsdev' not in account_groups) |
513 | 6ee6677e | Sofia Papagiannaki | self.assertEqual(account_groups['Pithosdev'], |
514 | 6ee6677e | Sofia Papagiannaki | ','.join(sorted(groups['pithosdev']))) |
515 | f3787696 | Sofia Papagiannaki | |
516 | f3787696 | Sofia Papagiannaki | def test_delete_account_groups(self): |
517 | d6a92fa0 | Sofia Papagiannaki | url = join_urls(self.pithos_path, self.user) |
518 | f3787696 | Sofia Papagiannaki | with AssertMappingInvariant(self.get_account_meta): |
519 | f3787696 | Sofia Papagiannaki | groups = {'pithosdev': ['verigak', 'gtsouk', 'chazapis'], |
520 | f3787696 | Sofia Papagiannaki | 'clientsdev': ['pkanavos', 'mvasilak']} |
521 | f3787696 | Sofia Papagiannaki | headers = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, ','.join(v)) |
522 | f3787696 | Sofia Papagiannaki | for k, v in groups.iteritems()) |
523 | d6a92fa0 | Sofia Papagiannaki | self.post('%s?update=' % url, **headers) |
524 | f3787696 | Sofia Papagiannaki | |
525 | f3787696 | Sofia Papagiannaki | kwargs = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k, '') |
526 | f3787696 | Sofia Papagiannaki | for k, v in groups.items()) |
527 | d6a92fa0 | Sofia Papagiannaki | r = self.post('%s?update=' % url, **kwargs) |
528 | f3787696 | Sofia Papagiannaki | self.assertEqual(r.status_code, 202) |
529 | f3787696 | Sofia Papagiannaki | |
530 | f3787696 | Sofia Papagiannaki | account_groups = self.get_account_groups()
|
531 | 6ee6677e | Sofia Papagiannaki | self.assertTrue('Pithosdev' not in account_groups) |
532 | 6ee6677e | Sofia Papagiannaki | self.assertTrue('Clientsdev' not in account_groups) |