def test_update_batch_sorting_params_desc_updates_sorting_data(self):
        self.repo.update_batch(
            update_params=types.ParaEntity(email='*****@*****.**'),
            filter_params=types.FilterParams(),
            sorting_params=types.SortingParams(by=('-id', )),
            slicing_params=types.SlicingParams(limit=2),
        )
        items_list = self.repo.get_list(
            sorting_params=types.SortingParams(by=('id', )), )

        self.assertEqual(4, len(items_list))

        self.assertEqual(1, items_list[0].id)
        self.assertEqual('jlennon', items_list[0].username)
        self.assertEqual('*****@*****.**', items_list[0].email)
        self.assertEqual('John', items_list[0].first_name)
        self.assertEqual('Lennon', items_list[0].last_name)

        self.assertEqual(2, items_list[1].id)
        self.assertEqual('pmccartney', items_list[1].username)
        self.assertEqual('*****@*****.**', items_list[1].email)
        self.assertEqual('Paul', items_list[1].first_name)
        self.assertEqual('McCartney', items_list[1].last_name)

        self.assertEqual(3, items_list[2].id)
        self.assertEqual('gharrison', items_list[2].username)
        self.assertEqual('*****@*****.**', items_list[2].email)  # updated
        self.assertEqual('George', items_list[2].first_name)
        self.assertEqual('Harrison', items_list[2].last_name)

        self.assertEqual(4, items_list[3].id)
        self.assertEqual('rstarkey', items_list[3].username)
        self.assertEqual('*****@*****.**', items_list[3].email)  # updated
        self.assertEqual('Richard', items_list[3].first_name)
        self.assertEqual('Starkey', items_list[3].last_name)
    def test_update_batch_returns_none(self):
        result = self.repo.update_batch(
            update_params=types.ParaEntity(email='*****@*****.**'),
            filter_params=types.FilterParams(),
        )

        self.assertIsNone(result)
    def test_get_item_for_existed_id_returns_entity(self):
        item = self.repo.get_item(filter_params=types.FilterParams(id=2))

        self.assertEqual(2, item.id)
        self.assertEqual('pmccartney', item.username)
        self.assertEqual('*****@*****.**', item.email)
        self.assertEqual('Paul', item.first_name)
        self.assertEqual('McCartney', item.last_name)
    def test_get_item_scoping_params_for_existed_id_returns_para_entity(self):
        item = self.repo.get_item(
            filter_params=types.FilterParams(id=2),
            scoping_params=types.ScopingParams(attrs=('id', 'username')),
        )

        self.assertEqual(2, item.id)
        self.assertEqual('pmccartney', item.username)
        self.assertEqual(dataclasses.MISSING, item.email)
        self.assertEqual(dataclasses.MISSING, item.first_name)
        self.assertEqual(dataclasses.MISSING, item.last_name)
    def test_update_list_filtering_does_not_store_data(self):
        self.repo.update_list(items_list=[
            self.entities.User(
                id=2,
                username='******',
                email='*****@*****.**',
                first_name='Stuart',
                last_name='Sutcliffe',
            ),
            self.entities.User(
                id=4,
                username='******',
                email='*****@*****.**',
                first_name='Tommy',
                last_name='Moore',
            ),
        ],
                              filter_params=types.FilterParams(
                                  username__in=['jlennon', 'gharrison']))
        items_list = self.repo.get_list(
            sorting_params=types.SortingParams(by=('id', )), )

        self.assertEqual(4, len(items_list))

        self.assertEqual(1, items_list[0].id)
        self.assertEqual('jlennon', items_list[0].username)
        self.assertEqual('*****@*****.**', items_list[0].email)
        self.assertEqual('John', items_list[0].first_name)
        self.assertEqual('Lennon', items_list[0].last_name)

        self.assertEqual(2, items_list[1].id)
        self.assertEqual('pmccartney', items_list[1].username)
        self.assertEqual('*****@*****.**', items_list[1].email)
        self.assertEqual('Paul', items_list[1].first_name)
        self.assertEqual('McCartney', items_list[1].last_name)

        self.assertEqual(3, items_list[2].id)
        self.assertEqual('gharrison', items_list[2].username)
        self.assertEqual('*****@*****.**', items_list[2].email)
        self.assertEqual('George', items_list[2].first_name)
        self.assertEqual('Harrison', items_list[2].last_name)

        self.assertEqual(4, items_list[3].id)
        self.assertEqual('rstarkey', items_list[3].username)
        self.assertEqual('*****@*****.**', items_list[3].email)
        self.assertEqual('Richard', items_list[3].first_name)
        self.assertEqual('Starkey', items_list[3].last_name)
    def test_get_list_filter_params_returns_filtered_entity_list(self):
        items_list = self.repo.get_list(
            filter_params=types.FilterParams(id__in=[2, 4]), )

        self.assertEqual(2, len(items_list))

        self.assertEqual(2, items_list[0].id)
        self.assertEqual('pmccartney', items_list[0].username)
        self.assertEqual('*****@*****.**', items_list[0].email)
        self.assertEqual('Paul', items_list[0].first_name)
        self.assertEqual('McCartney', items_list[0].last_name)

        self.assertEqual(4, items_list[1].id)
        self.assertEqual('rstarkey', items_list[1].username)
        self.assertEqual('*****@*****.**', items_list[1].email)
        self.assertEqual('Richard', items_list[1].first_name)
        self.assertEqual('Starkey', items_list[1].last_name)
    def test_delete_batch_filter_params_removes_filtered_data(self):
        self.repo.delete_batch(
            filter_params=types.FilterParams(id__in=[2, 4]), )
        items_list = self.repo.get_list(
            sorting_params=types.SortingParams(by=('id', )), )

        self.assertEqual(2, len(items_list))

        self.assertEqual(1, items_list[0].id)
        self.assertEqual('jlennon', items_list[0].username)
        self.assertEqual('*****@*****.**', items_list[0].email)
        self.assertEqual('John', items_list[0].first_name)
        self.assertEqual('Lennon', items_list[0].last_name)

        self.assertEqual(3, items_list[1].id)
        self.assertEqual('gharrison', items_list[1].username)
        self.assertEqual('*****@*****.**', items_list[1].email)
        self.assertEqual('George', items_list[1].first_name)
        self.assertEqual('Harrison', items_list[1].last_name)
    def test_delete_batch_slicing_params_removes_paginated_data(self):
        self.repo.delete_batch(
            filter_params=types.FilterParams(),
            slicing_params=types.SlicingParams(offset=1, limit=2),
        )
        items_list = self.repo.get_list(
            sorting_params=types.SortingParams(by=('id', )), )

        self.assertEqual(2, len(items_list))

        self.assertEqual(1, items_list[0].id)
        self.assertEqual('jlennon', items_list[0].username)
        self.assertEqual('*****@*****.**', items_list[0].email)
        self.assertEqual('John', items_list[0].first_name)
        self.assertEqual('Lennon', items_list[0].last_name)

        self.assertEqual(4, items_list[1].id)
        self.assertEqual('rstarkey', items_list[1].username)
        self.assertEqual('*****@*****.**', items_list[1].email)
        self.assertEqual('Richard', items_list[1].first_name)
        self.assertEqual('Starkey', items_list[1].last_name)
    def test_delete_batch_sorting_params_desc_removes_sorting_data(self):
        self.repo.delete_batch(
            filter_params=types.FilterParams(),
            sorting_params=types.SortingParams(by=('-id', )),
            slicing_params=types.SlicingParams(limit=2),
        )
        items_list = self.repo.get_list(
            sorting_params=types.SortingParams(by=('id', )), )

        self.assertEqual(2, len(items_list))

        self.assertEqual(1, items_list[0].id)
        self.assertEqual('jlennon', items_list[0].username)
        self.assertEqual('*****@*****.**', items_list[0].email)
        self.assertEqual('John', items_list[0].first_name)
        self.assertEqual('Lennon', items_list[0].last_name)

        self.assertEqual(2, items_list[1].id)
        self.assertEqual('pmccartney', items_list[1].username)
        self.assertEqual('*****@*****.**', items_list[1].email)
        self.assertEqual('Paul', items_list[1].first_name)
        self.assertEqual('McCartney', items_list[1].last_name)
    def test_delete_batch_sorting_params_asc_removes_sorting_data(self):
        self.repo.delete_batch(
            filter_params=types.FilterParams(),
            sorting_params=types.SortingParams(by=('id', )),
            slicing_params=types.SlicingParams(limit=2),
        )
        items_list = self.repo.get_list(
            sorting_params=types.SortingParams(by=('id', )), )

        self.assertEqual(2, len(items_list))

        self.assertEqual(3, items_list[0].id)
        self.assertEqual('gharrison', items_list[0].username)
        self.assertEqual('*****@*****.**', items_list[0].email)
        self.assertEqual('George', items_list[0].first_name)
        self.assertEqual('Harrison', items_list[0].last_name)

        self.assertEqual(4, items_list[1].id)
        self.assertEqual('rstarkey', items_list[1].username)
        self.assertEqual('*****@*****.**', items_list[1].email)
        self.assertEqual('Richard', items_list[1].first_name)
        self.assertEqual('Starkey', items_list[1].last_name)
    def test_update_item_partially_filtering_stores_data(self):
        self.repo.update_item(item=self.repo.para_entity_class(
            id=2,
            username='******',
            email='*****@*****.**',
        ),
                              filter_params=types.FilterParams(
                                  username__in=['jlennon', 'pmccartney']))
        items_list = self.repo.get_list(
            sorting_params=types.SortingParams(by=('id', )), )

        self.assertEqual(4, len(items_list))

        self.assertEqual(1, items_list[0].id)
        self.assertEqual('jlennon', items_list[0].username)
        self.assertEqual('*****@*****.**', items_list[0].email)
        self.assertEqual('John', items_list[0].first_name)
        self.assertEqual('Lennon', items_list[0].last_name)

        self.assertEqual(2, items_list[1].id)  # updated partially
        self.assertEqual('stuart', items_list[1].username)
        self.assertEqual('*****@*****.**', items_list[1].email)
        self.assertEqual('Paul', items_list[1].first_name)
        self.assertEqual('McCartney', items_list[1].last_name)

        self.assertEqual(3, items_list[2].id)
        self.assertEqual('gharrison', items_list[2].username)
        self.assertEqual('*****@*****.**', items_list[2].email)
        self.assertEqual('George', items_list[2].first_name)
        self.assertEqual('Harrison', items_list[2].last_name)

        self.assertEqual(4, items_list[3].id)
        self.assertEqual('rstarkey', items_list[3].username)
        self.assertEqual('*****@*****.**', items_list[3].email)
        self.assertEqual('Richard', items_list[3].first_name)
        self.assertEqual('Starkey', items_list[3].last_name)
    def test_delete_batch_no_params_removes_all_data(self):
        self.repo.delete_batch(filter_params=types.FilterParams(), )
        items_list = self.repo.get_list(
            sorting_params=types.SortingParams(by=('id', )), )

        self.assertEqual(0, len(items_list))
    def test_delete_batch_returns_none(self):
        result = self.repo.delete_batch(filter_params=types.FilterParams(), )

        self.assertIsNone(result)
    def test_get_item_for_unknown_id_returns_none(self):
        item = self.repo.get_item(filter_params=types.FilterParams(id=5))

        self.assertIsNone(item)