def test_filter_no_specs(self, alchemy_db):
        qs = alchemy_db.query(Place)

        backend = SQLAlchemyFilterBackend(qs)
        backend.bind([])

        assert backend.filter() is qs
    def test_filter_no_specs(self, alchemy_db):
        qs = alchemy_db.query(Place)

        backend = SQLAlchemyFilterBackend(qs)
        backend.bind([])

        assert backend.filter() is qs
    def test_filter_already_eagerloaded(self, alchemy_db):
        backend = SQLAlchemyFilterBackend(
            alchemy_db.query(Place).options(joinedload(Place.restaurant).joinedload(Restaurant.waiter_set)),
        )
        backend.bind([
            FilterSpec(['restaurant', 'waiter_set', 'name'], 'exact', 'John', False),
        ])

        filtered = backend.filter()

        sql = six.text_type(filtered)
        assert 'place JOIN one_to_one' not in sql
        assert 'place LEFT OUTER JOIN one_to_one' in sql
    def test_filter_already_eagerloaded(self, alchemy_db):
        backend = SQLAlchemyFilterBackend(
            alchemy_db.query(Place).options(
                joinedload(Place.restaurant).joinedload(
                    Restaurant.waiter_set)), )
        backend.bind([
            FilterSpec(['restaurant', 'waiter_set', 'name'], 'exact', 'John',
                       False),
        ])

        filtered = backend.filter()

        sql = six.text_type(filtered)
        assert 'place JOIN one_to_one' not in sql
        assert 'place LEFT OUTER JOIN one_to_one' in sql
    def test_filter(self, alchemy_db):
        backend = SQLAlchemyFilterBackend(alchemy_db.query(Place))
        backend.bind([
            FilterSpec(["restaurant", "waiter_set", "name"], "exact", "John",
                       False)
        ])

        filtered = backend.filter()

        sql = six.text_type(filtered)
        # eagerloads via outerjoin
        assert "LEFT OUTER JOIN one_to_one_restaurant" not in sql
        assert "LEFT OUTER JOIN one_to_one_waiter" not in sql
        # for filtering via inner join
        assert "JOIN one_to_one_restaurant" in sql
        assert "JOIN one_to_one_waiter" in sql
    def test_filter(self, alchemy_db):
        backend = SQLAlchemyFilterBackend(alchemy_db.query(Place), )
        backend.bind([
            FilterSpec(['restaurant', 'waiter_set', 'name'], 'exact', 'John',
                       False),
        ])

        filtered = backend.filter()

        assert six.text_type(filtered) == (
            'SELECT one_to_one_place.id AS one_to_one_place_id, '
            'one_to_one_place.name AS one_to_one_place_name, '
            'one_to_one_place.address AS one_to_one_place_address \n'
            'FROM one_to_one_place '
            'JOIN one_to_one_restaurant '
            'ON one_to_one_restaurant.place_id = one_to_one_place.id '
            'JOIN one_to_one_waiter '
            'ON one_to_one_waiter.restaurant_id = one_to_one_restaurant.place_id '
            '\nWHERE one_to_one_waiter.name = :name_1')
    def test_filter(self, alchemy_db):
        backend = SQLAlchemyFilterBackend(
            alchemy_db.query(Place),
        )
        backend.bind([
            FilterSpec(['restaurant', 'waiter_set', 'name'], 'exact', 'John', False),
        ])

        filtered = backend.filter()

        assert six.text_type(filtered) == (
            'SELECT one_to_one_place.id AS one_to_one_place_id, '
            'one_to_one_place.name AS one_to_one_place_name, '
            'one_to_one_place.address AS one_to_one_place_address \n'
            'FROM one_to_one_place '
            'JOIN one_to_one_restaurant '
            'ON one_to_one_restaurant.place_id = one_to_one_place.id '
            'JOIN one_to_one_waiter '
            'ON one_to_one_waiter.restaurant_id = one_to_one_restaurant.place_id '
            '\nWHERE one_to_one_waiter.name = :name_1'
        )