예제 #1
0
 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)
예제 #2
0
    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)
예제 #3
0
 def setUp(self):
     self.r = Remind(time=timezone.now(),
                     owner_id='miao',
                     event='吃饭',
                     desc='吃饭饭',
                     done=True)
     self.r.save()
예제 #4
0
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)
예제 #5
0
    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'])
예제 #6
0
 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()
예제 #7
0
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)
예제 #8
0
 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))
예제 #9
0
 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()
예제 #10
0
    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
예제 #11
0
 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 分钟')
예제 #12
0
    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()
예제 #13
0
    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()
예제 #14
0
 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 分钟')
예제 #15
0
    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
예제 #16
0
    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
예제 #17
0
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)
예제 #18
0
    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'])
예제 #19
0
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', ''))
예제 #20
0
    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'])
예제 #21
0
    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)
예제 #22
0
 def setUp(self):
     self.r = Remind(time=timezone.now(), owner_id="miao", event="吃饭", desc="吃饭饭", done=True)
     self.r.save()
예제 #23
0
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)
예제 #24
0
 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)
예제 #25
0
 def setUp(self):
     self.r = Remind(time=timezone.now(), owner_id='miao', event='吃饭', desc='吃饭饭')
     self.r.save()