def test_invalid_query_args(self):
     ref = db.Reference(path='foo')
     with pytest.raises(ValueError):
         db.Query(order_by='$key',
                  client=ref._client,
                  pathurl=ref._add_suffix(),
                  foo='bar')
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
    else:
        return ref.order_by_child(request.param), request.param
 def test_valid_path(self, path, expected):
     ref = db.Reference(path=path)
     fullstr, key, parent = expected
     assert ref.path == fullstr
     assert ref.key == key
     if parent is None:
         assert ref.parent is None
     else:
         assert ref.parent.path == parent
class TestQuery(object):
    """Test cases for db.Query class."""

    valid_paths = {
        'foo' : 'foo',
        'foo/bar' : 'foo/bar',
        'foo/bar/' : 'foo/bar'
    }

    ref = db.Reference(path='foo')

    @pytest.mark.parametrize('path', [
        '', None, '/', '/foo', 0, 1, True, False, dict(), list(), tuple(), _Object(),
        '$foo', '.foo', '#foo', '[foo', 'foo]', '$key', '$value', '$priority'
    ])
    def test_invalid_path(self, path):
        with pytest.raises(ValueError):
            self.ref.order_by_child(path)

    @pytest.mark.parametrize('path, expected', valid_paths.items())
    def test_order_by_valid_path(self, path, expected):
        query = self.ref.order_by_child(path)
        assert query._querystr == 'orderBy="{0}"'.format(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.equal_to(10)
        assert query._querystr == 'equalTo=10&orderBy="{0}"'.format(expected)

    def test_order_by_key(self):
        query = self.ref.order_by_key()
        assert query._querystr == 'orderBy="$key"'

    def test_key_filter(self):
        query = self.ref.order_by_key()
        query.equal_to(10)
        assert query._querystr == 'equalTo=10&orderBy="$key"'

    def test_order_by_value(self):
        query = self.ref.order_by_value()
        assert query._querystr == 'orderBy="$value"'

    def test_value_filter(self):
        query = self.ref.order_by_value()
        query.equal_to(10)
        assert query._querystr == 'equalTo=10&orderBy="$value"'

    def test_multiple_limits(self):
        query = self.ref.order_by_child('foo')
        query.limit_to_first(1)
        with pytest.raises(ValueError):
            query.limit_to_last(2)

        query = self.ref.order_by_child('foo')
        query.limit_to_last(2)
        with pytest.raises(ValueError):
            query.limit_to_first(1)

    @pytest.mark.parametrize('limit', [None, -1, 'foo', 1.2, list(), dict(), tuple(), _Object()])
    def test_invalid_limit(self, limit):
        query = self.ref.order_by_child('foo')
        with pytest.raises(ValueError):
            query.limit_to_first(limit)
        with pytest.raises(ValueError):
            query.limit_to_last(limit)

    def test_start_at_none(self):
        query = self.ref.order_by_child('foo')
        with pytest.raises(ValueError):
            query.start_at(None)

    @pytest.mark.parametrize('arg', ['', 'foo', True, False, 0, 1, dict()])
    def test_valid_start_at(self, arg):
        query = self.ref.order_by_child('foo').start_at(arg)
        assert query._querystr == 'orderBy="foo"&startAt={0}'.format(json.dumps(arg))

    def test_end_at_none(self):
        query = self.ref.order_by_child('foo')
        with pytest.raises(ValueError):
            query.end_at(None)

    @pytest.mark.parametrize('arg', ['', 'foo', True, False, 0, 1, dict()])
    def test_valid_end_at(self, arg):
        query = self.ref.order_by_child('foo').end_at(arg)
        assert query._querystr == 'endAt={0}&orderBy="foo"'.format(json.dumps(arg))

    def test_equal_to_none(self):
        query = self.ref.order_by_child('foo')
        with pytest.raises(ValueError):
            query.equal_to(None)

    @pytest.mark.parametrize('arg', ['', 'foo', True, False, 0, 1, dict()])
    def test_valid_equal_to(self, arg):
        query = self.ref.order_by_child('foo').equal_to(arg)
        assert query._querystr == 'equalTo={0}&orderBy="foo"'.format(json.dumps(arg))

    def test_range_query(self, initquery):
        query, order_by = initquery
        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.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.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.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

    def test_invalid_query_args(self):
        ref = db.Reference(path='foo')
        with pytest.raises(ValueError):
            db.Query(order_by='$key', client=ref._client, pathurl=ref._add_suffix(), foo='bar')
 def test_invalid_child(self, child):
     parent = db.Reference(path='/test')
     with pytest.raises(ValueError):
         parent.child(child)
 def test_valid_child(self, child, expected):
     fullstr, key, parent = expected
     childref = db.Reference(path='/test').child(child)
     assert childref.path == fullstr
     assert childref.key == key
     assert childref.parent.path == parent
 def test_invalid_key(self, path):
     with pytest.raises(ValueError):
         db.Reference(path=path)