Skip to content

Commit 1d08a87

Browse files
committed
Add 'pubsub.api.list_subscriptions'.
1 parent 7c13a99 commit 1d08a87

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

gcloud/pubsub/api.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,49 @@ def list_topics(page_size=None, page_token=None,
5252

5353
path = '/projects/%s/topics' % project
5454
return connection.api_request(method='GET', path=path, query_params=params)
55+
56+
57+
def list_subscriptions(page_size=None, page_token=None, topic_name=None,
58+
project=None, connection=None):
59+
"""List subscriptions for a given project.
60+
61+
:type page_size: int
62+
:param page_size: maximum number of topics to return, If not passed,
63+
defaults to a value set by the API.
64+
65+
:type page_token: string
66+
:param page_token: opaque marker for the next "page" of topics. If not
67+
passed, the API will return the first page of topics.
68+
69+
:type topic_name: string
70+
:param topic_name: limit results to subscriptions bound to the given topic.
71+
72+
:type project: string
73+
:param project: project ID to query. If not passed, defaults to the
74+
project ID inferred from the environment.
75+
76+
:type connection: :class:`gcloud.pubsub.connection.Connection`
77+
:param connection: connection to use for the query. If not passed,
78+
defaults to the connection inferred from the
79+
environment.
80+
81+
:rtype: dict
82+
:returns: keys include ``subscriptions`` (a list of subscription mappings)
83+
and ``nextPageToken`` (a string: if non-empty, indicates that
84+
more topics can be retrieved with another call (pass that
85+
value as ``page_token``).
86+
"""
87+
params = {}
88+
89+
if page_size is not None:
90+
params['pageSize'] = page_size
91+
92+
if page_token is not None:
93+
params['pageToken'] = page_token
94+
95+
if topic_name is None:
96+
path = '/projects/%s/subscriptions' % project
97+
else:
98+
path = '/projects/%s/topics/%s/subscriptions' % (project, topic_name)
99+
100+
return connection.api_request(method='GET', path=path, query_params=params)

gcloud/pubsub/test_api.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,86 @@ def test_w_explicit_connection_w_paging(self):
6161
{'pageSize': SIZE, 'pageToken': TOKEN1})
6262

6363

64+
class Test_list_subscriptions(unittest2.TestCase):
65+
66+
def _callFUT(self, *args, **kw):
67+
from gcloud.pubsub.api import list_subscriptions
68+
return list_subscriptions(*args, **kw)
69+
70+
def test_w_explicit_connection_no_paging(self):
71+
PROJECT = 'PROJECT'
72+
SUB_NAME = 'topic_name'
73+
SUB_PATH = 'projects/%s/subscriptions/%s' % (PROJECT, SUB_NAME)
74+
TOPIC_NAME = 'topic_name'
75+
TOPIC_PATH = 'projects/%s/topics/%s' % (PROJECT, TOPIC_NAME)
76+
TOKEN = 'TOKEN'
77+
returned = {'subscriptions': [{'name': SUB_PATH, 'topic': TOPIC_PATH}],
78+
'nextPageToken': TOKEN}
79+
conn = _Connection(returned)
80+
response = self._callFUT(project=PROJECT, connection=conn)
81+
subscriptions = response['subscriptions']
82+
self.assertEqual(len(subscriptions), 1)
83+
self.assertEqual(subscriptions[0],
84+
{'name': SUB_PATH, 'topic': TOPIC_PATH})
85+
self.assertEqual(response['nextPageToken'], TOKEN)
86+
self.assertEqual(len(conn._requested), 1)
87+
req = conn._requested[0]
88+
self.assertEqual(req['method'], 'GET')
89+
self.assertEqual(req['path'], '/projects/%s/subscriptions' % PROJECT)
90+
self.assertEqual(req['query_params'], {})
91+
92+
def test_w_explicit_connection_w_paging(self):
93+
PROJECT = 'PROJECT'
94+
SUB_NAME = 'topic_name'
95+
SUB_PATH = 'projects/%s/subscriptions/%s' % (PROJECT, SUB_NAME)
96+
TOPIC_NAME = 'topic_name'
97+
TOPIC_PATH = 'projects/%s/topics/%s' % (PROJECT, TOPIC_NAME)
98+
TOKEN1 = 'TOKEN1'
99+
TOKEN2 = 'TOKEN2'
100+
SIZE = 1
101+
returned = {'subscriptions': [{'name': SUB_PATH, 'topic': TOPIC_PATH}],
102+
'nextPageToken': TOKEN2}
103+
conn = _Connection(returned)
104+
response = self._callFUT(SIZE, TOKEN1,
105+
project=PROJECT, connection=conn)
106+
subscriptions = response['subscriptions']
107+
self.assertEqual(len(subscriptions), 1)
108+
self.assertEqual(subscriptions[0],
109+
{'name': SUB_PATH, 'topic': TOPIC_PATH})
110+
self.assertEqual(response['nextPageToken'], TOKEN2)
111+
self.assertEqual(len(conn._requested), 1)
112+
req = conn._requested[0]
113+
self.assertEqual(req['method'], 'GET')
114+
self.assertEqual(req['path'], '/projects/%s/subscriptions' % PROJECT)
115+
self.assertEqual(req['query_params'],
116+
{'pageSize': SIZE, 'pageToken': TOKEN1})
117+
118+
def test_w_topic_name(self):
119+
PROJECT = 'PROJECT'
120+
SUB_NAME = 'topic_name'
121+
SUB_PATH = 'projects/%s/subscriptions/%s' % (PROJECT, SUB_NAME)
122+
TOPIC_NAME = 'topic_name'
123+
TOPIC_PATH = 'projects/%s/topics/%s' % (PROJECT, TOPIC_NAME)
124+
TOKEN = 'TOKEN'
125+
returned = {'subscriptions': [{'name': SUB_PATH, 'topic': TOPIC_PATH}],
126+
'nextPageToken': TOKEN}
127+
conn = _Connection(returned)
128+
response = self._callFUT(topic_name=TOPIC_NAME,
129+
project=PROJECT, connection=conn)
130+
subscriptions = response['subscriptions']
131+
self.assertEqual(len(subscriptions), 1)
132+
self.assertEqual(subscriptions[0],
133+
{'name': SUB_PATH, 'topic': TOPIC_PATH})
134+
self.assertEqual(response['nextPageToken'], TOKEN)
135+
self.assertEqual(len(conn._requested), 1)
136+
req = conn._requested[0]
137+
self.assertEqual(req['method'], 'GET')
138+
self.assertEqual(req['path'],
139+
'/projects/%s/topics/%s/subscriptions'
140+
% (PROJECT, TOPIC_NAME))
141+
self.assertEqual(req['query_params'], {})
142+
143+
64144
class _Connection(object):
65145

66146
def __init__(self, *responses):

0 commit comments

Comments
 (0)