8000 refactor tests · rinlevan/firebase-admin-python@8448e26 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8448e26

Browse files
committed
refactor tests
1 parent 3ef2493 commit 8448e26

File tree

2 files changed

+78
-78
lines changed

2 files changed

+78
-78
lines changed

firebase_admin/dynamic_links.py

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,6 @@
2525
from firebase_admin import _utils
2626

2727

28-
_LINKS_ATTRIBUTE = '_dynamic_links'
29-
_LINKS_BASE_URL = 'https://firebasedynamiclinks.googleapis.com/v1/'
30-
31-
_UNKNOWN_ERROR = 'unknown-error'
3228

3329
PLATFORM_DESKTOP = 'desktop'
3430
PLATFORM_IOS = 'ios'
@@ -40,6 +36,24 @@
4036
EVENT_TYPE_APP_FIRST_OPEN = 'app_first_open'
4137
EVENT_TYPE_APP_RE_OPEN = 'app_re_open'
4238

39+
_platforms = {
40+
'DESKTOP': PLATFORM_DESKTOP,
41+
'IOS': PLATFORM_IOS,
42+
'ANDROID': PLATFORM_ANDROID
43+
}
44+
45+
_event_types = {
46+
'CLICK': EVENT_TYPE_CLICK,
47+
'REDIRECT': EVENT_TYPE_REDIRECT,
48+
'APP_INSTALL': EVENT_TYPE_APP_INSTALL,
49+
'APP_FIRST_OPEN': EVENT_TYPE_APP_FIRST_OPEN,
50+
'APP_RE_OPEN': EVENT_TYPE_APP_RE_OPEN
51+
}
52+
53+
_LINKS_ATTRIBUTE =  8000 9;_dynamic_links'
54+
_LINKS_BASE_URL = 'https://firebasedynamiclinks.googleapis.com/v1/'
55+
56+
_UNKNOWN_ERROR = 'unknown-error'
4357
def get_link_stats(short_link, stat_options, app=None):
4458
""" Returns a ``LinkStats`` object with the event statistics for the given short link
4559
@@ -104,41 +118,39 @@ def event_stats(self):
104118
class EventStats(object):
105119
"""``EventStat`` is a single stat item containing (platform, event, count)"""
106120

107-
_platforms = {
108-
'DESKTOP': PLATFORM_DESKTOP,
109-
'IOS': PLATFORM_IOS,
110-
'ANDROID': PLATFORM_ANDROID
111-
}
112-
113-
_event_types = {
114-
'CLICK': EVENT_TYPE_CLICK,
115-
'REDIRECT': EVENT_TYPE_REDIRECT,
116-
'APP_INSTALL': EVENT_TYPE_APP_INSTALL,
117-
'APP_FIRST_OPEN': EVENT_TYPE_APP_FIRST_OPEN,
118-
' 8000 ;APP_RE_OPEN': EVENT_TYPE_APP_RE_OPEN
119-
}
120-
121-
def __init__(self, platform, event, count):
122-
"""Create new instance of EventStats(platform, event, count)"""
123-
if not isinstance(platform, six.string_types) or platform not in self._platforms.values():
121+
def __init__(self, **kwargs):
122+
"""Create new instance of EventStats(platform, event, count)
123+
The input values are the strings returned by the REST call.
124+
The internal values stored in the ``EventStats`` object are
125+
the package constants named at the start of this package."""
126+
required = {'platform', 'event', 'count'}
127+
params = set(kwargs.keys())
128+
missing = required - params
129+
unexpected = params - required
130+
if missing:
131+
raise ValueError('Missing arguments for EventStats: {}'.format(missing))
132+
if unexpected:
133+
raise ValueError('Unexpected arguments for EventStats: {}'.format(unexpected))
134+
135+
platform = kwargs['platform']
136+
if not isinstance(platform, six.string_types) or platform not in _platforms.keys():
124137
raise ValueError('Invalid Platform value "{}".'.format(platform))
125-
self._platform = platform
138+
self._platform = _platforms[platform]
126139

127-
if not isinstance(event, six.string_types) or event not in self._event_types.values():
140+
event = kwargs['event']
141+
if not isinstance(event, six.string_types) or event not in _event_types.keys():
128142
raise ValueError('Invalid Event Type value "{}".'.format(event))
129-
self._event = event
143+
self._event = _event_types[event]
130144

131-
if not isinstance(count, int) or isinstance(count, bool) or count < 0:
132-
raise ValueError('Count: {} must be a non negative int'.format(count))
133-
self._count = count
145+
count = kwargs['count']
146+
if(not ((isinstance(count, six.string_types) # a string
147+
and count.isdigit()) # ... that is made of digits(non negative)
148+
or (not isinstance(count, bool) # bool is confused as an instance of int
149+
and isinstance(count, (int, float)) # number
150+
and count >= 0))): # non negative
151+
raise ValueError('Invalid Count, must be a non negative int, "{}".'.format(count))
152+
self._count = int(count)
134153

135-
@classmethod
136-
def _make_from_strings(cls, platform, event, count):
137-
"""_make_from_strings creates an EventStat object given the appropriate constants. e.g:
138-
_make_from_strings(platform=PLATFORM_DESKTOP, event=EVENT_TYPE_REDIRECT, count=4)"""
139-
return EventStats(cls._platforms[platform],
140-
cls._event_types[event],
141-
int(count))
142154

143155
@property
144156
def platform(self):
@@ -200,7 +212,7 @@ def get_stats(self, short_link, stat_options):
200212
self._handle_error(error)
201213
else:
202214
link_event_stats = resp.get('linkEventStats', [])
203-
event_stats = [EventStats._make_from_strings(**es) for es in link_event_stats]
215+
event_stats = [EventStats(**es) for es in link_event_stats]
204216
return LinkStats(event_stats)
205217

206218
def _handle_error(self, error):

tests/test_dynamic_links.py

Lines changed: 31 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,19 @@
1616
"""Test cases for the firebase_admin.dynamic_links module."""
1717

1818
import json
19+
from itertools import product
1920
import pytest
2021

22+
from tests import testutils
23+
2124
import firebase_admin
2225
from firebase_admin import dynamic_links
2326
from firebase_admin import credentials
2427

25-
from tests import testutils
2628

2729
MOCK_SHORT_URL = 'https://fake1.app.goo.gl/uQWc'
2830
MOCK_GET_STATS_RESPONSE = testutils.resource('get_link_stats.json')
29-
COMPARE_GET_STATS_VALS = testutils.resource('get_link_stats_vals.json')
31+
COMPARE_GET_STATS_JSON = json.loads(testutils.resource('get_link_stats_vals.json'))
3032

3133
MOCK_CREDENTIAL = credentials.Certificate(
3234
testutils.resource_filename('service_account.json'))
@@ -86,8 +88,8 @@ def test_get_stats(self, dynamic_links_test):
8688
for event_stat in link_stats.event_stats:
8789
assert isinstance(event_stat, dynamic_links.EventStats)
8890

89-
assert len(COMPARE_GET_STATS_VALS) == len(link_stats.event_stats)
90-
for (direct, returned) in zip(COMPARE_GET_STATS_VALS, link_stats.event_stats):
91+
assert len(COMPARE_GET_STATS_JSON) == len(link_stats.event_stats)
92+
for (direct, returned) in zip(COMPARE_GET_STATS_JSON, link_stats.event_stats):
9193
assert returned.platform == direct['platform']
9294
assert returned.event == direct['event']
9395
assert returned.count == direct['count']
@@ -127,72 +129,58 @@ def test_get_stats_invalid_duration_days(self, invalid_duration):
127129

128130

129131
class TestEventStats(object):
130-
@pytest.mark.parametrize('platform', dynamic_links.EventStats._platforms.keys())
131-
def test_valid_platform_values(self, platform):
132+
@pytest.mark.parametrize('platform, event',
133+
product(dynamic_links._platforms.keys(),
134+
dynamic_links._event_types.keys()))
135+
def test_valid_platform_values(self, platform, event):
132136
event_stats = dynamic_links.EventStats(
133-
platform=dynamic_links.EventStats._platforms[platform],
134-
event=dynamic_links.EVENT_TYPE_CLICK,
135-
count=1)
136-
assert event_stats.platform == dynamic_links.EventStats._platforms[platform]
137+
platform=platform,
138+
event=event,
139+
count='1')
140+
assert event_stats.platform == dynamic_links._platforms[platform]
141+
assert event_stats.event == dynamic_links._event_types[event]
142+
assert event_stats.count == 1
137143

138144
@pytest.mark.parametrize('arg', INVALID_STRINGS + ['unrecognized'])
139145
def test_invalid_platform_values(self, arg):
140146
with pytest.raises(ValueError) as excinfo:
141147
dynamic_links.EventStats(
142148
platform=arg,
143-
event=dynamic_links.EVENT_TYPE_CLICK,
144-
count=1)
145-
assert 'not recognized' in str(excinfo.value)
149+
event='CLICK',
150+
count='1')
151+
assert 'Invalid Platform value' in str(excinfo.value)
146152

147-
@pytest.mark.parametrize('arg', dynamic_links.EventStats._platforms.keys())
148-
def test_raw_platform_values_invalid(self, arg):
149-
with pytest.raises(ValueError) as excinfo:
150-
dynamic_links.EventStats(
151-
platform=arg,
152-
event=dynamic_links.EVENT_TYPE_CLICK,
153-
count=1)
154-
assert 'Raw string' in str(excinfo.value)
155-
156-
@pytest.mark.parametrize('event', dynamic_links.EventStats._event_types.keys())
153+
@pytest.mark.parametrize('event', dynamic_links._event_types.keys())
157154
def test_valid_event_values(self, event):
158155
event_stats = dynamic_links.EventStats(
159-
platform=dynamic_links.PLATFORM_ANDROID,
160-
event=dynamic_links.EventStats._event_types[event],
161-
count=1)
162-
assert event_stats.event == dynamic_links.EventStats._event_types[event]
156+
platform='ANDROID',
157+
event=event,
158+
count='1')
159+
assert event_stats.event == dynamic_links._event_types[event]
163160

164161
@pytest.mark.parametrize('arg', INVALID_STRINGS + ['unrecognized'])
165162
def test_invalid_event_values(self, arg):
166163
with pytest.raises(ValueError) as excinfo:
167164
dynamic_links.EventStats(
168-
platform=dynamic_links.PLATFORM_ANDROID,
169-
event=arg,
170-
count=1)
171-
assert 'not recognized' in str(excinfo.value)
172-
173-
@pytest.mark.parametrize('arg', dynamic_links.EventStats._event_types.keys())
174-
def test_raw_event_values_invalid(self, arg):
175-
with pytest.raises(ValueError) as excinfo:
176-
dynamic_links.EventStats(
177-
platform=dynamic_links.PLATFORM_ANDROID,
165+
platform='ANDROID',
178166
event=arg,
179-
count=1)
180-
assert 'Raw string' in str(excinfo.value)
167+
count='1')
168+
assert 'Invalid Event Type value' in str(excinfo.value)
181169

182170
@pytest.mark.parametrize('count', [1, 123, 1234])
183171
def test_valid_count_values(self, count):
184172
event_stats = dynamic_links.EventStats(
185-
platform=dynamic_links.PLATFORM_ANDROID,
186-
event=dynamic_links.EVENT_TYPE_CLICK,
173+
platform='ANDROID',
174+
event='CLICK',
187175
count=count)
188176
assert event_stats.count == count
189177

190178
@pytest.mark.parametrize('arg', INVALID_NON_NEGATIVE_NUMS)
191179
def test_invalid_count_values(self, arg):
192180
with pytest.raises(ValueError) as excinfo:
193181
dynamic_links.EventStats(
194-
platform=dynamic_links.PLATFORM_ANDROID,
195-
event=dynamic_links.EVENT_TYPE_CLICK,
182+
platform='ANDROID',
183+
event='CLICK',
196184
count=arg)
197185
assert 'must be a non negative int' in str(excinfo.value)
198186

0 commit comments

Comments
 (0)
0