class ConfigTest(base.RestTestCase):

    PATH = '/api/config'

    def makeTestGetConfig(extra_keys=None):
        extra_keys = set(extra_keys or [])

        def testGetConfig(self):
            with self.queryLimit(0):
                resp = self.client.get(self.PATH)
            self.assert200(resp)
            expected_keys = set((
                'teams',
                'sbname',
                'news_mechanism',
                'news_poll_interval',
                'csrf_token',
                'rules',
                'game_start',
                'game_end',
                'login_url',
                'register_url',
                'login_method',
                'scoring',
                'validators',
                'proof_of_work_bits',
            ))
            expected_keys |= extra_keys
            self.assertEqual(expected_keys, set(resp.json.keys()))

        return testGetConfig

    testGetConfig = makeTestGetConfig()
    testGetConfigAuthenticated = base.authenticated_test(makeTestGetConfig())
    testGetConfigAdmin = base.admin_test(makeTestGetConfig())
Exemple #2
0
class NewsTest(base.RestTestCase):

    PATH = '/api/news'

    def setUp(self):
        super(NewsTest, self).setUp()
        models.News.broadcast('test', 'Test message.')
        models.News.unicast(self.authenticated_client.team.tid, 'test',
                            'Test team message.')
        models.commit()

    def testGetNews(self):
        with self.queryLimit(2):
            resp = self.client.get(self.PATH)
        self.assert200(resp)
        self.assertEqual(1, len(resp.json))

    testGetNewsAdmin = base.admin_test(testGetNews)

    @base.authenticated_test
    def testGetNewsAuthenticated(self):
        with self.queryLimit(2):
            resp = self.client.get(self.PATH)
        self.assert200(resp)
        self.assertEqual(2, len(resp.json))

    def testCreateNews(self):
        with self.queryLimit(0):
            resp = self.postJSON(self.PATH, {
                'message': 'some message',
            })
        self.assert403(resp)

    testCreateNewsAuthenticated = base.authenticated_test(testCreateNews)

    @base.admin_test
    def testCreateNewsAdmin(self):
        msg = 'some message'
        with self.queryLimit(3):
            resp = self.postJSON(self.PATH, {
                'message': msg,
            })
        self.assert200(resp)
        self.assertEqual(self.client.user.nick, resp.json['author'])
        self.assertEqual(msg, resp.json['message'])

    @base.admin_test
    def testCreateTeamNewsAdmin(self):
        msg = 'some message'
        tid = self.authenticated_client.team.tid
        with self.queryLimit(3):
            resp = self.postJSON(self.PATH, {
                'message': msg,
                'tid': tid,
            })
        self.assert200(resp)
        self.assertEqual(self.client.user.nick, resp.json['author'])
        self.assertEqual(msg, resp.json['message'])
        self.assertEqual('Unicast', resp.json['news_type'])
        news = models.News.query.get(resp.json['nid'])
        self.assertEqual(tid, news.audience_team_tid)
class CategoryTest(base.RestTestCase):

    PATH_LIST = '/api/categories'
    PATH_SINGLE = '/api/categories/%s'

    def setUp(self):
        super(CategoryTest, self).setUp()
        self.challs, self.cats = makeTestChallenges()
        self.cat = self.cats[0]
        self.PATH_SINGLE %= self.cat.slug

    def _testGetList(self):
        with self.queryLimit(3):
            resp = self.client.get(self.PATH_LIST)
        self.assert200(resp)
        self.assertEqual(len(self.cats), len(resp.json['categories']))
        # TODO: check that the expected fields are visible and that others are
        # not.

    testGetListAuthenticated = base.authenticated_test(_testGetList)
    testGetListAdmin = base.admin_test(_testGetList)

    def testGetListAnonymous(self):
        with self.queryLimit(0):
            resp = self.client.get(self.PATH_LIST)
        self.assert403(resp)

    def testCreateCategoryFails(self):
        data = {
            'name': 'New',
            'description': 'New Category',
        }
        with self.queryLimit(0):
            resp = self.postJSON(self.PATH_LIST, data)
        self.assert403(resp)
        self.assertEqual(len(self.cats), models.Category.query.count())

    testCreateCategoryFailsAuthenticated = base.authenticated_test(
        testCreateCategoryFails)

    @base.admin_test
    def testCreateCategory(self):
        data = {
            'name': 'New',
            'description': 'New Category',
        }
        with self.queryLimit(6):
            resp = self.postJSON(self.PATH_LIST, data)
        self.assert200(resp)
        for f in ('name', 'description'):
            self.assertEqual(data[f], resp.json[f])
        cat = models.Category.query.get(resp.json['slug'])
        for f in ('name', 'description'):
            self.assertEqual(data[f], getattr(cat, f))

    def testDeleteCategoryFails(self):
        with self.queryLimit(0):
            resp = self.client.delete(self.PATH_SINGLE)
        self.assert403(resp)
        self.assertIsNotNone(models.Category.query.get(self.cat.slug))

    testDeleteCategoryFailsAuthenticated = base.authenticated_test(
        testDeleteCategoryFails)

    @base.admin_test
    def testDeleteNonEmptyCategory(self):
        with self.queryLimit(3):
            resp = self.client.delete(self.PATH_SINGLE)
        self.assert400(resp)
        self.assertIsNotNone(models.Category.query.get(self.cat.slug))

    @base.admin_test
    def testDeleteEmptyCategory(self):
        for i in self.cat.challenges:
            models.db.session.delete(i)
        models.db.session.commit()
        with self.queryLimit(3):
            resp = self.client.delete(self.PATH_SINGLE)
        self.assert200(resp)
        self.assertIsNone(models.Category.query.get(self.cat.slug))

    def testGetCategoryAnonymous(self):
        with self.queryLimit(0):
            self.assert403(self.client.get(self.PATH_SINGLE))

    def _testGetCategory(self):
        with self.queryLimit(None):
            resp = self.client.get(self.PATH_SINGLE)
        self.assert200(resp)

    testGetCategoryAuthenticated = base.authenticated_test(_testGetCategory)
    testGetCategoryAdmin = base.admin_test(_testGetCategory)

    def testUpdateCategoryAnonymous(self):
        with self.queryLimit(0):
            resp = self.putJSON(self.PATH_SINGLE, {'name': 'new name'})
        self.assert403(resp)

    testUpdateCategoryAuthenticated = base.authenticated_test(
        testUpdateCategoryAnonymous)

    @base.admin_test
    def testUpdateCategoryAdmin(self):
        data = {'name': 'new name'}
        with self.queryLimit(None):
            resp = self.putJSON(self.PATH_SINGLE, data)
        self.assert200(resp)
        self.assertEqual(data['name'], resp.json['name'])
        cat = models.Category.query.get(self.cat.slug)
        self.assertEqual(data['name'], cat.name)