From a747be048eb7ffa235ef68eadfab2cba8ae47b0b Mon Sep 17 00:00:00 2001 From: Hiranya Jayathilaka Date: Tue, 20 Jun 2017 11:52:46 -0700 Subject: [PATCH] Implementing the API changes proposed in the final review: Removing all support for piorities, Removing App.get_token() from the public API --- firebase_admin/__init__.py | 2 +- firebase_admin/db.py | 77 +++++----------- integration/conftest.py | 2 +- integration/test_db.py | 94 +++++++------------ tests/test_app.py | 6 +- tests/test_db.py | 182 +++++++++++++------------------------ 6 files changed, 125 insertions(+), 238 deletions(-) diff --git a/firebase_admin/__init__.py b/firebase_admin/__init__.py index ed9b11d04..739bb9a52 100644 --- a/firebase_admin/__init__.py +++ b/firebase_admin/__init__.py @@ -198,7 +198,7 @@ def credential(self): def options(self): return self._options - def get_token(self): + def _get_token(self): """Returns an OAuth2 bearer token. This method may return a cached token. But it handles cache invalidation, and therefore diff --git a/firebase_admin/db.py b/firebase_admin/db.py index 4a6d78403..454369a66 100644 --- a/firebase_admin/db.py +++ b/firebase_admin/db.py @@ -35,7 +35,7 @@ _RESERVED_FILTERS = ('$key', '$value', '$priority') -def get_reference(path='/', app=None): +def reference(path='/', app=None): """Returns a database Reference representing the node at the specified path. If no path is specified, this function returns a Reference that represents the database root. @@ -69,7 +69,7 @@ class Reference(object): def __init__(self, **kwargs): """Creates a new Reference using the provided parameters. - This method is for internal use only. Use db.get_reference() to obtain an instance of + This method is for internal use only. Use db.reference() to obtain an instance of Reference. """ self._client = kwargs.get('client') @@ -119,7 +119,7 @@ def child(self, path): full_path = self._pathurl + '/' + path return Reference(client=self._client, path=full_path) - def get_value(self): + def get(self): """Returns the value at the current location of the database. Returns: @@ -130,41 +130,21 @@ def get_value(self): """ return self._client.request('get', self._add_suffix()) - def get_priority(self): - """Returns the priority of this node, if specified. - - Returns: - object: A priority value or None. - - Raises: - ApiCallError: If an error occurs while communicating with the remote database server. - """ - return self._client.request('get', self._add_suffix('/.priority.json')) - - def set_value(self, value, priority=None): + def set(self, value): """Sets the data at this location to the given value. - The value must be JSON-serializable and not None. If a priority is specified, the node will - be assigned that priority along with the value. + The value must be JSON-serializable and not None. Args: value: JSON-serialable value to be set at this location. - priority: A numeric or alphanumeric priority value (optional). Raises: - ValueError: If the value is None or priority is invalid. + ValueError: If the value is None. TypeError: If the value is not JSON-serializable. ApiCallError: If an error occurs while communicating with the remote database server. """ if value is None: raise ValueError('Value must not be None.') - if priority is not None: - Reference._check_priority(priority) - if isinstance(value, dict): - value = dict(value) - value['.priority'] = priority - else: - value = {'.value' : value, '.priority' : priority} params = {'print' : 'silent'} self._client.request_oneway('put', self._add_suffix(), json=value, params=params) @@ -191,7 +171,7 @@ def push(self, value=''): push_id = output.get('name') return self.child(push_id) - def update_children(self, value): + def update(self, value): """Updates the specified child keys of this Reference to the provided values. Args: @@ -257,20 +237,6 @@ def order_by_value(self): """ return Query(order_by='$value', client=self._client, pathurl=self._add_suffix()) - def order_by_priority(self): - """Creates a Query that orderes data by priority. - - Returned Query can be used to set additional parameters, and execute complex database - queries (e.g. limit queries, range queries). Due to a limitation of the - underlying REST API, the order-by-priority constraint can only be enforced during - the execution time of the Query. When the Query returns results, the actual results - will be returned as an unordered collection. - - Returns: - Query: A database Query instance. - """ - return Query(order_by='$priority', client=self._client, pathurl=self._add_suffix()) - def _add_suffix(self, suffix='.json'): return self._pathurl + suffix @@ -294,8 +260,7 @@ class Query(object): the final result is returned by the server as an unordered collection. Therefore the Query interface performs another round of sorting at the client-side before returning the results to the caller. This client-side sorted results are returned to the user as a Python - OrderedDict. However, client-side sorting is not feasible for order-by-priority queries. - Therefore for such queries results are returned as a regular unordered dict. + OrderedDict. """ def __init__(self, **kwargs): @@ -315,7 +280,7 @@ def __init__(self, **kwargs): if kwargs: raise ValueError('Unexpected keyword arguments: {0}'.format(kwargs)) - def set_limit_first(self, limit): + def limit_to_first(self, limit): """Creates a query with limit, and anchors it to the start of the window. Args: @@ -334,7 +299,7 @@ def set_limit_first(self, limit): self._params['limitToFirst'] = limit return self - def set_limit_last(self, limit): + def limit_to_last(self, limit): """Creates a query with limit, and anchors it to the end of the window. Args: @@ -353,7 +318,7 @@ def set_limit_last(self, limit): self._params['limitToLast'] = limit return self - def set_start_at(self, start): + def start_at(self, start): """Sets the lower bound for a range query. The Query will only return child nodes with a value greater than or equal to the specified @@ -373,7 +338,7 @@ def set_start_at(self, start): self._params['startAt'] = json.dumps(start) return self - def set_end_at(self, end): + def end_at(self, end): """Sets the upper bound for a range query. The Query will only return child nodes with a value less than or equal to the specified @@ -393,7 +358,7 @@ def set_end_at(self, end): self._params['endAt'] = json.dumps(end) return self - def set_equal_to(self, value): + def equal_to(self, value): """Sets an equals constraint on the Query. The Query will only return child nodes whose value is equal to the specified value. @@ -419,7 +384,7 @@ def querystr(self): params.append('{0}={1}'.format(key, self._params[key])) return '&'.join(params) - def run(self): + def get(self): """Executes this Query and returns the results. The results will be returned as a sorted list or an OrderedDict, except in the case of @@ -587,18 +552,19 @@ def __init__(self, url=None, auth=None, session=None): @classmethod def from_app(cls, app): """Created a new _Client for a given App""" - url = app.options.get('dbURL') + url = app.options.get('databaseURL') if not url or not isinstance(url, six.string_types): raise ValueError( - 'Invalid dbURL option: "{0}". dbURL must be a non-empty URL string.'.format(url)) + 'Invalid databaseURL option: "{0}". databaseURL must be a non-empty URL ' + 'string.'.format(url)) parsed = urllib.parse.urlparse(url) if parsed.scheme != 'https': raise ValueError( - 'Invalid dbURL option: "{0}". dbURL must be an HTTPS URL.'.format(url)) + 'Invalid databaseURL option: "{0}". databaseURL must be an HTTPS URL.'.format(url)) elif not parsed.netloc.endswith('.firebaseio.com'): raise ValueError( - 'Invalid dbURL option: "{0}". dbURL must be a valid URL to a Firebase Realtime ' - 'Database instance.'.format(url)) + 'Invalid databaseURL option: "{0}". databaseURL must be a valid URL to a ' + 'Firebase Realtime Database instance.'.format(url)) return _Client('https://{0}'.format(parsed.netloc), _OAuth(app), requests.Session()) def request(self, method, urlpath, **kwargs): @@ -668,5 +634,6 @@ def __init__(self, app): self._app = app def __call__(self, req): - req.headers['Authorization'] = 'Bearer {0}'.format(self._app.get_token()) + # pylint: disable=protected-access + req.headers['Authorization'] = 'Bearer {0}'.format(self._app._get_token()) return req diff --git a/integration/conftest.py b/integration/conftest.py index 163ae30ee..a8c1cbf52 100644 --- a/integration/conftest.py +++ b/integration/conftest.py @@ -48,7 +48,7 @@ def default_app(request): if not project_id: raise ValueError('Failed to determine project ID from service account certificate.') cred = credentials.Certificate(cert_path) - ops = {'dbURL' : 'https://{0}.firebaseio.com'.format(project_id)} + ops = {'databaseURL' : 'https://{0}.firebaseio.com'.format(project_id)} return firebase_admin.initialize_app(cred, ops) @pytest.fixture(scope='session') diff --git a/integration/test_db.py b/integration/test_db.py index fd66b2b9b..3e37fb140 100644 --- a/integration/test_db.py +++ b/integration/test_db.py @@ -24,7 +24,7 @@ def _update_rules(): with open(testutils.resource_filename('dinosaurs_index.json')) as index_file: index = json.load(index_file) - client = db.get_reference()._client + client = db.reference()._client rules = client.request('get', '/.settings/rules.json') existing = rules.get('rules', dict()).get('_adminsdk') if existing != index: @@ -47,8 +47,8 @@ def testref(): Reference: A reference to the test dinosaur database. """ _update_rules() - ref = db.get_reference('_adminsdk/python/dinodb') - ref.set_value(testdata()) + ref = db.reference('_adminsdk/python/dinodb') + ref.set(testdata()) return ref @@ -74,22 +74,22 @@ class TestReadOperations(object): """Test cases for reading node values.""" def test_get_value(self, testref, testdata): - value = testref.get_value() + value = testref.get() assert isinstance(value, dict) assert testdata == value def test_get_child_value(self, testref, testdata): - value = testref.child('dinosaurs').get_value() + value = testref.child('dinosaurs').get() assert isinstance(value, dict) assert testdata['dinosaurs'] == value def test_get_grandchild_value(self, testref, testdata): - value = testref.child('dinosaurs').child('lambeosaurus').get_value() + value = testref.child('dinosaurs').child('lambeosaurus').get() assert isinstance(value, dict) assert testdata['dinosaurs']['lambeosaurus'] == value def test_get_nonexisting_child_value(self, testref): - assert testref.child('none_existing').get_value() is None + assert testref.child('none_existing').get() is None class TestWriteOperations(object): @@ -99,62 +99,47 @@ def test_push(self, testref): python = testref.parent ref = python.child('users').push() assert ref.path == '/_adminsdk/python/users/' + ref.key - assert ref.get_value() == '' + assert ref.get() == '' def test_push_with_value(self, testref): python = testref.parent value = {'name' : 'Luis Alvarez', 'since' : 1911} ref = python.child('users').push(value) assert ref.path == '/_adminsdk/python/users/' + ref.key - assert ref.get_value() == value + assert ref.get() == value def test_set_primitive_value(self, testref): python = testref.parent ref = python.child('users').push() - ref.set_value('value') - assert ref.get_value() == 'value' + ref.set('value') + assert ref.get() == 'value' def test_set_complex_value(self, testref): python = testref.parent value = {'name' : 'Mary Anning', 'since' : 1799} ref = python.child('users').push() - ref.set_value(value) - assert ref.get_value() == value - - def test_set_primitive_value_with_priority(self, testref): - python = testref.parent - ref = python.child('users').push() - ref.set_value('value', 1) - assert ref.get_value() == 'value' - assert ref.get_priority() == 1 - - def test_set_complex_value_with_priority(self, testref): - python = testref.parent - value = {'name' : 'Barnum Brown', 'since' : 1873} - ref = python.child('users').push() - ref.set_value(value, 2) - assert ref.get_value() == value - assert ref.get_priority() == 2 + ref.set(value) + assert ref.get() == value def test_update_children(self, testref): python = testref.parent value = {'name' : 'Robert Bakker', 'since' : 1945} ref = python.child('users').push() - ref.update_children(value) - assert ref.get_value() == value + ref.update(value) + assert ref.get() == value def test_update_children_with_existing_values(self, testref): python = testref.parent ref = python.child('users').push({'name' : 'Edwin Colbert', 'since' : 1900}) - ref.update_children({'since' : 1905}) - assert ref.get_value() == {'name' : 'Edwin Colbert', 'since' : 1905} + ref.update({'since' : 1905}) + assert ref.get() == {'name' : 'Edwin Colbert', 'since' : 1905} def test_delete(self, testref): python = testref.parent ref = python.child('users').push('foo') - assert ref.get_value() == 'foo' + assert ref.get() == 'foo' ref.delete() - assert ref.get_value() is None + assert ref.get() is None class TestAdvancedQueries(object): @@ -166,7 +151,7 @@ class TestAdvancedQueries(object): ] def test_order_by_key(self, testref): - value = testref.child('dinosaurs').order_by_key().run() + value = testref.child('dinosaurs').order_by_key().get() assert isinstance(value, collections.OrderedDict) assert list(value.keys()) == [ 'bruhathkayosaurus', 'lambeosaurus', 'linhenykus', @@ -174,77 +159,64 @@ def test_order_by_key(self, testref): ] def test_order_by_value(self, testref): - value = testref.child('scores').order_by_value().run() + value = testref.child('scores').order_by_value().get() assert list(value.keys()) == [ 'stegosaurus', 'lambeosaurus', 'triceratops', 'bruhathkayosaurus', 'linhenykus', 'pterodactyl', ] def test_order_by_child(self, testref): - value = testref.child('dinosaurs').order_by_child('height').run() + value = testref.child('dinosaurs').order_by_child('height').get() assert list(value.keys()) == self.height_sorted def test_limit_first(self, testref): - value = testref.child('dinosaurs').order_by_child('height').set_limit_first(2).run() + value = testref.child('dinosaurs').order_by_child('height').limit_to_first(2).get() assert list(value.keys()) == self.height_sorted[:2] def test_limit_first_all(self, testref): - value = testref.child('dinosaurs').order_by_child('height').set_limit_first(10).run() + value = testref.child('dinosaurs').order_by_child('height').limit_to_first(10).get() assert list(value.keys()) == self.height_sorted def test_limit_last(self, testref): - value = testref.child('dinosaurs').order_by_child('height').set_limit_last(2).run() + value = testref.child('dinosaurs').order_by_child('height').limit_to_last(2).get() assert list(value.keys()) == self.height_sorted[-2:] def test_limit_last_all(self, testref): - value = testref.child('dinosaurs').order_by_child('height').set_limit_last(10).run() + value = testref.child('dinosaurs').order_by_child('height').limit_to_last(10).get() assert list(value.keys()) == self.height_sorted def test_start_at(self, testref): - value = testref.child('dinosaurs').order_by_child('height').set_start_at(3.5).run() + value = testref.child('dinosaurs').order_by_child('height').start_at(3.5).get() assert list(value.keys()) == self.height_sorted[-2:] def test_end_at(self, testref): - value = testref.child('dinosaurs').order_by_child('height').set_end_at(3.5).run() + value = testref.child('dinosaurs').order_by_child('height').end_at(3.5).get() assert list(value.keys()) == self.height_sorted[:4] def test_start_and_end_at(self, testref): value = testref.child('dinosaurs').order_by_child('height') \ - .set_start_at(2.5).set_end_at(5).run() + .start_at(2.5).end_at(5).get() assert list(value.keys()) == self.height_sorted[-3:-1] def test_equal_to(self, testref): - value = testref.child('dinosaurs').order_by_child('height').set_equal_to(0.6).run() + value = testref.child('dinosaurs').order_by_child('height').equal_to(0.6).get() assert list(value.keys()) == self.height_sorted[:2] def test_order_by_nested_child(self, testref): - value = testref.child('dinosaurs').order_by_child('ratings/pos').set_start_at(4).run() + value = testref.child('dinosaurs').order_by_child('ratings/pos').start_at(4).get() assert len(value) == 3 assert 'pterodactyl' in value assert 'stegosaurus' in value assert 'triceratops' in value def test_filter_by_key(self, testref): - value = testref.child('dinosaurs').order_by_key().set_limit_first(2).run() + value = testref.child('dinosaurs').order_by_key().limit_to_first(2).get() assert len(value) == 2 assert 'bruhathkayosaurus' in value assert 'lambeosaurus' in value def test_filter_by_value(self, testref): - value = testref.child('scores').order_by_value().set_limit_last(2).run() + value = testref.child('scores').order_by_value().limit_to_last(2).get() assert len(value) == 2 assert 'pterodactyl' in value assert 'linhenykus' in value - - def test_order_by_priority(self, testref): - python = testref.parent - museums = python.child('museums').push() - values = {'Berlin' : 1, 'Chicago' : 2, 'Brussels' : 3} - for name, priority in values.items(): - ref = museums.push() - ref.set_value(name, priority) - result = museums.order_by_priority().set_limit_last(2).run() - assert isinstance(result, dict) - assert len(result) == 2 - assert 'Brussels' in result.values() - assert 'Chicago' in result.values() diff --git a/tests/test_app.py b/tests/test_app.py index e219ef6d4..dccf9865b 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -166,7 +166,7 @@ def test_get_token(self, init_app): mock_response = {'access_token': 'mock_access_token_1', 'expires_in': 3600} credentials._request = testutils.MockRequest(200, json.dumps(mock_response)) - assert init_app.get_token() == 'mock_access_token_1' + assert init_app._get_token() == 'mock_access_token_1' mock_response = {'access_token': 'mock_access_token_2', 'expires_in': 3600} credentials._request = testutils.MockRequest(200, json.dumps(mock_response)) @@ -175,9 +175,9 @@ def test_get_token(self, init_app): # should return same token from cache firebase_admin._clock = lambda: expiry - datetime.timedelta( seconds=firebase_admin._CLOCK_SKEW_SECONDS + 1) - assert init_app.get_token() == 'mock_access_token_1' + assert init_app._get_token() == 'mock_access_token_1' # should return new token from RPC call firebase_admin._clock = lambda: expiry - datetime.timedelta( seconds=firebase_admin._CLOCK_SKEW_SECONDS) - assert init_app.get_token() == 'mock_access_token_2' + assert init_app._get_token() == 'mock_access_token_2' diff --git a/tests/test_db.py b/tests/test_db.py index f7a0fdf4c..cb6e511be 100644 --- a/tests/test_db.py +++ b/tests/test_db.py @@ -127,7 +127,7 @@ class TestReference(object): @classmethod def setup_class(cls): - firebase_admin.initialize_app(MockCredential(), {'dbURL' : cls.test_url}) + firebase_admin.initialize_app(MockCredential(), {'databaseURL' : cls.test_url}) @classmethod def teardown_class(cls): @@ -141,9 +141,9 @@ def instrument(self, ref, payload, status=200): @pytest.mark.parametrize('data', valid_values) def test_get_value(self, data): - ref = db.get_reference('/test') + ref = db.reference('/test') recorder = self.instrument(ref, json.dumps(data)) - assert ref.get_value() == data + assert ref.get() == data assert len(recorder) == 1 assert recorder[0].method == 'GET' assert recorder[0].url == 'https://test.firebaseio.com/test.json' @@ -151,11 +151,11 @@ def test_get_value(self, data): @pytest.mark.parametrize('data', valid_values) def test_order_by_query(self, data): - ref = db.get_reference('/test') + ref = db.reference('/test') recorder = self.instrument(ref, json.dumps(data)) query = ref.order_by_child('foo') query_str = 'orderBy=%22foo%22' - assert query.run() == data + assert query.get() == data assert len(recorder) == 1 assert recorder[0].method == 'GET' assert recorder[0].url == 'https://test.firebaseio.com/test.json?' + query_str @@ -163,12 +163,12 @@ def test_order_by_query(self, data): @pytest.mark.parametrize('data', valid_values) def test_limit_query(self, data): - ref = db.get_reference('/test') + ref = db.reference('/test') recorder = self.instrument(ref, json.dumps(data)) query = ref.order_by_child('foo') - query.set_limit_first(100) + query.limit_to_first(100) query_str = 'limitToFirst=100&orderBy=%22foo%22' - assert query.run() == data + assert query.get() == data assert len(recorder) == 1 assert recorder[0].method == 'GET' assert recorder[0].url == 'https://test.firebaseio.com/test.json?' + query_str @@ -176,91 +176,50 @@ def test_limit_query(self, data): @pytest.mark.parametrize('data', valid_values) def test_range_query(self, data): - ref = db.get_reference('/test') + ref = db.reference('/test') recorder = self.instrument(ref, json.dumps(data)) query = ref.order_by_child('foo') - query.set_start_at(100) - query.set_end_at(200) + query.start_at(100) + query.end_at(200) query_str = 'endAt=200&orderBy=%22foo%22&startAt=100' - assert query.run() == data + assert query.get() == data assert len(recorder) == 1 assert recorder[0].method == 'GET' assert recorder[0].url == 'https://test.firebaseio.com/test.json?' + query_str assert recorder[0].headers['Authorization'] == 'Bearer mock-token' - def test_get_priority(self): - ref = db.get_reference('/test') - recorder = self.instrument(ref, json.dumps('10')) - assert ref.get_priority() == '10' - assert len(recorder) == 1 - assert recorder[0].method == 'GET' - assert recorder[0].url == 'https://test.firebaseio.com/test/.priority.json' - assert recorder[0].headers['Authorization'] == 'Bearer mock-token' - @pytest.mark.parametrize('data', valid_values) def test_set_value(self, data): - ref = db.get_reference('/test') - recorder = self.instrument(ref, '') - data = {'foo' : 'bar'} - ref.set_value(data) - assert len(recorder) == 1 - assert recorder[0].method == 'PUT' - assert recorder[0].url == 'https://test.firebaseio.com/test.json?print=silent' - assert json.loads(recorder[0].body.decode()) == data - assert recorder[0].headers['Authorization'] == 'Bearer mock-token' - - def test_set_primitive_value_with_priority(self): - ref = db.get_reference('/test') - recorder = self.instrument(ref, '') - ref.set_value('foo', '10') - assert len(recorder) == 1 - assert recorder[0].method == 'PUT' - assert recorder[0].url == 'https://test.firebaseio.com/test.json?print=silent' - assert json.loads(recorder[0].body.decode()) == {'.value' : 'foo', '.priority' : '10'} - assert recorder[0].headers['Authorization'] == 'Bearer mock-token' - - @pytest.mark.parametrize('priority', [10, 10.0, True, False, 'foo', 'foo123']) - def test_set_value_with_priority(self, priority): - ref = db.get_reference('/test') + ref = db.reference('/test') recorder = self.instrument(ref, '') data = {'foo' : 'bar'} - ref.set_value(data, priority) + ref.set(data) assert len(recorder) == 1 assert recorder[0].method == 'PUT' assert recorder[0].url == 'https://test.firebaseio.com/test.json?print=silent' - data['.priority'] = priority assert json.loads(recorder[0].body.decode()) == data assert recorder[0].headers['Authorization'] == 'Bearer mock-token' def test_set_none_value(self): - ref = db.get_reference('/test') + ref = db.reference('/test') self.instrument(ref, '') with pytest.raises(ValueError): - ref.set_value(None) + ref.set(None) @pytest.mark.parametrize('value', [ _Object(), {'foo': _Object()}, [_Object()] ]) def test_set_non_json_value(self, value): - ref = db.get_reference('/test') + ref = db.reference('/test') self.instrument(ref, '') with pytest.raises(TypeError): - ref.set_value(value) - - @pytest.mark.parametrize('priority', [ - '', list(), tuple(), dict(), _Object(), {'foo': _Object()} - ]) - def test_set_invalid_priority(self, priority): - ref = db.get_reference('/test') - self.instrument(ref, '') - with pytest.raises(ValueError): - ref.set_value('', priority) + ref.set(value) def test_update_children(self): - ref = db.get_reference('/test') + ref = db.reference('/test') data = {'foo' : 'bar'} recorder = self.instrument(ref, json.dumps(data)) - ref.update_children(data) + ref.update(data) assert len(recorder) == 1 assert recorder[0].method == 'PATCH' assert recorder[0].url == 'https://test.firebaseio.com/test.json?print=silent' @@ -268,24 +227,24 @@ def test_update_children(self): assert recorder[0].headers['Authorization'] == 'Bearer mock-token' def test_update_children_default(self): - ref = db.get_reference('/test') + ref = db.reference('/test') recorder = self.instrument(ref, '') with pytest.raises(ValueError): - ref.update_children({}) + ref.update({}) assert len(recorder) is 0 @pytest.mark.parametrize('update', [ None, {}, {None:'foo'}, {'foo': None}, '', 'foo', 0, 1, list(), tuple() ]) def test_set_invalid_update(self, update): - ref = db.get_reference('/test') + ref = db.reference('/test') self.instrument(ref, '') with pytest.raises(ValueError): - ref.update_children(update) + ref.update(update) @pytest.mark.parametrize('data', valid_values) def test_push(self, data): - ref = db.get_reference('/test') + ref = db.reference('/test') recorder = self.instrument(ref, json.dumps({'name' : 'testkey'})) child = ref.push(data) assert isinstance(child, db.Reference) @@ -297,7 +256,7 @@ def test_push(self, data): assert recorder[0].headers['Authorization'] == 'Bearer mock-token' def test_push_default(self): - ref = db.get_reference('/test') + ref = db.reference('/test') recorder = self.instrument(ref, json.dumps({'name' : 'testkey'})) assert ref.push().key == 'testkey' assert len(recorder) == 1 @@ -307,13 +266,13 @@ def test_push_default(self): assert recorder[0].headers['Authorization'] == 'Bearer mock-token' def test_push_none_value(self): - ref = db.get_reference('/test') + ref = db.reference('/test') self.instrument(ref, '') with pytest.raises(ValueError): ref.push(None) def test_delete(self): - ref = db.get_reference('/test') + ref = db.reference('/test') recorder = self.instrument(ref, '') ref.delete() assert len(recorder) == 1 @@ -322,13 +281,13 @@ def test_delete(self): assert recorder[0].headers['Authorization'] == 'Bearer mock-token' def test_get_root_reference(self): - ref = db.get_reference() + ref = db.reference() assert ref.key is None assert ref.path == '/' @pytest.mark.parametrize('path, expected', TestReferencePath.valid_paths.items()) def test_get_reference(self, path, expected): - ref = db.get_reference(path) + ref = db.reference(path) fullstr, key, parent = expected assert ref.path == fullstr assert ref.key == key @@ -339,18 +298,18 @@ def test_get_reference(self, path, expected): @pytest.mark.parametrize('error_code', [400, 401, 500]) def test_server_error(self, error_code): - ref = db.get_reference('/test') + ref = db.reference('/test') self.instrument(ref, json.dumps({'error' : 'json error message'}), error_code) with pytest.raises(db.ApiCallError) as excinfo: - ref.get_value() + ref.get() assert 'Reason: json error message' in str(excinfo.value) @pytest.mark.parametrize('error_code', [400, 401, 500]) def test_other_error(self, error_code): - ref = db.get_reference('/test') + ref = db.reference('/test') self.instrument(ref, 'custom error message', error_code) with pytest.raises(db.ApiCallError) as excinfo: - ref.get_value() + ref.get() assert 'Reason: custom error message' in str(excinfo.value) class TestDatabseInitialization(object): @@ -361,19 +320,19 @@ def teardown_method(self): def test_no_app(self): with pytest.raises(ValueError): - db.get_reference() + db.reference() def test_no_db_url(self): firebase_admin.initialize_app(credentials.Base()) with pytest.raises(ValueError): - db.get_reference() + db.reference() @pytest.mark.parametrize('url', [ 'https://test.firebaseio.com', 'https://test.firebaseio.com/' ]) def test_valid_db_url(self, url): - firebase_admin.initialize_app(credentials.Base(), {'dbURL' : url}) - ref = db.get_reference() + firebase_admin.initialize_app(credentials.Base(), {'databaseURL' : url}) + ref = db.reference() assert ref._client._url == 'https://test.firebaseio.com' @pytest.mark.parametrize('url', [ @@ -381,31 +340,29 @@ def test_valid_db_url(self, url): True, False, 1, 0, dict(), list(), tuple(), ]) def test_invalid_db_url(self, url): - firebase_admin.initialize_app(credentials.Base(), {'dbURL' : url}) + firebase_admin.initialize_app(credentials.Base(), {'databaseURL' : url}) with pytest.raises(ValueError): - db.get_reference() + db.reference() def test_app_delete(self): app = firebase_admin.initialize_app( - credentials.Base(), {'dbURL' : 'https://test.firebaseio.com'}) - ref = db.get_reference() + credentials.Base(), {'databaseURL' : 'https://test.firebaseio.com'}) + ref = db.reference() assert ref is not None assert ref._client._auth is not None firebase_admin.delete_app(app) assert ref._client._auth is None with pytest.raises(ValueError): - db.get_reference() + db.reference() -@pytest.fixture(params=['foo', '$key', '$value', '$priority']) +@pytest.fixture(params=['foo', '$key', '$value']) def initquery(request): ref = db.Reference(path='foo') if request.param == '$key': return ref.order_by_key(), request.param elif request.param == '$value': return ref.order_by_value(), request.param - elif request.param == '$priority': - return ref.order_by_priority(), request.param else: return ref.order_by_child(request.param), request.param @@ -437,7 +394,7 @@ def test_order_by_valid_path(self, path, expected): @pytest.mark.parametrize('path, expected', valid_paths.items()) def test_filter_by_valid_path(self, path, expected): query = self.ref.order_by_child(path) - query.set_equal_to(10) + query.equal_to(10) assert query.querystr == 'equalTo=10&orderBy="{0}"'.format(expected) def test_order_by_key(self): @@ -446,7 +403,7 @@ def test_order_by_key(self): def test_key_filter(self): query = self.ref.order_by_key() - query.set_equal_to(10) + query.equal_to(10) assert query.querystr == 'equalTo=10&orderBy="$key"' def test_order_by_value(self): @@ -455,75 +412,66 @@ def test_order_by_value(self): def test_value_filter(self): query = self.ref.order_by_value() - query.set_equal_to(10) + query.equal_to(10) assert query.querystr == 'equalTo=10&orderBy="$value"' - def test_order_by_priority(self): - query = self.ref.order_by_priority() - assert query.querystr == 'orderBy="$priority"' - - def test_priority_filter(self): - query = self.ref.order_by_priority() - query.set_equal_to(10) - assert query.querystr == 'equalTo=10&orderBy="$priority"' - def test_multiple_limits(self): query = self.ref.order_by_child('foo') - query.set_limit_first(1) + query.limit_to_first(1) with pytest.raises(ValueError): - query.set_limit_last(2) + query.limit_to_last(2) query = self.ref.order_by_child('foo') - query.set_limit_last(2) + query.limit_to_last(2) with pytest.raises(ValueError): - query.set_limit_first(1) + query.limit_to_first(1) @pytest.mark.parametrize('limit', [None, -1, 'foo', 1.2, list(), dict(), tuple()]) def test_invalid_limit(self, limit): query = self.ref.order_by_child('foo') with pytest.raises(ValueError): - query.set_limit_first(limit) + query.limit_to_first(limit) with pytest.raises(ValueError): - query.set_limit_last(limit) + query.limit_to_last(limit) def test_start_at_none(self): query = self.ref.order_by_child('foo') with pytest.raises(ValueError): - query.set_start_at(None) + query.start_at(None) def test_end_at_none(self): query = self.ref.order_by_child('foo') with pytest.raises(ValueError): - query.set_end_at(None) + query.end_at(None) def test_equal_to_none(self): query = self.ref.order_by_child('foo') with pytest.raises(ValueError): - query.set_equal_to(None) + query.equal_to(None) def test_range_query(self, initquery): query, order_by = initquery - query.set_start_at(1) - query.set_equal_to(2) - query.set_end_at(3) + query.start_at(1) + query.equal_to(2) + query.end_at(3) assert query.querystr == 'endAt=3&equalTo=2&orderBy="{0}"&startAt=1'.format(order_by) def test_limit_first_query(self, initquery): query, order_by = initquery - query.set_limit_first(1) + query.limit_to_first(1) assert query.querystr == 'limitToFirst=1&orderBy="{0}"'.format(order_by) def test_limit_last_query(self, initquery): query, order_by = initquery - query.set_limit_last(1) + query.limit_to_last(1) assert query.querystr == 'limitToLast=1&orderBy="{0}"'.format(order_by) def test_all_in(self, initquery): query, order_by = initquery - query.set_start_at(1) - query.set_equal_to(2) - query.set_end_at(3) - query.set_limit_first(10) + query.start_at(1) + query.equal_to(2) + query.end_at(3) + query.limit_to_first(10) expected = 'endAt=3&equalTo=2&limitToFirst=10&orderBy="{0}"&startAt=1'.format(order_by) assert query.querystr == expected