def test_fetch_group_wall_before(self): # TODO: finish test group = GroupFactory(remote_id=34384434, screen_name='topmelody') before = datetime(2013, 10, 3) after = datetime(2013, 10, 1) posts = group.fetch_posts(all=True, before=before, after=after, filter='owner')
def test_fetch_group_wall_before(self): # TODO: finish test group = GroupFactory(remote_id=34384434, screen_name='topmelody') before = datetime(2013, 10, 3) after = datetime(2013, 10, 1) posts = group.fetch_posts(all=True, before=before, after=after, filter='owner')
def test_fetch_group_members(self): from odnoklassniki_users.models import User group = GroupFactory(id=GROUP_OPEN_ID) self.assertEqual(User.objects.count(), 0) users = group.update_users() self.assertTrue(group.members_count > 1100) self.assertEqual(group.members_count, User.objects.count()) self.assertEqual(group.members_count, users.count()) self.assertEqual(group.members_count, group.users.count())
def test_fetch_group_open_wall(self): group = GroupFactory(remote_id=OPEN_WALL_GROUP_ID, screen_name=OPEN_WALL_GROUP_SCREEN_NAME) self.assertEqual(Post.objects.count(), 0) self.assertEqual(User.objects.count(), 0) count = 10 posts = group.fetch_posts(own=0, count=count, extended=1) self.assertEqual(len(posts), count) self.assertEqual(Post.objects.count(), count) self.assertTrue(User.objects.count() > 0) self.assertTrue(Post.objects.exclude(author_id=None).count() > 0)
def test_fetch_group_open_wall(self): group = GroupFactory(remote_id=OPEN_WALL_GROUP_ID, screen_name=OPEN_WALL_GROUP_SCREEN_NAME) self.assertEqual(Post.objects.count(), 0) self.assertEqual(User.objects.count(), 0) count = 10 posts = group.fetch_posts(own=0, count=count, extended=1) self.assertEqual(len(posts), count) self.assertEqual(Post.objects.count(), count) self.assertTrue(User.objects.count() > 0) self.assertTrue(Post.objects.exclude(author_id=None).count() > 0)
def test_parse_comments(self): response = '''{"response":[6, {"cid":2505,"uid":16271479,"date":1298365200,"text":"Добрый день , кароче такая идея когда опросы создаешь вместо статуса - можно выбрать аудитории опрашиваемых, например только женский или мужской пол могут участвовать (то бишь голосовать в опросе)."}, {"cid":2507,"uid":16271479,"date":1286105582,"text":"Это уже не практично, имхо.<br>Для этого делайте группу и там опрос, а в группу принимайте тех, кого нужно.","reply_to_uid":16271479,"reply_to_cid":2505}, {"cid":2547,"uid":2943,"date":1286218080,"text":"Он будет только для групп благотворительных организаций."}]} ''' group = GroupFactory.create(remote_id=OWNER_ID) post = PostFactory.create(remote_id=TR_POST_ID, wall_owner=group) instance = CommentFactory.create(post=post) author = UserFactory.create(remote_id=16271479) instance.parse(json.loads(response)['response'][1]) instance.save() self.assertEqual(instance.remote_id, '201164356_2505') self.assertEqual(instance.text, u'Добрый день , кароче такая идея когда опросы создаешь вместо статуса - можно выбрать аудитории опрашиваемых, например только женский или мужской пол могут участвовать (то бишь голосовать в опросе).') self.assertEqual(instance.author, author) self.assertTrue(isinstance(instance.date, datetime)) instance = Comment(post=post) instance.parse(json.loads(response)['response'][2]) instance.save() self.assertEqual(instance.remote_id, '201164356_2507') self.assertEqual(instance.reply_for.remote_id, 16271479)
def test_fetch_group_wall(self): group = GroupFactory.create(remote_id=GROUP_ID, screen_name=GROUP_SCREEN_NAME) self.assertEqual(Post.objects.count(), 0) posts = group.fetch_posts(count=10) self.assertEqual(posts[0].wall_owner, group) self.assertTrue(len(posts) == Post.objects.count() == 10) self.assertTrue(isinstance(posts[0].date, datetime)) self.assertTrue(posts[0].likes + posts[1].likes > 0) self.assertTrue(posts[0].comments + posts[1].comments > 0) self.assertTrue(len(posts[0].text) > 0) # testing `after` parameter after = Post.objects.order_by('date')[0].date Post.objects.all().delete() self.assertEqual(Post.objects.count(), 0) posts = group.fetch_posts(after=after) self.assertTrue(len(posts) == Post.objects.count() == 10) # testing `after` and `all` parameters and returning less than all scope of posts Post.objects.all().delete() self.assertEqual(Post.objects.count(), 0) group.fetch_posts(count=30) posts = group.fetch_posts(after=after, all=True) self.assertEqual(Post.objects.count(), 30) self.assertEqual(len(posts), 10)
def test_fetch_group_post_comments(self, *args, **kwargs): group = GroupFactory.create(remote_id=GROUP_ID, screen_name=GROUP_SCREEN_NAME) post = PostFactory.create(remote_id=GROUP_POST_ID, wall_owner=group) self.assertEqual(Comment.objects.count(), 0) comments = post.fetch_comments(sort='desc', count=90) self.assertTrue(len(comments) == Comment.objects.count() == post.wall_comments.count() == 90) self.assertEqual(comments[0].post, post) self.assertEqual(comments[0].wall_owner, group) # testing `after` parameter after = Comment.objects.order_by('date')[0].date Comment.objects.all().delete() self.assertEqual(Comment.objects.count(), 0) comments = post.fetch_comments(sort='desc', after=after, count=100) self.assertTrue(len(comments) == Comment.objects.count() == post.wall_comments.count() == 90) # testing `after` and `all` parameters Comment.objects.all().delete() self.assertEqual(Comment.objects.count(), 0) comments = post.fetch_comments(sort='desc', after=after, all=True) self.assertTrue(len(comments) == Comment.objects.count() == post.wall_comments.count() == 90)
def test_fetch_group_post_comments_bad_unicode(self, *args, **kwargs): # http://vk.com/wall-23482909_195292 # UnicodeDecodeError: 'utf8' codec can't decode byte 0xca in position 0: invalid continuation byte group = GroupFactory(remote_id=23482909) post = PostFactory(remote_id='-23482909_195292', wall_owner=group) comments = post.fetch_comments(sort='desc', count=100) self.assertTrue(comments.count() > 0) # http://vk.com/wall-41330561_73352 # UnicodeDecodeError: 'utf8' codec can't decode byte 0xd3 in position 0: invalid continuation byte group = GroupFactory(remote_id=41330561) post = PostFactory(remote_id='-41330561_73352', wall_owner=group) comments = post.fetch_comments(sort='desc', count=100) self.assertTrue(comments.count() > 0)
def test_raise_users_exception(self): group = GroupFactory.create(remote_id=GROUP_ID) try: group.users assert False except ImproperlyConfigured, e: pass
def test_post_prepare_delete_params(self): group = GroupFactory(remote_id=GROUP_ID) post = PostFactory(remote_id='%s_17' % GROUP_ID, wall_owner=group) expected_params = { 'owner_id': GROUP_ID * -1, 'post_id': '17', } self.assertEqual(post.prepare_delete_params(), expected_params)
def test_fetch_post_reposts(self, *args, **kwargs): group = GroupFactory.create(remote_id=GROUP_ID) post = PostFactory.create(remote_id=GROUP_POST_ID, wall_owner=group) self.assertTrue(post.repost_users.count() == 0) users = post.fetch_reposts(all=True) self.assertTrue(post.reposts >= 20) self.assertTrue(post.reposts == post.repost_users.count() == users.count()) group = GroupFactory.create(remote_id=36948301) post = PostFactory.create(remote_id='-36948301_13599', wall_owner=group) self.assertTrue(post.reposts == post.repost_users.count() == 0) users = post.fetch_reposts(all=True) self.assertTrue(post.reposts == 1) self.assertTrue(post.reposts == post.repost_users.count() == users.count())
def test_post_prepare_delete_restore_params(self): group = GroupFactory.create(remote_id=OWNER_ID) post = PostFactory.create(remote_id='%s_17' % OWNER_ID, wall_owner=group) expected_params = { 'owner_id': OWNER_ID, 'post_id': '17', } self.assertEqual(post.prepare_delete_restore_params(), expected_params)
def test_fetch_post_likes_parser(self, *args, **kwargs): group = GroupFactory(remote_id=GROUP_ID) post = PostFactory(remote_id=GROUP_POST_ID, wall_owner=group) self.assertEqual(post.like_users.count(), 0) self.assertEqual(post.likes, 0) post.fetch_likes(source='parser') self.assertTrue(post.likes > 120) self.assertEqual(post.likes, post.like_users.count())
def test_fetch_post_comments_recursive_calls_ammount( self, fetch_method, *args, **kwargs): group = GroupFactory(remote_id=GROUP_ID) post = PostFactory(remote_id=GROUP_POST_ID, wall_owner=group) comments = post.fetch_comments(sort='desc', all=True) self.assertTrue(len(comments) > 105) self.assertEqual(fetch_method.called, True) self.assertEqual(fetch_method.call_count, 2) self.assertEqual(fetch_method.call_args_list[0][1]['offset'], 0) self.assertEqual(fetch_method.call_args_list[1][1]['offset'], 100)
def test_fetch_post_reposts(self, *args, **kwargs): group = GroupFactory(remote_id=GROUP_ID) post = PostFactory(remote_id=GROUP_POST_ID, wall_owner=group) users_initial = User.objects.count() self.assertEqual(post.repost_users.count(), 0) users = post.fetch_reposts(all=True) self.assertTrue(post.reposts > 20) # self.assertTrue(len(post.reposters) > 20) self.assertEqual(post.reposts, users.count()) self.assertEqual(post.reposts, User.objects.count() - users_initial) self.assertEqual(post.reposts, post.repost_users.count())
def test_fetch_post_reposts1(self, *args, **kwargs): group = GroupFactory(remote_id=36948301) post = PostFactory(remote_id='-36948301_23383', wall_owner=group) users_initial = User.objects.count() self.assertEqual(post.repost_users.count(), 0) users = post.fetch_reposts(all=True) # print post.reposts self.assertTrue(post.reposts > 120) self.assertEqual(post.reposts, users.count()) self.assertEqual(post.reposts, User.objects.count() - users_initial) self.assertEqual(post.reposts, post.repost_users.count())
def test_fetch_group_post_many_likes(self, *args, **kwargs): group = GroupFactory(remote_id=GROUP2_ID) post = PostFactory(remote_id=GROUP2_POST_WITH_MANY_LIKES_ID, wall_owner=group) users_initial = User.objects.count() self.assertEqual(post.like_users.count(), 0) self.assertEqual(post.likes, 0) users = post.fetch_likes(all=True) self.assertTrue(post.likes > 3800) self.assertEqual(post.likes, len(users)) self.assertEqual(post.likes, User.objects.count() - users_initial) self.assertEqual(post.likes, post.like_users.count())
def test_fetch_post_likes(self, *args, **kwargs): group = GroupFactory.create(remote_id=GROUP_ID) post = PostFactory.create(remote_id=GROUP_POST_ID, wall_owner=group) self.assertTrue(post.likes == post.like_users.count() == 0) post.fetch_likes(source='parser') self.assertTrue(post.likes == post.like_users.count() > 120) post.like_users.all().delete() post.likes = 0 post.save() self.assertTrue(post.likes == post.like_users.count() == 0) post.fetch_likes(all=True) self.assertTrue(post.likes == post.like_users.count() > 120)
def test_fetch_group_post_comment_likes(self, *args, **kwargs): group = GroupFactory(remote_id=GROUP_ID) post = PostFactory(remote_id=GROUP_POST_ID, wall_owner=group) comment = CommentFactory(remote_id=GROUP_COMMENT_ID, post=post, wall_owner=group) self.assertEqual(comment.like_users.count(), 0) self.assertEqual(comment.likes, 0) users_initial = User.objects.count() users = comment.fetch_likes(all=True) self.assertTrue(comment.likes > 0) self.assertEqual(comment.likes, len(users)) self.assertEqual(comment.likes, User.objects.count() - users_initial) self.assertEqual(comment.likes, comment.like_users.count())
def test_fetch_group_wall(self): group = GroupFactory(remote_id=GROUP_ID, screen_name=GROUP_SCREEN_NAME) self.assertEqual(Post.objects.count(), 0) posts = group.fetch_posts(count=10) self.assertEqual(posts[0].wall_owner, group) self.assertTrue(len(posts) == Post.objects.count() == 10) self.assertTrue(isinstance(posts[0].date, datetime)) self.assertTrue(posts[0].likes + posts[1].likes > 0) self.assertTrue(posts[0].comments + posts[1].comments > 0) self.assertTrue(len(posts[0].text) > 0) # testing `after` parameter after = Post.objects.order_by('date')[0].date Post.objects.all().delete() self.assertEqual(Post.objects.count(), 0) posts = group.fetch_posts(after=after) self.assertTrue(len(posts) == Post.objects.count() == 10) # testing `before` parameter before = Post.objects.order_by('-date')[5].date Post.objects.all().delete() self.assertEqual(Post.objects.count(), 0) posts = group.fetch_posts(before=before, after=after) self.assertTrue(len(posts) == Post.objects.count() == 5) # testing `after` and `all` parameters and returning less than all scope of posts Post.objects.all().delete() self.assertEqual(Post.objects.count(), 0) group.fetch_posts(count=30) posts = group.fetch_posts(after=after, all=True) self.assertEqual(Post.objects.count(), 30) self.assertEqual(len(posts), 10)
def test_fetch_group_post_comments(self, *args, **kwargs): group = GroupFactory(remote_id=GROUP_ID, screen_name=GROUP_SCREEN_NAME) post = PostFactory(remote_id=GROUP_POST_ID, wall_owner=group) self.assertEqual(Comment.objects.count(), 0) comments = post.fetch_comments(sort='desc', count=90) self.assertTrue( len(comments) == Comment.objects.count() == post.wall_comments.count() == 90) self.assertEqual(comments[0].post, post) self.assertEqual(comments[0].wall_owner, group) # testing `after` parameter after = Comment.objects.order_by('date')[0].date Comment.objects.all().delete() self.assertEqual(Comment.objects.count(), 0) comments = post.fetch_comments(sort='desc', after=after, count=100) self.assertTrue( len(comments) == Comment.objects.count() == post.wall_comments.count() == 90) # testing `before` parameter before = Comment.objects.order_by('-date')[5].date Comment.objects.all().delete() self.assertEqual(Comment.objects.count(), 0) comments = post.fetch_comments(sort='desc', before=before, after=after) self.assertTrue(len(comments) == Comment.objects.count() == 85) # testing `after` and `all` parameters Comment.objects.all().delete() self.assertEqual(Comment.objects.count(), 0) comments = post.fetch_comments(sort='desc', after=after, all=True) self.assertTrue( len(comments) == Comment.objects.count() == post.wall_comments.count() == 90)
def test_post_prepare_update_params(self): group = GroupFactory(remote_id=GROUP_ID) post = PostFactory(remote_id='%s_17' % GROUP_ID, wall_owner=group) update_text = 'update text' expected_config = { 'owner_id': GROUP_ID * -1, 'friends_only': 0, 'from_group': '', 'message': update_text, 'attachments': u'', 'services': '', 'signed': 0, 'publish_date': '', 'lat': '', 'long': '', 'place_id': '', 'post_id': u'17' } post1 = Post.objects.get(id=post.id) post1.text = update_text self.assertEqual(post1.prepare_update_params(), expected_config)
def test_post_prepare_create_params(self): text = 'test text' expected_config = { 'owner_id': GROUP_ID * -1, 'friends_only': 0, 'from_group': '', 'message': text, 'attachments': u'', 'services': '', 'signed': 0, 'publish_date': '', 'lat': '', 'long': '', 'place_id': '', 'post_id': '' } group = GroupFactory(remote_id=GROUP_ID) post = PostFactory() post.wall_owner = group post.text = text self.assertEqual(post.prepare_create_params(), expected_config)
def test_post_prepare_update_params(self): group = GroupFactory.create(remote_id=OWNER_ID) post = PostFactory.create(remote_id='%s_17' % OWNER_ID, wall_owner=group) update_text = 'update text' expected_config = { 'owner_id': OWNER_ID, 'friends_only': 0, 'from_group': '', 'message': update_text, 'attachments': u'', 'services': '', 'signed': 0, 'publish_date': '', 'lat': '', 'long': '', 'place_id': '', 'post_id': '17' } post1 = Post.objects.get(id=post.id) post1.text = update_text self.assertEqual(post1.prepare_update_params(), expected_config)
def test_post_prepare_create_params(self): text = 'test text' expected_config = { 'owner_id': OWNER_ID, 'friends_only': 0, 'from_group': '', 'message': text, 'attachments': u'', 'services': '', 'signed': 0, 'publish_date': '', 'lat': '', 'long': '', 'place_id': '', 'post_id': '' } group = GroupFactory.create(remote_id=OWNER_ID) post = PostFactory.create() post.wall_owner = group post.text = text self.assertEqual(post.prepare_create_params(), expected_config)
def test_fetch_group_post_updating_initial_reposts_time_from( self, *args, **kwargs): group = GroupFactory(remote_id=GROUP_ID) post = PostFactory(remote_id=GROUP_POST_ID, wall_owner=group) post.repost_users.through.objects.bulk_create( [post.repost_users.through(user_id=1, post_id=post.pk)]) self.assertEqual(post.repost_users.through.objects.count(), 1) resources = [{'from_id': 1, 'date': int(time.time())}] with mock.patch('vkontakte_wall.models.Post.fetch_repost_items', side_effect=lambda **kw: resources): post.fetch_reposts(all=True) self.assertEqual(post.repost_users.through.objects.count(), 1) instance = post.repost_users.through.objects.all()[0] self.assertEqual(instance.user_id, 1) self.assertEqual(instance.post_id, post.pk) self.assertEqual(instance.time_from, datetime.fromtimestamp(resources[0]['date']))
def test_fetch_group_post_likes(self, *args, **kwargs): group = GroupFactory(remote_id=GROUP_ID) post = PostFactory(remote_id=GROUP_POST_ID, wall_owner=group) self.assertEqual(post.like_users.count(), 0) self.assertEqual(post.likes, 0) users_initial = User.objects.count() users = post.fetch_likes(all=True) self.assertTrue(post.likes > 120) self.assertEqual(post.likes, len(users)) self.assertEqual(post.likes, User.objects.count() - users_initial) self.assertEqual(post.likes, post.like_users.count()) # try to fetch again likes = post.likes users = post.fetch_likes(all=True) self.assertEqual(post.likes, likes) self.assertEqual(post.likes, len(users)) self.assertEqual(post.likes, User.objects.count() - users_initial) self.assertEqual(post.likes, post.like_users.count())
def test_fetch_group_post_changing_likes(self, *args, **kwargs): group = GroupFactory(remote_id=GROUP2_ID) post = PostFactory(remote_id=GROUP2_POST_WITH_MANY_LIKES_ID, wall_owner=group) ids1 = range(100, 200) with mock.patch( 'vkontakte_users.models.User.remote.fetch_likes_user_ids', side_effect=lambda **kw: ids1): users1 = post.fetch_likes(all=True) state_time1 = post.like_users.last_update_time() self.assertEqual(post.like_users.count(), users1.count()) self.assertEqual(post.like_users.count(), len(ids1)) self.assertItemsEqual(post.like_users.all(), User.objects.filter(remote_id__in=ids1)) ids2 = range(50, 150) with mock.patch( 'vkontakte_users.models.User.remote.fetch_likes_user_ids', side_effect=lambda **kw: ids2): users2 = post.fetch_likes(all=True) state_time2 = post.like_users.last_update_time() self.assertEqual(post.like_users.count(), users2.count()) self.assertEqual(post.like_users.count(), len(ids2)) self.assertItemsEqual(post.like_users.all(), User.objects.filter(remote_id__in=ids2)) ids3 = range(0, 30) with mock.patch( 'vkontakte_users.models.User.remote.fetch_likes_user_ids', side_effect=lambda **kw: ids3): users3 = post.fetch_likes(all=True) state_time3 = post.like_users.last_update_time() self.assertEqual(post.like_users.count(), users3.count()) self.assertEqual(post.like_users.count(), len(ids3)) self.assertItemsEqual(post.like_users.all(), User.objects.filter(remote_id__in=ids3)) self.assertItemsEqual( post.like_users.were_at(state_time1, only_pk=True), ids1) self.assertItemsEqual( post.like_users.were_at(state_time2, only_pk=True), ids2) self.assertItemsEqual( post.like_users.were_at(state_time3, only_pk=True), ids3) self.assertItemsEqual( post.like_users.added_at(state_time2, only_pk=True), range(50, 100)) self.assertItemsEqual( post.like_users.removed_at(state_time2, only_pk=True), range(150, 200)) self.assertItemsEqual( post.like_users.added_at(state_time3, only_pk=True), range(0, 30)) self.assertItemsEqual( post.like_users.removed_at(state_time3, only_pk=True), range(50, 150))
def test_comment_crud_methods(self): group = GroupFactory(remote_id=GROUP_CRUD_ID) post = PostFactory(remote_id=POST_CRUD_ID, text='', wall_owner=group) user = UserFactory(remote_id=USER_AUTHOR_ID) def assert_local_equal_to_remote(comment): comment_remote = Comment.remote.fetch_post(post=comment.post).get( remote_id=comment.remote_id) self.assertEqual(comment_remote.remote_id, comment.remote_id) self.assertEqual(comment_remote.text, comment.text) Comment.remote.fetch_post(post=post) self.assertEqual(Comment.objects.count(), 0) # create comment = Comment(text='Test comment', post=post, wall_owner=group, author=user, date=datetime.now()) comment.save(commit_remote=True) self.objects_to_delete += [comment] self.assertEqual(Comment.objects.count(), 1) self.assertNotEqual(len(comment.remote_id), 0) assert_local_equal_to_remote(comment) # create by manager comment = Comment.objects.create( text='Test comment created by manager', post=post, wall_owner=group, author=user, date=datetime.now(), commit_remote=True) self.objects_to_delete += [comment] self.assertEqual(Comment.objects.count(), 2) self.assertNotEqual(len(comment.remote_id), 0) assert_local_equal_to_remote(comment) # update comment.text = 'Test comment updated' comment.save(commit_remote=True) self.assertEqual(Comment.objects.count(), 2) assert_local_equal_to_remote(comment) # delete comment.delete(commit_remote=True) self.assertEqual(Comment.objects.count(), 2) self.assertTrue(comment.archived) self.assertEqual( Comment.remote.fetch_post(post=comment.post).filter( remote_id=comment.remote_id).count(), 0) # restore comment.restore(commit_remote=True) self.assertFalse(comment.archived) self.assertEqual(Comment.objects.count(), 2) assert_local_equal_to_remote(comment)
def test_post_crud_methods(self): group = GroupFactory(remote_id=GROUP_CRUD_ID) user = UserFactory(remote_id=USER_AUTHOR_ID) def assert_local_equal_to_remote(post): post_remote = Post.remote.fetch(ids=[post.remote_id])[0] self.assertEqual(post_remote.remote_id, post.remote_id) self.assertEqual(post_remote.text, post.text) self.assertEqual(Post.objects.count(), 0) # create post = Post(text='Test message', wall_owner=group, author=user, date=datetime.now()) post.save(commit_remote=True) self.objects_to_delete += [post] self.assertEqual(Post.objects.count(), 1) self.assertNotEqual(len(post.remote_id), 0) assert_local_equal_to_remote(post) # create by manager post = Post.objects.create(text='Test message created by manager', wall_owner=group, author=user, date=datetime.now(), commit_remote=True) self.objects_to_delete += [post] self.assertEqual(Post.objects.count(), 2) self.assertNotEqual(len(post.remote_id), 0) assert_local_equal_to_remote(post) # create by manager on user's wall post = Post.objects.create(text='Test message', wall_owner=user, author=user, date=datetime.now(), commit_remote=True) self.objects_to_delete += [post] self.assertEqual(Post.objects.count(), 3) self.assertNotEqual(len(post.remote_id), 0) assert_local_equal_to_remote(post) # update post.text = 'Test message updated' post.save(commit_remote=True) self.assertEqual(Post.objects.count(), 3) assert_local_equal_to_remote(post) # delete post.delete(commit_remote=True) self.assertEqual(Post.objects.count(), 3) self.assertTrue(post.archived) self.assertEqual(Post.remote.fetch(ids=[post.remote_id]).count(), 0) # restore post.restore(commit_remote=True) self.assertFalse(post.archived) self.assertEqual(Post.objects.count(), 3) assert_local_equal_to_remote(post)
def group(): return GroupFactory()
def test_fetch_group_post_changing_reposts(self, *args, **kwargs): group = GroupFactory(remote_id=GROUP_ID) post = PostFactory(remote_id=GROUP_POST_ID, wall_owner=group) resources1 = [{'from_id': 1, 'date': int(time.time()) - 1000}] with mock.patch('vkontakte_wall.models.Post.fetch_repost_items', side_effect=lambda **kw: resources1): users1 = post.fetch_reposts(all=True) state_time1 = post.repost_users.last_update_time() state_time_add1 = datetime.fromtimestamp(resources1[0]['date']) self.assertEqual(post.repost_users.count(), users1.count()) self.assertEqual(post.repost_users.count(), 1) self.assertItemsEqual(post.repost_users.all(), User.objects.filter(remote_id__in=[1])) resources2 = [{'from_id': 2, 'date': int(time.time()) - 500}] with mock.patch('vkontakte_wall.models.Post.fetch_repost_items', side_effect=lambda **kw: resources1 + resources2): users2 = post.fetch_reposts(all=True) state_time2 = post.repost_users.last_update_time() state_time_add2 = datetime.fromtimestamp(resources2[0]['date']) self.assertEqual(post.repost_users.count(), users2.count()) self.assertEqual(post.repost_users.count(), 2) self.assertItemsEqual(post.repost_users.all(), User.objects.filter(remote_id__in=[1, 2])) resources3 = [{'from_id': 3, 'date': int(time.time()) - 100}] with mock.patch('vkontakte_wall.models.Post.fetch_repost_items', side_effect=lambda **kw: resources3): users3 = post.fetch_reposts(all=True) state_time3 = post.repost_users.last_update_time() state_time_add3 = datetime.fromtimestamp(resources3[0]['date']) self.assertEqual(post.repost_users.count(), users3.count()) self.assertEqual(post.repost_users.count(), 1) self.assertItemsEqual(post.repost_users.all(), User.objects.filter(remote_id__in=[3])) self.assertItemsEqual( post.repost_users.were_at(state_time1, only_pk=True), [1]) self.assertItemsEqual( post.repost_users.were_at(state_time2, only_pk=True), [1, 2]) self.assertItemsEqual( post.repost_users.were_at(state_time3, only_pk=True), [3]) self.assertItemsEqual( post.repost_users.added_at(state_time_add1, only_pk=True), [1]) self.assertItemsEqual( post.repost_users.removed_at(state_time1, only_pk=True), []) self.assertItemsEqual( post.repost_users.added_at(state_time_add2, only_pk=True), [2]) self.assertItemsEqual( post.repost_users.removed_at(state_time2, only_pk=True), []) self.assertItemsEqual( post.repost_users.added_at(state_time_add3, only_pk=True), [3]) self.assertItemsEqual( post.repost_users.removed_at(state_time3, only_pk=True), [1, 2])