Example #1
0
    def test_high_lvl_join(self):
        ACL.set_user(ACL.Users.get(username='******'))
        customers = [
            CustomersModel(id=1, name='Will Smith',
                           phone_number='111-222-333'),
            CustomersModel(id=2, name='Tom Hanks', phone_number='999-888-777')
        ]
        self.session.add_all(customers)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        orders = [
            OrdersModel(id=1, customer_id=1, order_date='07-31-1998'),
            OrdersModel(id=2, customer_id=1, order_date='08-31-1998'),
            OrdersModel(id=3, customer_id=2, order_date='07-15-1998'),
            OrdersModel(id=4, customer_id=2, order_date='08-15-1998'),
            OrdersModel(id=5, customer_id=3, order_date='08-28-1998')
        ]
        self.session.add_all(orders)
        self.session.commit()

        client = CustomersModel(id=3, name='James Bond', phone_number='007')
        self.session.add(client)
        self.session.commit()

        result = self.session.query(CustomersModel, OrdersModel).join(
            OrdersModel, CustomersModel.id == OrdersModel.customer_id).all()
        self.assertEqual(result, [(client, orders[4])])
        ACL.unset_user()
Example #2
0
    def test_same_lvl_groupby(self):
        ACL.set_user(ACL.Users.get(username='******'))
        customers = [
            CustomersModel(id=1, name='Will Smith',
                           phone_number='111-222-333'),
            CustomersModel(id=2, name='Tom Hanks', phone_number='999-888-777')
        ]
        self.session.add_all(customers)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        orders = [
            OrdersModel(id=1, customer_id=1, order_date='07-31-1998'),
            OrdersModel(id=2, customer_id=1, order_date='08-31-1998'),
            OrdersModel(id=3, customer_id=2, order_date='07-15-1998'),
            OrdersModel(id=4, customer_id=2, order_date='08-15-1998'),
            OrdersModel(id=5, customer_id=2, order_date='08-28-1998')
        ]
        self.session.add_all(orders)
        self.session.commit()

        result = self.session.query(
            CustomersModel.id, func.count(CustomersModel.id)).join(
                OrdersModel,
                CustomersModel.id == OrdersModel.customer_id).group_by(
                    CustomersModel.id).all()
        self.assertEqual(result, [(1, 2), (2, 3)])
        ACL.unset_user()
Example #3
0
    def test_delete_object_without_select(self):
        # objects associated with root access level
        root_level_objects = [
            ExemplaryModel(id=1,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=2,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=3,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=4,
                           string_field='some_string',
                           integer_field=randrange(100000)),
        ]
        self.session.add_all(root_level_objects)
        self.session.commit()

        ACL.set_user(ACL.Users.get(username='******'))
        # delete object with id = 1
        self.session.query(ExemplaryModel).filter_by(id=1).delete()
        self.session.commit()

        after_deletion = self.session.query(ExemplaryModel).filter(
            ExemplaryModel.id.in_([2, 3, 4]))
        self.assertEqual(set(after_deletion),
                         set(self.session.query(ExemplaryModel).all()))
        ACL.unset_user()
Example #4
0
    def test_delete_object_with_select(self):
        # objects associated with root access level
        root_level_objects = [
            ExemplaryModel(id=1,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=2,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=3,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=4,
                           string_field='some_string',
                           integer_field=randrange(100000)),
        ]
        self.session.add_all(root_level_objects)
        self.session.commit()

        ACL.set_user(ACL.Users.get(username='******'))
        # get first object (object with id = 1)
        object = self.session.query(ExemplaryModel).get(1)
        # delete object and commit changes to database
        self.session.delete(object)
        self.session.commit()

        # create set corresponding to initial list without first object
        after_deletion = set(root_level_objects) - {object}
        # assert with select query result
        self.assertEqual(after_deletion,
                         set(self.session.query(ExemplaryModel).all()))
        ACL.unset_user()
Example #5
0
    def test_same_lvl_aggr(self):
        ACL.set_user(ACL.Users.get(username='******'))
        orders = [
            OrdersModel(id=1, customer_id=1, order_date='07-31-1998'),
            OrdersModel(id=2, customer_id=1, order_date='08-31-1998'),
            OrdersModel(id=3, customer_id=2, order_date='07-15-1998'),
            OrdersModel(id=4, customer_id=2, order_date='08-15-1998'),
            OrdersModel(id=5, customer_id=3, order_date='08-28-1998')
        ]
        self.session.add_all(orders)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        self.assertEqual(
            self.session.query(func.count(OrdersModel.id)).scalar(), 5)
        ACL.unset_user()
Example #6
0
    def test_same_lvl_update(self):
        ACL.set_user(ACL.Users.get(username='******'))
        customers = [
            CustomersModel(id=1, name='Will Smith',
                           phone_number='111-222-333'),
            CustomersModel(id=2, name='Tom Hanks', phone_number='999-888-777')
        ]
        self.session.add_all(customers)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        self.session.query(CustomersModel).filter(
            CustomersModel.id == 1).update({'name': 'Smill With'})
        self.session.commit()

        result = self.session.query(CustomersModel).first()
        self.assertEqual(result.name, 'Smill With')
        ACL.unset_user()
Example #7
0
    def test_high_lvl_having(self):
        ACL.set_user(ACL.Users.get(username='******'))
        orders = [
            OrdersModel(id=1, customer_id=1, order_date='07-31-1998'),
            OrdersModel(id=2, customer_id=1, order_date='08-31-1998'),
            OrdersModel(id=3, customer_id=2, order_date='07-15-1998'),
            OrdersModel(id=4, customer_id=2, order_date='08-15-1998')
        ]
        self.session.add_all(orders)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        orders = [
            OrdersModel(id=5, customer_id=2, order_date='09-15-1998'),
            OrdersModel(id=6, customer_id=2, order_date='10-15-1998'),
        ]
        self.session.add_all(orders)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        query = self.session.query(OrdersModel.customer_id, func.count(OrdersModel.customer_id)).\
                        group_by(OrdersModel.customer_id).having(func.count(OrdersModel.customer_id) > 2).all()
        self.assertEqual(query, [])
        ACL.unset_user()
Example #8
0
    def test_low_lvl_join(self):
        ACL.set_user(ACL.Users.get(username='******'))
        customers = [
            CustomersModel(id=1, name='Will Smith',
                           phone_number='111-222-333'),
            CustomersModel(id=2, name='Tom Hanks', phone_number='999-888-777')
        ]
        self.session.add_all(customers)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        orders = [
            OrdersModel(id=1, customer_id=1, order_date='07-31-1998'),
            OrdersModel(id=2, customer_id=1, order_date='08-31-1998'),
            OrdersModel(id=3, customer_id=2, order_date='07-15-1998'),
            OrdersModel(id=4, customer_id=2, order_date='08-15-1998'),
            OrdersModel(id=5, customer_id=3,
                        order_date='08-28-1998')  # dla zmyły
        ]
        self.session.add_all(orders)
        self.session.commit()

        ACL.set_user(ACL.Users.get(username='******'))
        join = [(customers[0], orders[0]), (customers[0], orders[1]),
                (customers[1], orders[2]), (customers[1], orders[3])]

        result = self.session.query(CustomersModel, OrdersModel).join(
            OrdersModel, CustomersModel.id == OrdersModel.customer_id).all()
        self.assertEqual(result, join)
        ACL.unset_user()
Example #9
0
    def test_authorized_delete(self):
        ACL.set_user(ACL.Users.get(username='******'))

        low_level_objects = [
            ExemplaryModel(id=1,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=2,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=3,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=4,
                           string_field='some_string',
                           integer_field=randrange(100000)),
        ]
        self.session.add_all(low_level_objects)
        self.session.commit()

        ACL.set_user(ACL.Users.get(username='******'))
        object = self.session.query(ExemplaryModel).first()
        self.session.delete(object)
        self.session.commit()

        ACL.unset_user()
        ACL.set_user(ACL.Users.get(username='******'))

        self.assertEqual(
            self.session.query(ExemplaryModel).all(), low_level_objects[1:])
        ACL.unset_user()
Example #10
0
    def test_filter(self):
        root_level_objects = [
            ExemplaryModel(id=1,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=2,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=3,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=4,
                           string_field='some_string',
                           integer_field=randrange(100000)),
        ]
        self.session.add_all(root_level_objects)
        self.session.commit()

        ACL.set_user(ACL.Users.get(username='******'))
        low_level_objects = [
            ExemplaryModel(id=5,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=6,
                           string_field='some_string',
                           integer_field=randrange(100000))
        ]
        self.session.add_all(low_level_objects)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        self.assertEqual(
            self.session.query(ExemplaryModel).filter(
                ExemplaryModel.id > 2).all(), low_level_objects)
        ACL.unset_user()
Example #11
0
    def test_low_lvl_subquery(self):
        ACL.set_user(ACL.Users.get(username='******'))
        customers = [
            CustomersModel(id=1, name='Will Smith',
                           phone_number='111-222-333'),
            CustomersModel(id=2, name='Tom Hanks', phone_number='999-888-777')
        ]
        self.session.add_all(customers)
        self.session.commit()

        orders = [
            OrdersModel(id=1, customer_id=1, order_date='07-31-1998'),
            OrdersModel(id=2, customer_id=1, order_date='08-31-1998'),
            OrdersModel(id=3, customer_id=2, order_date='07-15-1998'),
            OrdersModel(id=4, customer_id=2, order_date='08-15-1998')
        ]

        self.session.add_all(orders)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        orders = [
            OrdersModel(id=5, customer_id=1, order_date='10-31-1998'),
            OrdersModel(id=6, customer_id=2, order_date='10-15-1998'),
        ]
        self.session.add_all(orders)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        subquery = self.session.query(
            OrdersModel.customer_id,
            func.max(OrdersModel.order_date).label('latest_order')).group_by(
                OrdersModel.customer_id).subquery()
        query = self.session.query(
            CustomersModel.name, subquery.c.latest_order).join(
                subquery, CustomersModel.id == subquery.c.customer_id).all()
        self.assertEqual(query, [('Will Smith', '10-31-1998'),
                                 ('Tom Hanks', '10-15-1998')])
        ACL.unset_user()
Example #12
0
    def test_join2(self):
        ACL.set_user(ACL.Users.get(username='******'))
        customers = [
            CustomersModel(id=1, name='Will Smith',
                           phone_number='111-222-333'),
            CustomersModel(id=2, name='Tom Hanks', phone_number='999-888-777')
        ]
        orders = [
            OrdersModel(id=1, customer_id=1, order_date='2021-01-01'),
            OrdersModel(id=2, customer_id=2, order_date='2021-01-01'),
            OrdersModel(id=3, customer_id=1, order_date='2021-01-01')
        ]
        articles = [
            ArticlesModel(id=1, order_id=1, box_id=1, quantity=10),
            ArticlesModel(id=2, order_id=1, box_id=4, quantity=5),
            ArticlesModel(id=3, order_id=2, box_id=2, quantity=20),
            ArticlesModel(id=4, order_id=3, box_id=2, quantity=12),
        ]
        self.session.add_all(customers)
        self.session.commit()
        self.session.add_all(orders)
        self.session.commit()
        self.session.add_all(articles)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        customers = [
            CustomersModel(id=3, name='Mel Gibson', phone_number='444-555-666')
        ]
        orders = [
            OrdersModel(id=4, customer_id=3, order_date='2021-01-01'),
            OrdersModel(id=5, customer_id=3, order_date='2021-01-01'),
            OrdersModel(id=6, customer_id=3, order_date='2021-01-01'),
            OrdersModel(id=7, customer_id=2, order_date='2021-01-01')
        ]
        articles = [
            ArticlesModel(id=5, order_id=4, box_id=1, quantity=10),
            ArticlesModel(id=6, order_id=5, box_id=4, quantity=5),
            ArticlesModel(id=7, order_id=6, box_id=2, quantity=15),
            ArticlesModel(id=8, order_id=7, box_id=2, quantity=100),
        ]
        self.session.add_all(customers)
        self.session.commit()
        self.session.add_all(orders)
        self.session.commit()
        self.session.add_all(articles)
        self.session.commit()
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        result = self.session.query(CustomersModel.name, func.avg(ArticlesModel.quantity)).\
                  join(OrdersModel, CustomersModel.id == OrdersModel.customer_id).\
                  join(ArticlesModel, OrdersModel.id == ArticlesModel.order_id).\
                  group_by(CustomersModel.id).all()
        self.assertEqual(result, [('Will Smith', 9), ('Tom Hanks', 20)])
        ACL.unset_user()

        ACL.set_user(ACL.Users.get(username='******'))
        result = self.session.query(CustomersModel.name, func.avg(ArticlesModel.quantity)).\
                  join(OrdersModel, CustomersModel.id == OrdersModel.customer_id).\
                  join(ArticlesModel, OrdersModel.id == ArticlesModel.order_id).\
                  group_by(CustomersModel.id).all()
        self.assertEqual(result, [('Will Smith', 9), ('Tom Hanks', 60),
                                  ('Mel Gibson', 10)])
        ACL.unset_user()
Example #13
0
    def test_get_objects(self):
        # objects associated with root access level
        root_level_objects = [
            ExemplaryModel(id=1,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=2,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=3,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=4,
                           string_field='some_string',
                           integer_field=randrange(100000)),
        ]
        self.session.add_all(root_level_objects)
        self.session.commit()

        # user at one of lowest access-levels
        some_user = ACL.Users.get(username='******')
        other_level_objects = [
            ExemplaryModel(id=5,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=6,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=7,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=8,
                           string_field='some_string',
                           integer_field=randrange(100000)),
            ExemplaryModel(id=9,
                           string_field='some_string',
                           integer_field=randrange(100000)),
        ]
        ACL.set_user(some_user)
        self.session.add_all(other_level_objects)
        self.session.commit()
        ACL.unset_user()

        # set admin user
        ACL.set_user(ACL.Users.get(username='******'))
        # check if all added entries are accessible for admin (root access-level user)
        self.assertEqual(
            self.session.query(ExemplaryModel).all(),
            root_level_objects + other_level_objects)
        ACL.unset_user()

        # set exemplary user
        ACL.set_user(some_user)
        # check if entries added by exemplary user are accessible for him
        self.assertEqual(
            self.session.query(ExemplaryModel).all(), other_level_objects)
        ACL.unset_user()

        # set other exemplary user at same access-level
        ACL.set_user(ACL.Users.get(username='******'))
        self.assertEqual(
            self.session.query(ExemplaryModel).all(), other_level_objects)
        ACL.unset_user()

        # set other exemplary user at different access-level
        ACL.set_user(ACL.Users.get(username='******'))
        # this user shouldn't have access to any entries
        self.assertEqual(self.session.query(ExemplaryModel).all(), [])
        self.assertNotEqual(self.session.query(ExemplaryModel),
                            other_level_objects)
        ACL.unset_user()
Example #14
0
 def decorated_function(*args, **kwargs):
     credentials = http_auth.current_user()
     ACL.set_user(ACL.Users.get(**credentials))
     response = f(*args, **kwargs)
     ACL.unset_user()
     return response