source: OpenRLabs-Git/deploy/rlabs-docker/web2py-rlabs/gluon/packages/dal/tests/restapi.py

main
Last change on this file was 42bd667, checked in by David Fuertes <dfuertes@…>, 4 years ago

Historial Limpio

  • Property mode set to 100755
File size: 13.7 KB
Line 
1import unittest
2
3from pydal import DAL, Field
4from pydal.validators import IS_NOT_IN_DB
5from pydal.restapi import RestAPI, ALLOW_ALL_POLICY, DENY_ALL_POLICY, __version__
6
7
8class TestRestAPI(unittest.TestCase):
9    def setUp(self):
10        db = DAL("sqlite:memory")
11
12        db.define_table("color", Field("name", requires=IS_NOT_IN_DB(db, "color.name")))
13        db.color.insert(name="red")
14        db.color.insert(name="green")
15        db.color.insert(name="blue")
16
17        db.define_table("thing", Field("name"), Field("color", "reference color"))
18        db.thing.insert(name="Chair", color=1)
19        db.thing.insert(name="Chair", color=2)
20        db.thing.insert(name="Table", color=1)
21        db.thing.insert(name="Table", color=3)
22        db.thing.insert(name="Lamp", color=2)
23
24        db.define_table(
25            "rel",
26            Field("a", "reference thing"),
27            Field("desc"),
28            Field("b", "reference thing"),
29        )
30        db.rel.insert(a=1, b=2, desc="is like")
31        db.rel.insert(a=3, b=4, desc="is like")
32        db.rel.insert(a=1, b=3, desc="is under")
33        db.rel.insert(a=2, b=4, desc="is under")
34        db.rel.insert(a=5, b=4, desc="is above")
35
36        api = RestAPI(db, ALLOW_ALL_POLICY)
37
38        self.db = db
39        self.api = api
40
41    def test_search(self):
42        api = self.api
43        api.policy = ALLOW_ALL_POLICY
44
45        self.assertEqual(
46            api.search("rel", {"@limit": 0, "@model": "true"}),
47            {
48                "items": [],
49                "count": 5,
50                "model": [
51                    {
52                        "name": "id",
53                        "label": "Id",
54                        "default": None,
55                        "type": "id",
56                        "regex": "[1-9]\\d*",
57                        "required": False,
58                        "unique": False,
59                        "post_writable": True,
60                        "put_writable": True,
61                        "options": None,
62                        "referenced_by": [],
63                    },
64                    {
65                        "name": "a",
66                        "label": "A",
67                        "default": None,
68                        "type": "reference",
69                        "references": "thing",
70                        "regex": None,
71                        "required": False,
72                        "unique": False,
73                        "post_writable": True,
74                        "put_writable": True,
75                        "options": None,
76                    },
77                    {
78                        "name": "desc",
79                        "label": "Desc",
80                        "default": None,
81                        "type": "string",
82                        "regex": None,
83                        "required": False,
84                        "unique": False,
85                        "post_writable": True,
86                        "put_writable": True,
87                        "options": None,
88                    },
89                    {
90                        "name": "b",
91                        "label": "B",
92                        "default": None,
93                        "type": "reference",
94                        "references": "thing",
95                        "regex": None,
96                        "required": False,
97                        "unique": False,
98                        "post_writable": True,
99                        "put_writable": True,
100                        "options": None,
101                    },
102                ],
103            },
104        )
105        self.assertEqual(
106            api.search("color", {"name.eq": "red"}),
107            {"count": 1, "items": [{"id": 1, "name": "red"}]},
108        )
109        self.assertEqual(
110            api.search("thing", {"name.eq": "Chair"}),
111            {
112                "count": 2,
113                "items": [
114                    {"name": "Chair", "color": 1, "id": 1},
115                    {"name": "Chair", "color": 2, "id": 2},
116                ],
117            },
118        )
119        self.assertEqual(
120            api.search("rel[a,b]", {"desc.eq": "is like"}),
121            {"count": 2, "items": [{"b": 2, "a": 1}, {"b": 4, "a": 3}]},
122        )
123        self.assertEqual(
124            api.search("thing[name]", {"color.name.eq": "red"}),
125            {"count": 2, "items": [{"name": "Chair"}, {"name": "Table"}]},
126        )
127        self.assertEqual(
128            api.search("thing[name]", {"not.color.name.eq": "red"}),
129            {
130                "count": 3,
131                "items": [{"name": "Chair"}, {"name": "Table"}, {"name": "Lamp"}],
132            },
133        )
134        self.assertEqual(
135            api.search("thing[name]", {"a.rel.desc": "is above"}),
136            {"count": 1, "items": [{"name": "Lamp"}]},
137        )
138        self.assertEqual(
139            api.search("thing[name]", {"a.rel.b.name": "Table"}),
140            {
141                "count": 4,
142                "items": [
143                    {"name": "Chair"},
144                    {"name": "Chair"},
145                    {"name": "Table"},
146                    {"name": "Lamp"},
147                ],
148            },
149        )
150        self.assertEqual(
151            api.search(
152                "thing[name]", {"a.rel.b.name": "Table", "a.rel.desc": "is above"}
153            ),
154            {"count": 1, "items": [{"name": "Lamp"}]},
155        )
156        self.assertEqual(
157            api.search("thing", {"@lookup": "color"}),
158            {
159                "count": 5,
160                "items": [
161                    {"name": "Chair", "color": {"name": "red", "id": 1}, "id": 1},
162                    {"name": "Chair", "color": {"name": "green", "id": 2}, "id": 2},
163                    {"name": "Table", "color": {"name": "red", "id": 1}, "id": 3},
164                    {"name": "Table", "color": {"name": "blue", "id": 3}, "id": 4},
165                    {"name": "Lamp", "color": {"name": "green", "id": 2}, "id": 5},
166                ],
167            },
168        )
169        self.assertEqual(
170            api.search("thing", {"@lookup": "color[name]"}),
171            {
172                "count": 5,
173                "items": [
174                    {"name": "Chair", "color": {"name": "red"}, "id": 1},
175                    {"name": "Chair", "color": {"name": "green"}, "id": 2},
176                    {"name": "Table", "color": {"name": "red"}, "id": 3},
177                    {"name": "Table", "color": {"name": "blue"}, "id": 4},
178                    {"name": "Lamp", "color": {"name": "green"}, "id": 5},
179                ],
180            },
181        )
182        self.assertEqual(
183            api.search("thing", {"@lookup": "color!:color[name]"}),
184            {
185                "count": 5,
186                "items": [
187                    {"name": "Chair", "color_name": "red", "id": 1},
188                    {"name": "Chair", "color_name": "green", "id": 2},
189                    {"name": "Table", "color_name": "red", "id": 3},
190                    {"name": "Table", "color_name": "blue", "id": 4},
191                    {"name": "Lamp", "color_name": "green", "id": 5},
192                ],
193            },
194        )
195        self.assertEqual(
196            api.search("thing", {"@lookup": "related:a.rel[desc]"}),
197            {
198                "count": 5,
199                "items": [
200                    {
201                        "name": "Chair",
202                        "related": [{"desc": "is like"}, {"desc": "is under"}],
203                        "color": 1,
204                        "id": 1,
205                    },
206                    {
207                        "name": "Chair",
208                        "related": [{"desc": "is under"}],
209                        "color": 2,
210                        "id": 2,
211                    },
212                    {
213                        "name": "Table",
214                        "related": [{"desc": "is like"}],
215                        "color": 1,
216                        "id": 3,
217                    },
218                    {"name": "Table", "related": [], "color": 3, "id": 4},
219                    {
220                        "name": "Lamp",
221                        "related": [{"desc": "is above"}],
222                        "color": 2,
223                        "id": 5,
224                    },
225                ],
226            },
227        )
228        self.assertEqual(
229            api.search("thing", {"@lookup": "related:a.rel[desc].b[name]"}),
230            {
231                "count": 5,
232                "items": [
233                    {
234                        "name": "Chair",
235                        "related": [
236                            {"b": {"name": "Chair"}, "desc": "is like"},
237                            {"b": {"name": "Table"}, "desc": "is under"},
238                        ],
239                        "color": 1,
240                        "id": 1,
241                    },
242                    {
243                        "name": "Chair",
244                        "related": [{"b": {"name": "Table"}, "desc": "is under"}],
245                        "color": 2,
246                        "id": 2,
247                    },
248                    {
249                        "name": "Table",
250                        "related": [{"b": {"name": "Table"}, "desc": "is like"}],
251                        "color": 1,
252                        "id": 3,
253                    },
254                    {"name": "Table", "related": [], "color": 3, "id": 4},
255                    {
256                        "name": "Lamp",
257                        "related": [{"b": {"name": "Table"}, "desc": "is above"}],
258                        "color": 2,
259                        "id": 5,
260                    },
261                ],
262            },
263        )
264        self.assertEqual(
265            api.search(
266                "thing",
267                {
268                    "@lookup": "color[name],related:a.rel[desc].b[name]",
269                    "@offset": 1,
270                    "@limit": 2,
271                },
272            ),
273            {
274                "items": [
275                    {
276                        "name": "Chair",
277                        "related": [{"b": {"name": "Table"}, "desc": "is under"}],
278                        "color": {"name": "green"},
279                        "id": 2,
280                    },
281                    {
282                        "name": "Table",
283                        "related": [{"b": {"name": "Table"}, "desc": "is like"}],
284                        "color": {"name": "red"},
285                        "id": 3,
286                    },
287                ]
288            },
289        )
290        self.assertEqual(
291            api.search(
292                "thing",
293                {
294                    "@lookup": "color[name],related!:a.rel[desc].b[name]",
295                    "@offset": 1,
296                    "@limit": 2,
297                },
298            ),
299            {
300                "items": [
301                    {
302                        "name": "Chair",
303                        "related": [{"name": "Table", "desc": "is under"}],
304                        "color": {"name": "green"},
305                        "id": 2,
306                    },
307                    {
308                        "name": "Table",
309                        "related": [{"name": "Table", "desc": "is like"}],
310                        "color": {"name": "red"},
311                        "id": 3,
312                    },
313                ]
314            },
315        )
316        self.assertEqual(
317            api.search("color", {"name.contains": "ee"}),
318            {"count": 1, "items": [{"id": 2, "name": "green"}]},
319        )
320        self.assertEqual(
321            api.search("color", {"name.in": "blue,green"}),
322            {
323                "count": 2,
324                "items": [{"id": 2, "name": "green"}, {"id": 3, "name": "blue"}],
325            },
326        )
327
328    def test_REST(self):
329
330        api = self.api
331        api.policy = ALLOW_ALL_POLICY
332
333        response = api("GET", "color", None, {"name.eq": "red"})
334        del response["timestamp"]
335        self.assertEqual(
336            response,
337            {
338                "count": 1,
339                "status": "success",
340                "code": 200,
341                "items": [{"id": 1, "name": "red"}],
342                "api_version": __version__,
343            },
344        )
345        response = api("POST", "color", post_vars={"name": "magenta"})
346        del response["timestamp"]
347        self.assertEqual(
348            response,
349            {
350                "status": "success",
351                "errors": {},
352                "code": 200,
353                "id": 4,
354                "api_version": __version__,
355            },
356        )
357        response = api("POST", "color", post_vars={"name": "magenta"})
358        del response["timestamp"]
359        self.assertEqual(
360            response,
361            {
362                "status": "error",
363                "errors": {"name": "Value already in database or empty"},
364                "code": 422,
365                "message": "Validation Errors",
366                "id": None,
367                "api_version": __version__,
368            },
369        )
370        response = api("PUT", "color", 4, post_vars={"name": "Magenta"})
371        del response["timestamp"]
372        self.assertEqual(
373            response,
374            {
375                "status": "success",
376                "updated": 1,
377                "errors": {},
378                "code": 200,
379                "api_version": "0.1",
380                "id": 4,
381            },
382        )
383        response = api("DELETE", "color", 4)
384        del response["timestamp"]
385        self.assertEqual(
386            response,
387            {"deleted": 1, "status": "success", "code": 200, "api_version": "0.1"},
388        )
389
390    def test_policies(self):
391
392        api = self.api
393        api.policy = DENY_ALL_POLICY
394
395        response = api("GET", "color", None, {"name.eq": "red"})
396        del response["timestamp"]
397        self.assertEqual(
398            response,
399            {
400                "status": "error",
401                "message": "No policy for this object",
402                "code": 401,
403                "api_version": __version__,
404            },
405        )
Note: See TracBrowser for help on using the repository browser.