def test_fetch_answers_without_previous_data(mock_upvote_time, mock_collect_time): # mongodb can't store microsecond t1 = datetime.now().replace(microsecond=0) mock_upvote_time.side_effect = mock_collect_time.side_effect \ = [t1+timedelta(i) for i in range(10)] mock_answer = Mock(url='', id=aid, creation_time=None, collect_num=0, upvoters=deque(), latest_comments=deque(), collections=[], question=Mock(title='test question'), deleted=False, upvote_num=0, comment_num=0) refresh = Mock() mock_question = Mock(id=qid) mock_author = Mock(id=author_id) def update_attrs(): if refresh.call_count == 1: mock_answer.upvoters.appendleft(Mock(id='up1')) mock_answer.upvote_num += 1 elif refresh.call_count == 2: mock_answer.upvoters.appendleft(Mock(id='up2')) mock_answer.latest_comments.appendleft(Mock(cid=1, author=Mock(id='cm1'), creation_time=datetime(2016,1,9,13,1,0))) mock_answer.upvote_num += 1 mock_answer.comment_num += 1 elif refresh.call_count == 3: mock_answer.upvoters.appendleft(Mock(id='up3')) mock_answer.latest_comments.appendleft(Mock(cid=2, author=Mock(id='cm2'), creation_time=datetime(2016,1,9,13,2,0))) mock_answer.collections.append(Mock(id=1, owner=Mock(id='cl1'))) mock_answer.upvote_num += 1 mock_answer.comment_num += 1 mock_answer.collect_num += 1 elif refresh.call_count == 4: mock_answer.latest_comments.appendleft(Mock(cid=3, author=Mock(id='cm1'), creation_time=datetime(2016,1,9,13,3,0))) mock_answer.comment_num += 1 elif refresh.call_count == 5: mock_answer.latest_comments.appendleft(Mock(cid=4, author=Mock(id='cm3'), creation_time=datetime(2016,1,9,13,4,0))) mock_answer.latest_comments.appendleft(Mock(cid=5, author=Mock(id='cm1'), creation_time=datetime(2016,1,9,13,5,0))) mock_answer.comment_num += 2 elif refresh.call_count == 6: # test deleted answer mock_answer.deleted = True refresh.side_effect = update_attrs mock_answer.configure_mock(refresh=refresh, question=mock_question, author=mock_author) task = FetchAnswerInfo(tid=tid, qid='', answer=mock_answer) answer_info = { 'topic': tid, 'aid': aid, 'qid': qid, 'answerer': author_id, 'upvoters': [], 'commenters': [], 'collectors': [] } day = datetime.now().date() assert dict_equal(DB.get_one_answer(tid, aid), answer_info) # call_count = 1 task.execute() answer_info['upvoters'].append({'uid':'up1', 'time':t1}) assert dict_equal(DB.get_one_answer(tid, aid), answer_info) # call_count = 2 task.execute() answer_info['upvoters'].append({'uid':'up2', 'time':t1+timedelta(1)}) answer_info['commenters'].append({'uid':'cm1', 'cid':1, 'time':datetime.combine(day, time(13,1))}) assert dict_equal(DB.get_one_answer(tid, aid), answer_info) assert task.manager.lastest_comment_time == datetime.combine(day, time(13,1)) # call_count = 3 task.execute() answer_info['upvoters'].append({'uid':'up3', 'time':t1+timedelta(2)}) answer_info['commenters'].append({'uid':'cm2', 'cid':2, 'time':datetime.combine(day, time(13,2))}) answer_info['collectors'].append({'uid':'cl1', 'time':t1, 'cid':1}) assert dict_equal(DB.get_one_answer(tid, aid), answer_info) assert task.manager.lastest_comment_time == datetime.combine(day, time(13,2)) # test adding comment posted by same person task.execute() assert dict_equal(DB.get_one_answer(tid, aid), answer_info) assert task.manager.lastest_comment_time == datetime.combine(day, time(13,2)) task.execute() answer_info['commenters'].append({'uid':'cm3', 'cid':4, 'time':datetime.combine(day, time(13,4))}) assert dict_equal(DB.get_one_answer(tid, aid), answer_info) assert task.manager.lastest_comment_time == datetime.combine(day, time(13,4)) task.execute() assert DB.get_one_answer(tid, aid) == None
def test_fetch_answers_with_previous_data(mock_client, mock_collect_time, mock_upvote_time): answer_info = { 'topic': str(tid), 'aid': str(aid), 'url': 'https://zhihu.com/answer/1', 'qid': str(qid), 'time': datetime(2016, 1, 8, 19, 30, 1), 'answerer': author_id, 'upvoters': [ {'uid':'up1', 'time':datetime(2016, 1, 8, 19, 30, 1)}, {'uid':'up2', 'time':datetime(2016, 1, 8, 19, 40, 1)}, {'uid':'up3', 'time':datetime(2016, 1, 9, 3, 50, 2)} ], 'commenters': [ {'uid':'cm1', 'cid':1, 'time':datetime(2016, 1, 9, 20, 9, 0)} ], 'collectors': [ {'uid':'cl1', 'cid':1, 'time':datetime(2016, 1, 9, 1, 9, 45)} ] } DB.db[a_col(tid)].insert(answer_info) t1 = datetime.now().replace(microsecond=0) # mock_upvote_time 在这里不起作用,故随便给一个值 mock_upvote_time.return_value = t1 mock_collect_time.side_effect = [ datetime(2016,1,9,3,0,0), datetime(2016,1,9,4,0,0), datetime(2016,1,9,2,0,0), ] mock_answer = Mock(url='https://zhihu.com/answer/1', id=aid, creation_time=None, upvoters=deque([ Mock(id='up1'), Mock(id='up2'), Mock(id='up3')]), latest_comments=deque([Mock(uid='cm1', cid=1, creation_time=datetime(2016,1,9,20,9,0), author=Mock(id='cm1'))]), collections=[Mock(owner=Mock(id='cl1'), id=1)], question=Mock(title='test question'), deleted=False, upvote_num=3, comment_num=1, collect_num=1) refresh = Mock() mock_question = Mock(id=qid) mock_author = Mock(id=author_id) mock_client.return_value = Mock(answer=Mock(return_value=mock_answer)) def update_attrs(): if refresh.call_count == 1: mock_answer.upvoters.appendleft(Mock(id='up4')) mock_answer.latest_comments.appendleft(Mock(cid=2, author=Mock(id='cm2'), creation_time=datetime(2016,1,9,21,1,0))) mock_answer.latest_comments.appendleft(Mock(cid=3, author=Mock(id='cm1'), creation_time=datetime(2016,1,9,21,2,0))) mock_answer.latest_comments.appendleft(Mock(cid=4, author=Mock(id='cm2'), creation_time=datetime(2016,1,9,21,4,0))) mock_answer.latest_comments.appendleft(Mock(cid=5, author=Mock(id='cm3'), creation_time=datetime(2016,1,9,23,5,0))) mock_answer.collections.append(Mock(id=2, owner=Mock(id='cl2'))) mock_answer.collections.append(Mock(id=3, owner=Mock(id='cl3'))) mock_answer.collections.append(Mock(id=4, owner=Mock(id='cl4'))) mock_answer.upvote_num += 1 mock_answer.collect_num += 3 mock_answer.comment_num += 4 elif refresh.call_count == 2: mock_answer.deleted = True refresh.side_effect = update_attrs mock_answer.configure_mock(refresh=refresh, question=mock_question, author=mock_author) task = FetchAnswerInfo(tid=tid, qid='', url=mock_answer.url) assert dict_equal(DB.get_one_answer(tid, aid), answer_info) task.execute() answer_info['upvoters'].append({'uid':'up4', 'time':t1}) answer_info['commenters'].extend([ {'uid':'cm2', 'time':datetime(2016,1,9,21,1,0), 'cid':2}, {'uid':'cm3', 'time':datetime(2016,1,9,23,5,0), 'cid':5} ]) # 测试 collection 按时间排序 answer_info['collectors'].extend([ {'uid':'cl4', 'time':datetime(2016,1,9,2,0,0), 'cid':4}, {'uid':'cl2', 'time':datetime(2016,1,9,3,0,0), 'cid':2}, {'uid':'cl3', 'time':datetime(2016,1,9,4,0,0), 'cid':3} ]) assert dict_equal(DB.get_one_answer(tid, aid), answer_info) task.execute() assert DB.get_one_answer(tid, aid) == None