def test_default_title(self): r = Remind(time=timezone.now(), owner_id='miao', desc='吃饭饭', done=True) r.save() serializer = RemindSerializer(instance=r, context={'request': self.request}) with HTTMock(access_token_mock, create_qrcode_mock): self.assertEqual(serializer.data['title'], Remind.default_title)
def test_click_event_for_remind_today(self): req_text = """ <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[CLICK]]></Event> <EventKey><![CDATA[time_remind_today]]></EventKey> </xml> """ wechat_msg = self.build_wechat_msg(req_text) resp_xml = handle_message(wechat_msg) self.assertIn('今天没有提醒', resp_xml) WechatUser(openid='abc', nickname='abc').save() r = Remind(time=timezone.now(), owner_id=self.user.pk, event='睡觉') r.save() resp_xml = handle_message(wechat_msg) self.assertIn(r.title(), resp_xml) self.assertIn(r.local_time_string('G:i'), resp_xml) r = Remind(time=timezone.now(), owner_id=self.user.pk, event='吃饭', participants=['abc']) r.save() self.assertEqual( WechatUser.objects.get(pk='abc').get_time_reminds().first(), r)
def setUp(self): self.r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc='吃饭饭', done=True) self.r.save()
class RemindViewTestCase(TestCase): def setUp(self): self.r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc='吃饭饭') self.r.save() def test_anonymous_delete(self): resp = self.client.delete(reverse('remind-detail', args=(self.r.pk.hex,)), HTTP_X_REFERER='abc.com/#def') # self.assertEqual(resp.status_code, 302) self.assertEqual(resp.status_code, 401) self.assertIn('//open.weixin.qq.com/connect/oauth2/authorize', resp.get('WWW-Authenticate', '')) self.assertIn('state=abc.com%2F%23def', resp.get('WWW-Authenticate', '')) def test_unauthorized_delete(self): u = WechatUser(openid='123', nickname='456') u.save() self.client.force_login(u) resp = self.client.delete(reverse('remind-detail', args=(self.r.pk.hex,))) self.assertEqual(resp.status_code, 403) def test_participant_delete(self): WechatUser(openid='miao', nickname='miaomiaomiao').save() self.r.add_participant('123') u = WechatUser(openid='123', nickname='456') u.save() self.client.force_login(u) resp = self.client.delete(reverse('remind-detail', args=(self.r.pk.hex,))) self.assertEqual(resp.status_code, 204) # self.assertEqual(resp.url, reverse('remind_list')) def test_delete(self): u = WechatUser(openid='miao', nickname='456') u.save() self.client.force_login(u) resp = self.client.delete(reverse('remind-detail', args=(self.r.pk.hex,))) self.assertEqual(resp.status_code, 204)
def test_add_add_participant(self): r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc='吃饭饭') r.save() r.add_participant('abc') r.add_participant('abc') self.assertEqual(r.participants, ['abc'])
def setUp(self): self.user = WechatUser(openid='miao', nickname='456') self.user.save() self.r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc='吃饭饭') self.r.save()
class RemindSerializerTestCase(TestCase): def setUp(self): self.r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc='吃饭饭', done=True) self.r.save() def test_change_defer(self): update_data = { 'title': self.r.event, 'time': TimestampField().to_representation(self.r.time), 'defer': -2 * 60 } self.assertTrue(self.r.done) serializer = RemindSerializer(data=update_data, instance=self.r) self.assertTrue(serializer.is_valid()) serializer.save() self.assertFalse(self.r.done) self.assertEqual(self.r.defer, -2 * 60) self.assertEqual(self.r.notify_time, self.r.time + timedelta(minutes=self.r.defer)) update_data['defer'] = 2 * 24 * 60 serializer = RemindSerializer(data=update_data, instance=self.r) self.assertTrue(serializer.is_valid()) serializer.save() self.assertEqual(self.r.defer, 2 * 24 * 60) def test_uuid_format(self): serializer = RemindSerializer(instance=self.r) self.assertRegexpMatches(serializer.data['id'], r'\w{32}') def test_default_title(self): r = Remind(time=timezone.now(), owner_id='miao', desc='吃饭饭', done=True) r.save() serializer = RemindSerializer(instance=r) self.assertEqual(serializer.data['title'], Remind.default_title) def test_read_only_fields(self): update_data = { 'id': '123', 'owner': { 'id': '123' }, 'title': self.r.event, 'time': TimestampField().to_representation(self.r.time), 'aaa': 1 } serializer = RemindSerializer(data=update_data, initial=self.r) self.assertTrue(serializer.is_valid()) self.assertNotIn('id', serializer.validated_data) self.assertNotIn('owner', serializer.validated_data) self.assertNotIn('aaa', serializer.validated_data)
def test_reschedule(self): n = timezone.now() - timedelta(minutes=10) r = Remind(time=n, owner_id='miao', event='吃饭', desc='吃饭饭', repeat={REPEAT_KEY_DAY: 1}, defer=-60) r.save() self.assertEqual(r.notify_time, n - timedelta(minutes=60) + timedelta(days=1))
def setUp(self): self.request = RequestFactory().get('/') user = get_user_model()(openid='miao', nickname='abc') user.save() self.request.user = user self.r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc='吃饭饭', done=True) self.r.save()
def parse_by_rules(self, text): # TODO: refine me, here is an ad-hoc patch to distinguish weekday and hour _text = re.sub(ur'([周|星期]\w)(\d)', r'\1 \2', text, flags=re.U) self.words = pseg.lcut(parse_cn_number(_text), HMM=False) while self.has_next(): self.parse_beginning = self.get_index() self.consume_repeat() self.consume_year_period() \ or self.consume_month_period() \ or self.consume_day_period() self.consume_weekday_period() \ or self.consume_hour_period() \ or self.consume_minute_period() \ or self.consume_second_period() self.consume_year() \ or self.consume_month() \ or self.consume_day() self.consume_hour() if self.get_index() != self.parse_beginning: # Time found self.consume_word(u'准时') self.consume_word(u'是') if self.consume_word(u'提醒'): self.consume_word(u'我') if self.current_tag() == 'v' and self.peek_next_word() == u'我': self.advance(2) self.consume_to_end() try: self.now += relativedelta(**self.time_delta_fields) self.now = self.now.replace(**self.time_fields) except ValueError: raise ParseError(u'/:no亲,时间或者日期超范围了') # Donot set event to None, since serializer will just skip None and we will have no chance to modify it remind = Remind(time=self.now, repeat=self.repeat, desc=text, event=self.do_what) remind.reschedule() return remind else: self.advance() return None
def test_notify_time_update(self): n = timezone.now() r = Remind(time=n, owner_id='miao', event='吃饭', desc='吃饭饭') r.save() self.assertEqual(r.notify_time, n) r.defer = -10 r.save() self.assertEqual(r.notify_time, n - timedelta(minutes=10)) self.assertEqual(r.nature_time_defer(), '提前 10 分钟')
def test_lines_with_carriage(self): desc = """2018 NEO编程日 第1站 时间:2018年1月13日13:00(签到)—18:30(下午)""" + \ """\n地点:上海浦东新区金科路长泰广场C座12层 """ r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc=desc) image = draw_post(r, self.user) if DISPLAY_POST: image.show()
def test_many_lines_description(self): r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc='吃饭饭' * 50) image = draw_post(r, self.user) if DISPLAY_POST: image.show()
def test_notify_time_update(self): n = timezone.now() r = Remind(time=n, owner_id='miao', event='吃饭', desc='吃饭饭') r.save() self.assertEqual(r.notify_time, n) r.defer = -10 r.save() self.assertEqual(r.notify_time, n-timedelta(minutes=10)) self.assertEqual(r.humanize_defer(), '提前 10 分钟')
def parse_by_rules(self, text): self.words = pseg.lcut(parse_cn_number(text), HMM=False) while self.has_next(): beginning = self.get_index() self.consume_repeat() self.consume_year_period() \ or self.consume_month_period() \ or self.consume_day_period() self.consume_weekday_period() \ or self.consume_hour_period() \ or self.consume_minute_period() \ or self.consume_second_period() self.consume_year() \ or self.consume_month() \ or self.consume_day() self.consume_hour() if self.get_index() != beginning: # Time found self.consume_word(u'准时') if self.consume_word(u'提醒'): self.consume_word(u'我') if self.current_tag() == 'v' and self.peek_next_word() == u'我': self.advance(2) self.consume_to_end() # Donot set event to None,since serializer will just skip None and we will have no chance to modify it remind = Remind(time=self.now, repeat=self.repeat, desc=text, event=self.do_what) remind.reschedule() return remind else: self.advance() return None
class RemindFormTestCase(TestCase): def setUp(self): self.r = Remind(time=timezone.now(), owner_id="miao", event="吃饭", desc="吃饭饭", done=True) self.r.save() def test_change_defer(self): form_data = { "event": self.r.event, "time": self.r.time.strftime("%Y-%m-%dT%H:%M"), "defer": "提前 2 小时", "desc": self.r.desc, } self.assertTrue(self.r.done) form = RemindForm(data=form_data, instance=self.r) form.save() self.assertTrue(form.is_valid()) self.assertFalse(self.r.done) self.assertEqual(self.r.defer, -2 * 60) self.assertEqual(self.r.notify_time, self.r.time + timedelta(minutes=self.r.defer)) form_data["defer"] = "延后 2 天" form = RemindForm(data=form_data, instance=self.r) form.save() self.assertEqual(self.r.defer, 2 * 24 * 60)
def parse_by_wechat_api(text, **kwargs): """ { "errcode": 0, "query": "提醒我上午十点开会", "semantic": { "details": { "answer": "", "context_info": {}, "datetime": { "date": "2015-12-23", "date_lunar": "2015-11-13", "time": "10:00:00", "time_ori": "上午十点", "type": "DT_ORI", "week": "3" }, "event": "开会", "hit_str": "提醒 我 上午 十点 开会 ", "remind_type": "0" }, "intent": "SEARCH" }, "type": "remind" } """ try: wechat_result = wechat_client.semantic.search( query=text, category='remind', city='上海', # F**k, weixin always needs the city param, hard-code one. **kwargs ) except WeChatClientException as e: logger.info('Failed to parse using wechat api ' + str(e)) raise # wechat_result = json.loads(parse_by_wechat_api.__doc__) logger.debug('Semantic result from wechat, %s', json.dumps(wechat_result, ensure_ascii=False)) dt_str = '%s %s+08:00' % ( wechat_result['semantic']['details']['datetime']['date'], wechat_result['semantic']['details']['datetime']['time'], ) # there could be nothing in details dt = parse_datetime(dt_str) return Remind(time=dt, desc=wechat_result.get('query', ''), event=wechat_result['semantic']['details'].get('event', ''))
def test_add_add_participant(self): WechatUser(openid='abc', nickname='abcabc', subscribe=True).save() r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc='吃饭饭') r.save() r.add_participant('abc') r.add_participant('abc') self.assertEqual(r.participants, ['abc'])
def test_click_event_for_remind_today(self): req_text = """ <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[CLICK]]></Event> <EventKey><![CDATA[time_remind_today]]></EventKey> </xml> """ wechat_msg = self.build_wechat_msg(req_text) resp_xml = handle_message(wechat_msg) self.assertIn('今天没有提醒', resp_xml) WechatUser(openid='abc', nickname='abc').save() r = Remind(time=timezone.now(), owner_id=self.user.pk, event='睡觉') r.save() resp_xml = handle_message(wechat_msg) self.assertIn(r.title(), resp_xml) self.assertIn(r.local_time_string('G:i'), resp_xml) r = Remind(time=timezone.now(), owner_id=self.user.pk, event='吃饭', participants=['abc']) r.save() self.assertEqual(WechatUser.objects.get(pk='abc').get_time_reminds().first(), r)
def setUp(self): self.r = Remind(time=timezone.now(), owner_id="miao", event="吃饭", desc="吃饭饭", done=True) self.r.save()
class RemindSerializerTestCase(TestCase): def setUp(self): self.request = RequestFactory().get('/') user = get_user_model()(openid='miao', nickname='abc') user.save() self.request.user = user self.r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc='吃饭饭', done=True) self.r.save() def test_change_defer(self): update_data = { 'title': self.r.event, 'time': TimestampField().to_representation(self.r.time), 'defer': -2 * 60 } self.assertTrue(self.r.done) serializer = RemindSerializer(data=update_data, instance=self.r, partial=True) self.assertTrue(serializer.is_valid()) serializer.save() self.assertFalse(self.r.done) self.assertEqual(self.r.defer, -2 * 60) self.assertEqual(self.r.notify_time, self.r.time + timedelta(minutes=self.r.defer)) update_data['defer'] = 2 * 24 * 60 serializer = RemindSerializer(data=update_data, instance=self.r, partial=True) self.assertTrue(serializer.is_valid()) serializer.save() self.assertEqual(self.r.defer, 2 * 24 * 60) def test_uuid_format(self): serializer = RemindSerializer(instance=self.r, context={'request': self.request}) with HTTMock(access_token_mock, create_qrcode_mock): self.assertRegexpMatches(serializer.data['id'], r'\w{32}') def test_default_title(self): r = Remind(time=timezone.now(), owner_id='miao', desc='吃饭饭', done=True) r.save() serializer = RemindSerializer(instance=r, context={'request': self.request}) with HTTMock(access_token_mock, create_qrcode_mock): self.assertEqual(serializer.data['title'], Remind.default_title) def test_read_only_fields(self): update_data = { 'id': '123', 'owner': { 'id': 'miao' }, 'title': self.r.event, 'time': TimestampField().to_representation(self.r.time), 'aaa': 1 } serializer = RemindSerializer(data=update_data, initial=self.r, partial=True) self.assertTrue(serializer.is_valid()) self.assertNotIn('id', serializer.validated_data) self.assertNotIn('owner', serializer.validated_data) self.assertNotIn('aaa', serializer.validated_data)
def test_default_title(self): r = Remind(time=timezone.now(), owner_id='miao', desc='吃饭饭', done=True) r.save() serializer = RemindSerializer(instance=r) self.assertEqual(serializer.data['title'], Remind.default_title)
def setUp(self): self.r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc='吃饭饭') self.r.save()