Beispiel #1
0
    def setUp(self):
        super().setUp()
        self.server = MeetlingServer(redis_url='15')
        self.server.listen(16160, 'localhost')

        app = self.server.app
        app.r.flushdb()
        app.update()
        self.staff_member = app.login()
        self.user = app.login()
        self.meeting = self.server.app.create_meeting('Cat hangout')
        self.item = self.meeting.create_agenda_item('Eating')

        self.client_user = self.user
Beispiel #2
0
class MeetlingServerTest(AsyncTestCase):
    def setUp(self):
        super().setUp()
        self.server = MeetlingServer(redis_url='15')
        self.server.listen(16160, 'localhost')

        app = self.server.app
        app.r.flushdb()
        app.update()
        self.staff_member = app.login()
        self.user = app.login()
        self.meeting = self.server.app.create_meeting('Cat hangout')
        self.item = self.meeting.create_agenda_item('Eating')

        self.client_user = self.user

    def request(self, url, **args):
        headers = args.pop('headers', {})
        if self.client_user:
            headers.update({'Cookie': 'auth_secret=' + self.client_user.auth_secret})
        return AsyncHTTPClient().fetch(urljoin('http://localhost:16160/', url), headers=headers,
                                       **args)

    @gen_test
    def test_availability(self):
        # UI
        yield self.request('/')
        yield self.request(
            '/log-client-error', method='POST',
            body='{"type": "Error", "stack": "meetling.Page.prototype.createdCallback", "url": "/"}')
        yield self.request('/replace-auth', method='POST', body='')

        # API
        now = datetime.utcnow()
        yield self.request('/api/login', method='POST', body='')
        yield self.request('/api/meetings', method='POST',
                           body='{"title": "Cat hangout", "description": "  "}')
        yield self.request('/api/create-example-meeting', method='POST', body='')
        yield self.request('/api/users/' + self.user.id)
        yield self.request('/api/users/' + self.user.id, method='POST', body='{"name": "Happy"}')
        yield self.request('/api/settings')
        yield self.request('/api/meetings/' + self.meeting.id)
        yield self.request(
            '/api/meetings/' + self.meeting.id, method='POST',
            body='{{"title": "Awesome cat hangout", "time": "{}Z"}}'.format(now.isoformat()))
        yield self.request('/api/meetings/{}/items'.format(self.meeting.id))
        yield self.request('/api/meetings/{}/items'.format(self.meeting.id), method='POST',
                           body='{"title": "Purring"}')
        yield self.request('/api/meetings/{}/items/trashed'.format(self.meeting.id))
        yield self.request('/api/meetings/{}/trash-agenda-item'.format(self.meeting.id),
                           method='POST', body='{{"item_id": "{}"}}'.format(self.item.id))
        yield self.request('/api/meetings/{}/restore-agenda-item'.format(self.meeting.id),
                           method='POST', body='{{"item_id": "{}"}}'.format(self.item.id))
        yield self.request(
            '/api/meetings/{}/move-agenda-item'.format(self.meeting.id), method='POST',
            body='{{"item_id": "{}", "to_id": null}}'.format(self.item.id))
        yield self.request('/api/meetings/{}/items/{}'.format(self.meeting.id, self.item.id))
        yield self.request('/api/meetings/{}/items/{}'.format(self.meeting.id, self.item.id),
                           method='POST', body='{"title": "Intensive purring", "duration": 10}')

        # API (as staff member)
        self.client_user = self.staff_member
        yield self.request(
            '/api/settings', method='POST',
            body='{"title": "Cat Meetling", "icon": "http://example.org/static/icon.svg"}')

    @gen_test
    def test_get_meeting(self):
        response = yield self.request('/api/meetings/' + self.meeting.id)
        meeting = json.loads(response.body.decode())
        self.assertEqual(meeting.get('__type__'), 'Meeting')

    @gen_test
    def test_get_meeting_id_nonexistent(self):
        with self.assertRaises(HTTPError) as cm:
            yield self.request('/api/meetings/foo')
        self.assertEqual(cm.exception.code, http.client.NOT_FOUND)

    @gen_test
    def test_post_meeting_description_bad_type(self):
        with self.assertRaises(HTTPError) as cm:
            yield self.request('/api/meetings/' + self.meeting.id, method='POST',
                               body='{"description": 42}')
        self.assertEqual(cm.exception.code, http.client.BAD_REQUEST)
        error = json.loads(cm.exception.response.body.decode())
        self.assertEqual(error.get('__type__'), 'InputError')

    @gen_test
    def test_post_meeting_trash_agenda_item_item_id_nonexistent(self):
        with self.assertRaises(HTTPError) as cm:
            yield self.request('/api/meetings/{}/trash-agenda-item'.format(self.meeting.id),
                               method='POST', body='{"item_id": "foo"}')
        self.assertEqual(cm.exception.code, http.client.BAD_REQUEST)
        error = json.loads(cm.exception.response.body.decode())
        self.assertEqual(error.get('__type__'), 'ValueError')

    @gen_test
    def test_post_body_invalid_json(self):
        with self.assertRaises(HTTPError) as cm:
            yield self.request('/api/meetings/' + self.meeting.id, method='POST', body='foo')
        e = cm.exception
        self.assertEqual(e.code, http.client.BAD_REQUEST)