8000 Finish NG list resource and add tests · ShowLowTechnology/twilio-python@13c70b3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 13c70b3

Browse files
committed
Finish NG list resource and add tests
1 parent 1891fe4 commit 13c70b3

File tree

2 files changed

+97
-3
lines changed

2 files changed

+97
-3
lines changed

tests/test_base_resource.py

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
# -*- coding: utf-8 -*-
2+
from datetime import datetime
23
import unittest
34

45
from mock import Mock, sentinel, patch, ANY
56
from nose.tools import assert_equal, assert_true
7+
import pytz
68
from six import advance_iterator
79

810
from twilio.rest.resources.imports import json
9-
from twilio.rest.resources import Resource
11+
from twilio.rest.resources import Resource, NextGenListResource, NextGenInstanceResource
1012
from twilio.rest.resources import ListResource
1113
from twilio.rest.resources import InstanceResource
1214

@@ -99,6 +101,48 @@ def testListResourceCreateResponse201(self):
99101
self.r.request.assert_called_with("POST", "https://api.twilio.com/2010-04-01/Resources", data={})
100102

101103

104+
class NextGenListResourceTest(unittest.TestCase):
105+
106+
def setUp(self):
107+
self.r = NextGenListResource(base_uri, auth)
108+
109+
def test_list_resource_init(self):
110+
uri = "%s/%s" % (base_uri, self.r.name)
111+
assert_equal(self.r.uri, uri)
112+
113+
def test_iter_no_key(self):
114+
self.r.request = Mock()
115+
self.r.request.return_value = Mock(), {}
116+
117+
self.assertRaises(StopIteration, advance_iterator, self.r.iter())
118+
119+
def test_iter_key_not_present(self):
120+
self.r.request = Mock()
121+
self.r.request.return_value = Mock(), {'meta': {'key': 'foobars'}}
122+
123+
def test_iter_request(self):
124+
self.r.request = Mock()
125+
self.r.request.return_value = Mock(), {'meta': {'key': 'foos'}, 'foos': [{'sid': '123'}]}
126+
item = advance_iterator(self.r.iter())
127+
self.r.request.assert_called_with("GET", "https://api.twilio.com/2010-04-01/Resources")
128+
assert_equal(item.sid, '123')
129+
130+
def test_iter_one_item(self):
131+
self.r.request = Mock()
132+
self.r.request.return_value = Mock(), {'meta': {'key': 'foos', 'next_page_url': None}, 'foos': [{'sid': '123'}]}
133+
134+
items = self.r.iter()
135+
advance_iterator(items)
136+
137+
self.assertRaises(StopIteration, advance_iterator, items)
138+
139+
def test_instance_loading(self):
140+
instance = self.r.load_instance({"sid": "foo"})
141+
142+
assert_true(isinstance(instance, NextGenInstanceResource))
143+
assert_equal( 8000 instance.sid, "foo")
144+
145+
102146
class testInstanceResourceInit(unittest.TestCase):
103147

104148
def setUp(self):
@@ -142,6 +186,23 @@ def testLoadSubresources(self):
142186
m.assert_called_with(self.r.uri, self.r.auth, self.r.timeout)
143187

144188

189+
class NextGenInstanceResourceTest(unittest.TestCase):
190+
def setUp(self):
191+
self.parent = NextGenListResource(base_uri, auth)
192+
self.r = NextGenInstanceResource(self.parent, "123")
193+
194+
def test_load(self):
195+
self.r.load({"hey": "you"})
196+
assert_equal(self.r.hey, "you")
197+
198+
def test_iso_date_parser(self):
199+
self.r.load({"date_created": "2015-01-01T00:00:00Z"})
200+
assert_equal(
201+
self.r.date_created,
202+
datetime(2015, 1, 1, 0, 0, 0, tzinfo=pytz.utc),
203+
)
204+
205+
145206
class testTimeoutPropagation(unittest.TestCase):
146207
def setUp(self):
147208
self.parent = ListResource(base_uri, auth, timeout=sentinel.timeout)

twilio/rest/resources/base.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,9 @@ def list(self, **kw):
459459

460460
class NextGenListResource(ListResource):
461461

462+
name = "Resources"
463+
instance = NextGenInstanceResource
464+
462465
def __init__(self, *args, **kwargs):
463466
super(NextGenListResource, self).__init__(*args, **kwargs)
464467

@@ -486,12 +489,42 @@ def iter(self, **kwargs):
486489
while True:
487490
resp, page = self.request("GET", url)
488491

489-
if self.key not in page:
492+
key = page.get('meta', {}).get('key')
493+
494+
if key is None or key not in page:
490495
raise StopIteration()
491496

492-
for ir in page[self.key]:
497+
for ir in page[key]:
493498
yield self.load_instance(ir)
494499

495500
url = page.get('meta', {}).get('next_page_url')
496501
if not url:
497502
raise StopIteration()
503+
504+
def get_instances(self, params):
505+
"""
506+
Query the list resource for a list of InstanceResources.
507+
508+
Raises a :exc:`~twilio.TwilioRestException` if requesting a page of
509+
results that does not exist.
510+
511+
:param dict params: List of URL parameters to be included in request
512+
:param int page: The page of results to retrieve (most recent at 0)
513+
:param int page_size: The number of results to be returned.
514+
515+
:returns: -- the list of resources
516+
"""
517+
params = transform_params(params)
518+
519+
resp, page = self.request("GET", self.uri, params=params)
520+
key = page.get('meta', {}).get('key')
521+
522+
if key is None:
523+
raise TwilioException(
524+
"Unable to determine resource key from response"
525+
)
526+
527+
if key not in page:
528+
raise TwilioException("Key %s not present in response" % key)
529+
530+
return [self.load_instance(ir) for ir in page[key]]

0 commit comments

Comments
 (0)
0