コード例 #1
0
ファイル: bundle.py プロジェクト: OSSystems/lava-server
class BundleDeserializationTests(TestCaseWithScenarios):

    scenarios = [
        ('dummy_import_failure', {
            'pathname': '/public/personal/admin/',
            'is_public': 'true',
            'content': 'bogus',
            'content_filename': 'test1.json',
        }),
    ]

    def setUp(self):
        super(BundleDeserializationTests, self).setUp()
        self.bundle = fixtures.create_bundle(
            self.pathname, self.content, self.content_filename)
        self.mocker = Mocker()

    def tearDown(self):
        self.bundle.delete_files()
        self.mocker.restore()
        self.mocker.verify()
        super(BundleDeserializationTests, self).tearDown()

    def test_deserialize_failure_leaves_trace(self):
        mock = self.mocker.patch(self.bundle)
        expect(mock._do_deserialize(False)).throw(Exception("boom"))
        self.mocker.replay()
        self.bundle.deserialize(False)
        self.assertFalse(self.bundle.is_deserialized)
        self.assertEqual(self.bundle.deserialization_error.error_message, "boom")

    def test_deserialize_ignores_deserialized_bundles(self):
        # just reply as we're not using mocker in this test case
        self.mocker.replay()
        self.bundle.is_deserialized = True
        self.bundle.deserialize(False)
        self.assertTrue(self.bundle.is_deserialized)

    def test_deserialize_sets_is_serialized_on_success(self):
        mock = self.mocker.patch(self.bundle)
        expect(mock._do_deserialize(False))
        self.mocker.replay()
        self.bundle.deserialize(False)
        self.assertTrue(self.bundle.is_deserialized)

    def test_deserialize_clears_old_error_on_success(self):
        BundleDeserializationError.objects.create(
            bundle=self.bundle,
            error_message="not important").save()
        mock = self.mocker.patch(self.bundle)
        expect(mock._do_deserialize(False))
        self.mocker.replay()
        self.bundle.deserialize(False)
        # note we cannot check for self.bundle.deserialization_error
        # directly due to the way django handles operations that affect
        # existing instances (it does not touch them like storm would
        # IIRC).
        self.assertRaises(
            BundleDeserializationError.DoesNotExist,
            BundleDeserializationError.objects.get, bundle=self.bundle)
コード例 #2
0
class BundleDeserializationTests(TestCaseWithScenarios):

    scenarios = [
        ('dummy_import_failure', {
            'pathname': '/public/personal/admin/',
            'is_public': 'true',
            'content': 'bogus',
            'content_filename': 'test1.json',
        }),
    ]

    def setUp(self):
        super(BundleDeserializationTests, self).setUp()
        self.bundle = fixtures.create_bundle(self.pathname, self.content,
                                             self.content_filename)
        self.mocker = Mocker()

    def tearDown(self):
        self.bundle.delete_files()
        self.mocker.restore()
        self.mocker.verify()
        super(BundleDeserializationTests, self).tearDown()

    def test_deserialize_failure_leaves_trace(self):
        mock = self.mocker.patch(self.bundle)
        expect(mock._do_deserialize(False)).throw(Exception("boom"))
        self.mocker.replay()
        self.bundle.deserialize(False)
        self.assertFalse(self.bundle.is_deserialized)
        self.assertEqual(self.bundle.deserialization_error.error_message,
                         "boom")

    def test_deserialize_ignores_deserialized_bundles(self):
        # just reply as we're not using mocker in this test case
        self.mocker.replay()
        self.bundle.is_deserialized = True
        self.bundle.deserialize(False)
        self.assertTrue(self.bundle.is_deserialized)

    def test_deserialize_sets_is_serialized_on_success(self):
        mock = self.mocker.patch(self.bundle)
        expect(mock._do_deserialize(False))
        self.mocker.replay()
        self.bundle.deserialize(False)
        self.assertTrue(self.bundle.is_deserialized)

    def test_deserialize_clears_old_error_on_success(self):
        BundleDeserializationError.objects.create(
            bundle=self.bundle, error_message="not important").save()
        mock = self.mocker.patch(self.bundle)
        expect(mock._do_deserialize(False))
        self.mocker.replay()
        self.bundle.deserialize(False)
        # note we cannot check for self.bundle.deserialization_error
        # directly due to the way django handles operations that affect
        # existing instances (it does not touch them like storm would
        # IIRC).
        self.assertRaises(BundleDeserializationError.DoesNotExist,
                          BundleDeserializationError.objects.get,
                          bundle=self.bundle)
コード例 #3
0
 def test_template_context_has_API_URL(self):
     mocker = Mocker()
     report = mocker.patch(DataReport())
     expect(report._get_raw_html()).result("{{API_URL}}")
     with mocker:
         observed = report.get_html()
         expected = '/RPC2'
         self.assertEqual(observed, expected)
コード例 #4
0
ファイル: data_report.py プロジェクト: OSSystems/lava-server
 def test_template_context_does_not_have_RequestContext_things(self):
     mocker = Mocker()
     report = mocker.patch(DataReport())
     expect(report._get_raw_html()).result("{{MEDIA_URL}}")
     with mocker:
         observed = report.get_html()
         expected = ""
         self.assertEqual(observed, expected)
コード例 #5
0
ファイル: data_report.py プロジェクト: OSSystems/lava-server
 def test_template_context_has_API_URL(self):
     mocker = Mocker()
     report = mocker.patch(DataReport())
     expect(report._get_raw_html()).result("{{API_URL}}")
     with mocker:
         observed = report.get_html()
         expected = '/RPC2'
         self.assertEqual(observed, expected)
コード例 #6
0
 def test_template_context_does_not_have_RequestContext_things(self):
     mocker = Mocker()
     report = mocker.patch(DataReport())
     expect(report._get_raw_html()).result("{{MEDIA_URL}}")
     with mocker:
         observed = report.get_html()
         expected = ""
         self.assertEqual(observed, expected)
コード例 #7
0
 def test_converte2opl(self):
     linhas_arquivo_entrada = [['4','3'],['0','1','2','4'],['0','2','4','8'],['1','3','6','12'],['0','3']]
     linhas_arquivo_saida_esperada = ['s = "0";','d = "3";',
         'A = {<"0","1",[2,4]>,\n<"0","2",[4,8]>,\n<"1","3",[6,12]>};']
     converte2opl = Converte2OPL('arquivo.txt','arquivo_saida.txt')
     mocker = Mocker()
     obj = mocker.patch(converte2opl)
     obj.le_arquivo_entrada()
     mocker.result(linhas_arquivo_entrada)
     mocker.replay()
     obj.converte()
     self.assertListEqual(linhas_arquivo_saida_esperada,obj.linhas_arquivo_saida)
コード例 #8
0
    def test_getCategories_HTTPError(self):
        from collective.flattr.browser.flattr import Flattr

        mocker = Mocker()
        view = Flattr(self.portal, self.layer['request'])

        obj = mocker.patch(view)
        obj.opener
        mocker.result(MockOpener('[{"id": "text", "text": "Text"}, {"id": "images", "text": "Images"}]', error=True))

        with mocker:
            ret = view.getCategories()

            self.failUnless(isinstance(ret, list))
            self.assertEquals(len(ret), 0)
コード例 #9
0
 def test_converte2opl(self):
     linhas_arquivo_entrada = [['4', '3'], ['0', '1', '2', '4'],
                               ['0', '2', '4', '8'], ['1', '3', '6', '12'],
                               ['0', '3']]
     linhas_arquivo_saida_esperada = [
         's = "0";', 'd = "3";',
         'A = {<"0","1",[2,4]>,\n<"0","2",[4,8]>,\n<"1","3",[6,12]>};'
     ]
     converte2opl = Converte2OPL('arquivo.txt', 'arquivo_saida.txt')
     mocker = Mocker()
     obj = mocker.patch(converte2opl)
     obj.le_arquivo_entrada()
     mocker.result(linhas_arquivo_entrada)
     mocker.replay()
     obj.converte()
     self.assertListEqual(linhas_arquivo_saida_esperada,
                          obj.linhas_arquivo_saida)
コード例 #10
0
    def test_getCategories(self):
        from collective.flattr.browser.flattr import Flattr

        mocker = Mocker()
        view = Flattr(self.portal, self.layer['request'])

        obj = mocker.patch(view)
        obj.opener
        mocker.result(MockOpener('[{"id": "text", "text": "Text"}, {"id": "images", "text": "Images"}]'))

        with mocker:
            ret = view.getCategories()

            self.failUnless(isinstance(ret, list))
            self.assertEquals(len(ret), 2)
            self.assertEquals(ret[0], {'id': u'text',
                'text': u'Text'})
            self.assertEquals(ret[1], {'id': u'images',
                'text': u'Images'})
コード例 #11
0
    def test_getLanguages(self):
        from collective.flattr.browser.flattr import Flattr

        mocker = Mocker()
        view = Flattr(self.portal, self.layer['request'])

        obj = mocker.patch(view)
        obj.opener
        mocker.result(MockOpener('[{"id": "de_DE", "text": "German"}, {"id": "en_US", "text": "English"}]'))

        with mocker:
            ret = view.getLanguages()

            self.failUnless(isinstance(ret, list))
            self.assertEquals(len(ret), 2)
            self.assertEquals(ret[0], {'id': u'de_DE',
                'text': u'German'})
            self.assertEquals(ret[1], {'id': u'en_US',
                'text': u'English'})
コード例 #12
0
    def test_updateThing_HTTPError(self):
        from collective.flattr.browser.flattr import Flattr

        mocker = Mocker()
        view = Flattr(self.portal, self.layer['request'])

        obj = mocker.patch(view)
        obj.opener
        mocker.result(MockOpener('{ "message": "ok", "description": "Thing was updated successfully" }', verify_data = lambda x: x.get_full_url().endswith('431547') and x.get_data() == 'title=Hello&hidden=True&description=desc&category=cat&language=de_DE&tags=a%2Cb&_method=patch', error=True))

        with mocker:
            ret = view.updateThing(u'Hello',
                431547,
                description='desc',
                category='cat',
                language='de_DE',
                tags='a,b',
                hidden=True)

            self.assertEquals(ret, {})
コード例 #13
0
    def test_createThing_HTTPError(self):
        from collective.flattr.browser.flattr import Flattr

        mocker = Mocker()
        view = Flattr(self.portal, self.layer['request'])

        obj = mocker.patch(view)
        obj.opener
        mocker.result(MockOpener('{ "id": 431547, "link": "https://api.flattr.dev/rest/v2/things/431547", "message": "ok", "description": "Thing was created successfully" }', verify_data = lambda x: x.get_data() == 'title=Hello&hidden=True&url=http%3A%2F%2Flocalhost%2F&description=desc&category=cat&language=de_DE&tags=a%2Cb', error=True))

        with mocker:
            ret = view.createThing(u'Hello',
                url=u'http://localhost/',
                description='desc',
                category='cat',
                language='de_DE',
                tags='a,b',
                hidden=True)

            self.assertEquals(ret, {})
コード例 #14
0
    def test_getAccessToken(self):
        reg = getUtility(IRegistry).forInterface(ICollectiveFlattr)
        reg.customer_key = u'customer'
        reg.customer_secret = u'secret'

        with as_manager(self.portal) as view:
            mocker = Mocker()

            obj = mocker.patch(view)
            obj.opener
            mocker.result(MockOpener('{"access_token":"NEW_ACCESS_TOKEN","token_type":"bearer"}',
                verify_data=lambda x: x.get_full_url()==u'https://flattr.com/oauth/token' and x.data=='{"redirect_uri": "http://nohost/plone/collective_flattr", "code": 1234, "grant_type": "authorization_code"}' and x.headers=={'Content-type': 'application/json'}))

            obj.opener
            mocker.result(MockOpener('{"error":"invalid_request","error_description":"error desc"}',
                error=True,
                verify_data=lambda x: x.get_full_url()==u'https://flattr.com/oauth/token' and x.data=='{"redirect_uri": "http://nohost/plone/collective_flattr", "code": 1234, "grant_type": "authorization_code"}' and x.headers=={'Content-type': 'application/json'}
                ))

            with mocker:
                ret = view.getAccessToken(1234)
                self.failUnless(u'error' not in ret)
                self.failUnless(u'error_description' not in ret)
                self.failUnless(u'access_token' in ret)
                self.failUnless(u'token_type' in ret)

                self.assertEquals(ret['access_token'], u'NEW_ACCESS_TOKEN')
                self.assertEquals(ret['token_type'], u'bearer')

                # second call get an inner status of != 200 and
                # will return None
                ret = view.getAccessToken(1234)
                self.failUnless(u'error' in ret)
                self.failUnless(u'error_description' in ret)
                self.failUnless(u'access_token' not in ret)
                self.failUnless(u'token_type' not in ret)

                self.assertEquals(ret['error'], u'invalid_request')
                self.assertEquals(ret['error_description'], u'error desc')
コード例 #15
0
    def test_getThing_with_next(self):
        from collective.flattr.browser.flattr import Flattr

        mocker = Mocker()
        view = Flattr(self.portal, self.layer['request'])

        obj = mocker.patch(view)
        obj.opener
        mocker.result(MockOpener('[ { "type": "thing", "resource": "https://api.flattr.dev/rest/v2/things/1", "link": "https://flattr.dev/thing/1", "id": 1 }, { "type": "thing", "resource": "https://api.flattr.dev/rest/v2/things/2", "link": "https://flattr.dev/thing/2", "id": 2} ]', verify_data=lambda x: 'count=30&page=' in x.get_data()))
        mocker.count(2)
        # if the same thing is called twice, it is called for the first page
        # and again for the second page. So there is a result, what means that
        # there is a next page

        with mocker:
            ret = view.getThings()
            self.failUnless(u'data' in ret)
            self.failUnless(u'next_page' in ret)

            self.assertTrue(ret['next_page'])

            self.assertEquals(ret['data'][0], { "type": "thing", "resource": "https://api.flattr.dev/rest/v2/things/1", "link": "https://flattr.dev/thing/1", "id": 1 })
            self.assertEquals(ret['data'][1], { "type": "thing", "resource": "https://api.flattr.dev/rest/v2/things/2", "link": "https://flattr.dev/thing/2", "id": 2})
コード例 #16
0
    def test_getThing(self):
        from collective.flattr.browser.flattr import Flattr

        mocker = Mocker()
        view = Flattr(self.portal, self.layer['request'])

        def test_func(x):
            return 'count=30&page=' in x.get_data()
        obj = mocker.patch(view)
        obj.opener
        mocker.result(MockOpener('[ { "type": "thing", "resource": "https://api.flattr.dev/rest/v2/things/1", "link": "https://flattr.dev/thing/1", "id": 1 }, { "type": "thing", "resource": "https://api.flattr.dev/rest/v2/things/2", "link": "https://flattr.dev/thing/2", "id": 2} ]', verify_data=test_func))
        obj.opener
        mocker.result(MockOpener('', verify_data=test_func, error=True))

        with mocker:
            ret = view.getThings()
            self.failUnless(u'data' in ret)
            self.failUnless(u'next_page' in ret)

            self.assertFalse(ret['next_page'])

            self.assertEquals(ret['data'][0], { "type": "thing", "resource": "https://api.flattr.dev/rest/v2/things/1", "link": "https://flattr.dev/thing/1", "id": 1 })
            self.assertEquals(ret['data'][1], { "type": "thing", "resource": "https://api.flattr.dev/rest/v2/things/2", "link": "https://flattr.dev/thing/2", "id": 2})
コード例 #17
0
ファイル: test_application.py プロジェクト: youngrok/editxt
 def test(eds_config, ud_is_none=False):
     ac = Application()
     m = Mocker()
     df_class = m.replace("editxt.application.NSUserDefaults")
     eds = []
     mac = m.patch(ac)
     mac.iter_editors() >> eds
     settings = []
     for i, ed_config in enumerate(eds_config):
         ed = m.mock(Editor)
         eds.append(ed)
         serial = ed.serialize() >> (("<serial %s>" % i)
             if ed_config else None)
         if serial:
             settings.append(serial)
     ud = m.mock(NSUserDefaults)
     if ud_is_none:
         df_class.standardUserDefaults() >> ud
         args = ()
     else:
         args = (ud,)
     ud.setObject_forKey_(settings, const.WINDOW_CONTROLLERS_DEFAULTS_KEY)
     with m:
         ac.save_open_projects(*args)
コード例 #18
0
class OAuthTwitterTest(TestCase):
    urls = 'django_oauth_twitter.test_urls'

    def setUp(self):
        self.mocker = Mocker()
        self.password = User.objects.create_user('password', '', 'password')
        self.twitter = User.objects.create_user('twitter', '', 'twitter')
        json = '{"screen_name": "twitter"}'
        self.twitter_user = TwitterUser.objects.create(user=self.twitter,
                                                       twitter_id=1,
                                                       userinfo_json=json)
        # Replace TEMPLATE lookups
        self.old_template_dirs = settings.TEMPLATE_DIRS
        settings.TEMPLATE_DIRS = (os.path.join(os.path.dirname(__file__),
                                               'templates'),)
        self.old_template_loaders = settings.TEMPLATE_LOADERS
        settings.TEMPLATE_LOADERS = (
            'django.template.loaders.filesystem.load_template_source',
        )
        django.template.loader.template_source_loaders = None
        # Replace LOGIN_URL and LOGIN_REDIRECT_URL
        self.old_login_url = settings.LOGIN_URL
        settings.LOGIN_URL = '/login/'
        self.old_login_redirect_url = settings.LOGIN_REDIRECT_URL
        settings.LOGIN_REDIRECT_URL = '/home/'
        self.old_login_redirect_urlname = getattr(settings,
                                                  'LOGIN_REDIRECT_URLNAME',
                                                  None)
        settings.LOGIN_REDIRECT_URLNAME = None

    def tearDown(self):
        # Restore TEMPLATE lookups
        settings.TEMPLATE_DIRS = self.old_template_dirs
        settings.TEMPLATE_LOADERS = self.old_template_loaders
        django.template.loader.template_source_loaders = None
        # Restore LOGIN_URL and LOGIN_REDIRECT_URL
        settings.LOGIN_URL = self.old_login_url
        settings.LOGIN_REDIRECT_URL = self.old_login_redirect_url
        settings.LOGIN_REDIRECT_URLNAME = self.old_login_redirect_urlname

    def test_association_anonymous(self):
        import django
        # Ensure we need a login.
        url = reverse('twitter_associate')
        login_url = settings.LOGIN_URL
        if django.VERSION < (1, 2):
            login_url = self.old_login_url
        response = self.client.get(url)
        self.assertEqual(
            response['Location'],
            'http://testserver%s?next=%s' % (login_url,
                                             quote('http://testserver' + url))
        )

    def test_association_user_add(self):
        # User adds association.
        self.assertRaises(TwitterUser.DoesNotExist,
                          TwitterUser.objects.get, user=self.password)
        self.assertTrue(self.client.login(username=self.password.username,
                                          password=self.password.username))
        Api = self.mocker.replace(TwitterApi)
        Api().getRequestToken()
        self.mocker.result(TOKEN)
        Api(ANY).getAccessToken()
        self.mocker.result(TOKEN)
        userinfo = self.mocker.mock()
        userinfo.id
        self.mocker.result('2')
        userinfo.AsJsonString()
        self.mocker.result('{"id": 2}')
        self.mocker.count(1, 3)
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        with self.mocker:
            # User goes off to Twitter and gets redirected back to callback
            response = self.client.get(reverse('twitter_signin_associate'))
            self.assertEqual(response.status_code, 302)
            session = self.client.session
            session[REQUEST_KEY] = TOKEN.to_string()
            session.save()
            response = self.client.get(reverse(oauthtwitter.callback),
                                       {'oauth_token': TOKEN.key},
                                       follow=True)
            self.assertEqual(
                response.redirect_chain,
                [('http://testserver/twitter/associate/', 302)]
            )
            self.assertEqual(response.status_code, 200)

    def test_association_user_remove(self):
        # User removes association.
        self.assertRaises(TwitterUser.DoesNotExist,
                          TwitterUser.objects.get, user=self.password)
        self.assertTrue(self.client.login(username=self.password.username,
                                          password=self.password.username))
        response = self.client.post(reverse('twitter_associate'),
                                    {'action': 'remove',
                                     'twitter_id': '1'})
        self.assertEqual(response.status_code, 200)
        self.assertRaises(TwitterUser.DoesNotExist,
                          TwitterUser.objects.get, user=self.password)
        response = self.client.post(reverse('twitter_associate'))
        self.assertEqual(response.status_code, 200)
        self.assertRaises(TwitterUser.DoesNotExist,
                          TwitterUser.objects.get, user=self.password)

    def test_association_associated_add(self):
        # Associated adds association.
        self.assertTrue(self.twitter.twitter)
        self.assertTrue(self.client.login(username=self.twitter.username,
                                          password=self.twitter.username))
        Api = self.mocker.replace(TwitterApi)
        Api().getRequestToken()
        self.mocker.result(TOKEN)
        Api(ANY).getAccessToken()
        self.mocker.result(TOKEN)
        userinfo = self.mocker.mock()
        userinfo.id
        self.mocker.result('2')
        userinfo.AsJsonString()
        self.mocker.result('{}')
        self.mocker.count(1, 3)
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        with self.mocker:
            # User goes off to Twitter and gets redirected back to callback
            response = self.client.get(reverse('twitter_signin_associate'))
            self.assertEqual(response.status_code, 302)
            session = self.client.session
            session[REQUEST_KEY] = TOKEN.to_string()
            session.save()
            response = self.client.get(reverse(oauthtwitter.callback),
                                       {'oauth_token': TOKEN.key})
            self.assertEqual(response['Location'],
                             'http://testserver/twitter/associate/'
                             '?user=twitter&error=user_already_linked')

    def test_association_associated_remove(self):
        Api = self.mocker.replace(TwitterApi)
        userinfo = self.mocker.mock()
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        with self.mocker:
            # Associated removes association.
            self.assertTrue(self.twitter.twitter)
            self.assertTrue(self.client.login(username=self.twitter.username,
                                              password=self.twitter.username))
            response = self.client.post(reverse('twitter_associate'))
            self.assertEqual(response.status_code, 200)
            self.assertTrue(TwitterUser.objects.get(user=self.twitter))
            response = self.client.post(reverse('twitter_associate'),
                                        {'action': 'remove',
                                         'twitter_id': '1'})
            self.assertEqual(response.status_code, 200)
            self.assertRaises(TwitterUser.DoesNotExist,
                              TwitterUser.objects.get, user=self.twitter)


    def test_association_user_revoked(self):
        # User visits associate after revoking their Twitter credentials.
        self.assertTrue(self.twitter.twitter)
        self.assertTrue(self.client.login(username=self.twitter.username,
                                          password=self.twitter.username))
        Api = self.mocker.replace(TwitterApi)
        Api(ANY).GetUserInfo()
        self.mocker.throw(HTTPError('url', 401, '', {}, None))
        with self.mocker:
            # User goes off to Twitter and gets redirected back to callback
            session = self.client.session
            session[REQUEST_KEY] = TOKEN.to_string()
            session.save()
            response = self.client.get(reverse('twitter_associate'))
            self.assertEqual(response.status_code, 200)

    def test_callback(self):
        # User goes directly to the callback page.
        response = self.client.get(reverse(oauthtwitter.callback))
        self.assertEqual(response['Location'],
                         'http://testserver%s' % settings.LOGIN_URL)
        # User goes directly to the callback page. but tampers with oauth_token
        response = self.client.get(reverse(oauthtwitter.callback),
                                   {'oauth_token': 'bad'})
        self.assertEqual(response['Location'],
                         'http://testserver%s' % settings.LOGIN_URL)
        # User comes in through Twitter OAuth, but tampers with oauth_token
        o = self.mocker.patch(oauthtwitter)
        request = self.mocker.mock()
        request.GET
        self.mocker.result({'oauth_token': 'bad'})
        request.session
        self.mocker.result({})
        self.mocker.count(1, None)
        request.twitter_request_token
        self.mocker.result(TOKEN)
        # New user comes in through Twitter OAuth
        request.GET
        self.mocker.result({'oauth_token': 'a'})
        request.twitter_request_token
        self.mocker.result(TOKEN)
        Api = self.mocker.replace(TwitterApi)
        Api(TOKEN).getAccessToken()
        self.mocker.result(TOKEN)
        request.twitter_access_token = ANY
        request.user
        self.mocker.result(AnonymousUser())
        userinfo = self.mocker.mock()
        cui = self.mocker.replace(cached_user_info)
        cui(request, TOKEN)
        self.mocker.result(userinfo)
        o._authenticate(userinfo=userinfo)
        self.mocker.result(None)
        # Existing user comes in through Twitter OAuth
        request.GET
        self.mocker.result({'oauth_token': 'a'})
        request.twitter_request_token
        self.mocker.result(TOKEN)
        Api(TOKEN).getAccessToken()
        self.mocker.result(TOKEN)
        request.twitter_access_token = ANY
        request.user
        self.mocker.result(User.objects.get(username='******'))
        self.mocker.count(1, 2)
        cui(request, TOKEN)
        self.mocker.result(userinfo)
        self.mocker.count(1, 2)
        userinfo.id
        self.mocker.result(3)
        userinfo.AsJsonString()
        self.mocker.result('{}')
        with self.mocker:
            response = o.callback(request)
            self.assertEqual(response['Location'], settings.LOGIN_URL)
            response = o.callback(request)
            self.assertEqual(response['Location'],
                             reverse(oauthtwitter.register))
            response = o.callback(request)
            self.assertEqual(response['Location'], '/home/')

    def test_signin(self):
        response = self.client.get(reverse('twitter_signin'))
        prefix = 'http://twitter.com/oauth/authenticate?'
        self.assertTrue(response['Location'].startswith(prefix),
                        response['Location'])

    def test_register(self):
        # User goes directly to the register page.
        response = self.client.get(reverse(oauthtwitter.register))
        self.assertTrue(response['Location'], settings.LOGIN_URL)
        # User is logged in
        self.assertTrue(self.client.login(username='******',
                                          password='******'))
        response = self.client.get(reverse(oauthtwitter.register))
        self.assertEqual(response['Location'],
                         'http://testserver%s' % settings.LOGIN_REDIRECT_URL)
        # New user comes in through Twitter
        request = self.mocker.mock()
        request.user
        self.mocker.result(AnonymousUser())
        self.mocker.count(1, None)
        RC = self.mocker.replace('django.template.RequestContext')
        RC(ANY)
        self.mocker.result({})
        request.twitter_access_token
        self.mocker.result(TOKEN)
        userinfo = self.mocker.mock()
        userinfo.screen_name
        self.mocker.result('unknown')
        request.twitter_userinfo
        self.mocker.result(userinfo)
        request.method
        self.mocker.result('GET')
        # New user posts form through Twitter
        request.twitter_access_token
        self.mocker.result(TOKEN)
        userinfo.id
        self.mocker.result(2)
        userinfo.screen_name
        self.mocker.result('unknown')
        userinfo.AsJsonString()
        self.mocker.result('{}')
        request.twitter_userinfo
        self.mocker.result(userinfo)
        request.method
        self.mocker.result('POST')
        request.POST
        self.mocker.result({'username': '******'})
        o = self.mocker.patch(oauthtwitter)
        o._login_and_redirect(request=request, user=ANY)
        self.mocker.result('New user')
        with self.mocker:
            response = oauthtwitter.register(request)
            self.assertEqual(response.status_code, 200)
            response = o.register(request)
            self.assertEqual(response, 'New user')
            self.assertTrue(User.objects.get(username='******'))

    def test_authenticate(self):
        # Associated Twitter user
        twitter = self.mocker.mock()
        twitter.id
        self.mocker.result(1)
        # Unknown Twitter uesr
        unknown = self.mocker.mock()
        unknown.id
        self.mocker.result(2)
        with self.mocker:
            self.assertEqual(oauthtwitter._authenticate(twitter),
                             User.objects.get(username="******"))
            self.assertEqual(oauthtwitter._authenticate(unknown), None)

    def test_create_user(self):
        o = self.mocker.patch(oauthtwitter)
        request = self.mocker.mock()
        # User already logged in
        request.user.is_anonymous()
        self.mocker.result(False)
        o._login_and_redirect(request=request, user=None)
        self.mocker.result('Logged in')
        # Anonymous user with new User
        request.user.is_anonymous()
        self.mocker.result(True)
        request.twitter_access_token
        self.mocker.result(TOKEN)
        unknown = self.mocker.mock()
        unknown.id
        self.mocker.result(2)
        unknown.screen_name
        self.mocker.result("unknown")
        unknown.AsJsonString()
        self.mocker.result('{}')
        request.twitter_userinfo
        self.mocker.result(unknown)
        o._login_and_redirect(request=request,
                              user=MATCH(lambda x: isinstance(x, User)))
        self.mocker.result('New user')
        # Anonymous user with existing User
        request.user.is_anonymous()
        self.mocker.result(True)
        request.twitter_access_token
        self.mocker.result(TOKEN)
        twitter = self.mocker.mock()
        twitter.screen_name
        self.mocker.result("twitter")
        request.twitter_userinfo
        self.mocker.result(twitter)
        with self.mocker:
            response = o._create_user(request)
            self.assertEqual(response, 'Logged in')
            response = o._create_user(request)
            self.assertEqual(response, 'New user')
            response = o._create_user(request)
            self.assertEqual(response['Location'], '/twitter/register/')

    def test_login_and_redirect(self):
        o = self.mocker.patch(oauthtwitter)
        request = self.mocker.mock()
        # User already logged in
        twitter = User.objects.get(username='******')
        request.user
        self.mocker.result(twitter)
        # No User to log in
        True
        # Login a Twitter user
        o._login(request, twitter)
        request.user
        self.mocker.result(AnonymousUser())
        request.twitter_access_token
        self.mocker.result(TOKEN)
        userinfo = self.mocker.mock()
        userinfo.AsJsonString()
        self.mocker.result('{}')
        request.twitter_userinfo
        self.mocker.result(userinfo)
        request.session
        self.mocker.result({SUCCESS_URL_KEY: (TOKEN, '/home/')})
        request.twitter_request_token
        self.mocker.result(TOKEN)
        with self.mocker:
            response = o._login_and_redirect(request, user=True)
            self.assertEqual(response['Location'], settings.LOGIN_REDIRECT_URL)
            response = o._login_and_redirect(request, user=None)
            self.assertEqual(response['Location'], settings.LOGIN_URL)
            response = o._login_and_redirect(request, user=twitter)
            self.assertEqual(response['Location'], '/home/')
            self.assertEqual(str(twitter.twitter.access_token), str(TOKEN))
            self.assertEqual(twitter.twitter.userinfo_json, '{}')

    def test_on_new_user(self):
        # With auto_create_user
        request = self.mocker.mock()
        a = self.mocker.patch(OAuthTwitter(auto_create_user=True))
        a._create_user(request)
        self.mocker.result('auto_create')
        # Without
        b = self.mocker.patch(oauthtwitter)
        with self.mocker:
            response = a._on_new_user(request)
            self.assertEqual(response, 'auto_create')
            response = b._on_new_user(request)
            self.assertEqual(response['Location'], '/twitter/register/')

    def test_redirect_to_login(self):
        response = oauthtwitter._redirect_to_login(None)
        self.assertEqual(response['Location'], settings.LOGIN_URL)
コード例 #19
0
class OAuthTwitterTest(TestCase):
    urls = 'django_oauth_twitter.test_urls'

    def setUp(self):
        self.mocker = Mocker()
        self.password = User.objects.create_user('password', '', 'password')
        self.twitter = User.objects.create_user('twitter', '', 'twitter')
        json = '{"screen_name": "twitter"}'
        self.twitter_user = TwitterUser.objects.create(user=self.twitter,
                                                       twitter_id=1,
                                                       userinfo_json=json)
        # Replace TEMPLATE lookups
        self.old_template_dirs = settings.TEMPLATE_DIRS
        settings.TEMPLATE_DIRS = (os.path.join(os.path.dirname(__file__),
                                               'templates'), )
        self.old_template_loaders = settings.TEMPLATE_LOADERS
        settings.TEMPLATE_LOADERS = (
            'django.template.loaders.filesystem.load_template_source', )
        django.template.loader.template_source_loaders = None
        # Replace LOGIN_URL and LOGIN_REDIRECT_URL
        self.old_login_url = settings.LOGIN_URL
        settings.LOGIN_URL = '/login/'
        self.old_login_redirect_url = settings.LOGIN_REDIRECT_URL
        settings.LOGIN_REDIRECT_URL = '/home/'
        self.old_login_redirect_urlname = getattr(settings,
                                                  'LOGIN_REDIRECT_URLNAME',
                                                  None)
        settings.LOGIN_REDIRECT_URLNAME = None

    def tearDown(self):
        # Restore TEMPLATE lookups
        settings.TEMPLATE_DIRS = self.old_template_dirs
        settings.TEMPLATE_LOADERS = self.old_template_loaders
        django.template.loader.template_source_loaders = None
        # Restore LOGIN_URL and LOGIN_REDIRECT_URL
        settings.LOGIN_URL = self.old_login_url
        settings.LOGIN_REDIRECT_URL = self.old_login_redirect_url
        settings.LOGIN_REDIRECT_URLNAME = self.old_login_redirect_urlname

    def test_association_anonymous(self):
        import django
        # Ensure we need a login.
        url = reverse('twitter_associate')
        login_url = settings.LOGIN_URL
        if django.VERSION < (1, 2):
            login_url = self.old_login_url
        response = self.client.get(url)
        self.assertEqual(
            response['Location'], 'http://testserver%s?next=%s' %
            (login_url, quote('http://testserver' + url)))

    def test_association_user_add(self):
        # User adds association.
        self.assertRaises(TwitterUser.DoesNotExist,
                          TwitterUser.objects.get,
                          user=self.password)
        self.assertTrue(
            self.client.login(username=self.password.username,
                              password=self.password.username))
        Api = self.mocker.replace(TwitterApi)
        Api().getRequestToken()
        self.mocker.result(TOKEN)
        Api(ANY).getAccessToken()
        self.mocker.result(TOKEN)
        userinfo = self.mocker.mock()
        userinfo.id
        self.mocker.result('2')
        userinfo.AsJsonString()
        self.mocker.result('{"id": 2}')
        self.mocker.count(1, 3)
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        with self.mocker:
            # User goes off to Twitter and gets redirected back to callback
            response = self.client.get(reverse('twitter_signin_associate'))
            self.assertEqual(response.status_code, 302)
            session = self.client.session
            session[REQUEST_KEY] = TOKEN.to_string()
            session.save()
            response = self.client.get(reverse(oauthtwitter.callback),
                                       {'oauth_token': TOKEN.key},
                                       follow=True)
            self.assertEqual(response.redirect_chain,
                             [('http://testserver/twitter/associate/', 302)])
            self.assertEqual(response.status_code, 200)

    def test_association_user_remove(self):
        # User removes association.
        self.assertRaises(TwitterUser.DoesNotExist,
                          TwitterUser.objects.get,
                          user=self.password)
        self.assertTrue(
            self.client.login(username=self.password.username,
                              password=self.password.username))
        response = self.client.post(reverse('twitter_associate'), {
            'action': 'remove',
            'twitter_id': '1'
        })
        self.assertEqual(response.status_code, 200)
        self.assertRaises(TwitterUser.DoesNotExist,
                          TwitterUser.objects.get,
                          user=self.password)
        response = self.client.post(reverse('twitter_associate'))
        self.assertEqual(response.status_code, 200)
        self.assertRaises(TwitterUser.DoesNotExist,
                          TwitterUser.objects.get,
                          user=self.password)

    def test_association_associated_add(self):
        # Associated adds association.
        self.assertTrue(self.twitter.twitter)
        self.assertTrue(
            self.client.login(username=self.twitter.username,
                              password=self.twitter.username))
        Api = self.mocker.replace(TwitterApi)
        Api().getRequestToken()
        self.mocker.result(TOKEN)
        Api(ANY).getAccessToken()
        self.mocker.result(TOKEN)
        userinfo = self.mocker.mock()
        userinfo.id
        self.mocker.result('2')
        userinfo.AsJsonString()
        self.mocker.result('{}')
        self.mocker.count(1, 3)
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        with self.mocker:
            # User goes off to Twitter and gets redirected back to callback
            response = self.client.get(reverse('twitter_signin_associate'))
            self.assertEqual(response.status_code, 302)
            session = self.client.session
            session[REQUEST_KEY] = TOKEN.to_string()
            session.save()
            response = self.client.get(reverse(oauthtwitter.callback),
                                       {'oauth_token': TOKEN.key})
            self.assertEqual(
                response['Location'], 'http://testserver/twitter/associate/'
                '?user=twitter&error=user_already_linked')

    def test_association_associated_remove(self):
        Api = self.mocker.replace(TwitterApi)
        userinfo = self.mocker.mock()
        Api(ANY).GetUserInfo()
        self.mocker.result(userinfo)
        with self.mocker:
            # Associated removes association.
            self.assertTrue(self.twitter.twitter)
            self.assertTrue(
                self.client.login(username=self.twitter.username,
                                  password=self.twitter.username))
            response = self.client.post(reverse('twitter_associate'))
            self.assertEqual(response.status_code, 200)
            self.assertTrue(TwitterUser.objects.get(user=self.twitter))
            response = self.client.post(reverse('twitter_associate'), {
                'action': 'remove',
                'twitter_id': '1'
            })
            self.assertEqual(response.status_code, 200)
            self.assertRaises(TwitterUser.DoesNotExist,
                              TwitterUser.objects.get,
                              user=self.twitter)

    def test_association_user_revoked(self):
        # User visits associate after revoking their Twitter credentials.
        self.assertTrue(self.twitter.twitter)
        self.assertTrue(
            self.client.login(username=self.twitter.username,
                              password=self.twitter.username))
        Api = self.mocker.replace(TwitterApi)
        Api(ANY).GetUserInfo()
        self.mocker.throw(HTTPError('url', 401, '', {}, None))
        with self.mocker:
            # User goes off to Twitter and gets redirected back to callback
            session = self.client.session
            session[REQUEST_KEY] = TOKEN.to_string()
            session.save()
            response = self.client.get(reverse('twitter_associate'))
            self.assertEqual(response.status_code, 200)

    def test_callback(self):
        # User goes directly to the callback page.
        response = self.client.get(reverse(oauthtwitter.callback))
        self.assertEqual(response['Location'],
                         'http://testserver%s' % settings.LOGIN_URL)
        # User goes directly to the callback page. but tampers with oauth_token
        response = self.client.get(reverse(oauthtwitter.callback),
                                   {'oauth_token': 'bad'})
        self.assertEqual(response['Location'],
                         'http://testserver%s' % settings.LOGIN_URL)
        # User comes in through Twitter OAuth, but tampers with oauth_token
        o = self.mocker.patch(oauthtwitter)
        request = self.mocker.mock()
        request.GET
        self.mocker.result({'oauth_token': 'bad'})
        request.session
        self.mocker.result({})
        self.mocker.count(1, None)
        request.twitter_request_token
        self.mocker.result(TOKEN)
        # New user comes in through Twitter OAuth
        request.GET
        self.mocker.result({'oauth_token': 'a'})
        request.twitter_request_token
        self.mocker.result(TOKEN)
        Api = self.mocker.replace(TwitterApi)
        Api(TOKEN).getAccessToken()
        self.mocker.result(TOKEN)
        request.twitter_access_token = ANY
        request.user
        self.mocker.result(AnonymousUser())
        userinfo = self.mocker.mock()
        cui = self.mocker.replace(cached_user_info)
        cui(request, TOKEN)
        self.mocker.result(userinfo)
        o._authenticate(userinfo=userinfo)
        self.mocker.result(None)
        # Existing user comes in through Twitter OAuth
        request.GET
        self.mocker.result({'oauth_token': 'a'})
        request.twitter_request_token
        self.mocker.result(TOKEN)
        Api(TOKEN).getAccessToken()
        self.mocker.result(TOKEN)
        request.twitter_access_token = ANY
        request.user
        self.mocker.result(User.objects.get(username='******'))
        self.mocker.count(1, 2)
        cui(request, TOKEN)
        self.mocker.result(userinfo)
        self.mocker.count(1, 2)
        userinfo.id
        self.mocker.result(3)
        userinfo.AsJsonString()
        self.mocker.result('{}')
        with self.mocker:
            response = o.callback(request)
            self.assertEqual(response['Location'], settings.LOGIN_URL)
            response = o.callback(request)
            self.assertEqual(response['Location'],
                             reverse(oauthtwitter.register))
            response = o.callback(request)
            self.assertEqual(response['Location'], '/home/')

    def test_signin(self):
        response = self.client.get(reverse('twitter_signin'))
        prefix = 'http://twitter.com/oauth/authenticate?'
        self.assertTrue(response['Location'].startswith(prefix),
                        response['Location'])

    def test_register(self):
        # User goes directly to the register page.
        response = self.client.get(reverse(oauthtwitter.register))
        self.assertTrue(response['Location'], settings.LOGIN_URL)
        # User is logged in
        self.assertTrue(
            self.client.login(username='******', password='******'))
        response = self.client.get(reverse(oauthtwitter.register))
        self.assertEqual(response['Location'],
                         'http://testserver%s' % settings.LOGIN_REDIRECT_URL)
        # New user comes in through Twitter
        request = self.mocker.mock()
        request.user
        self.mocker.result(AnonymousUser())
        self.mocker.count(1, None)
        RC = self.mocker.replace('django.template.RequestContext')
        RC(ANY)
        self.mocker.result({})
        request.twitter_access_token
        self.mocker.result(TOKEN)
        userinfo = self.mocker.mock()
        userinfo.screen_name
        self.mocker.result('unknown')
        request.twitter_userinfo
        self.mocker.result(userinfo)
        request.method
        self.mocker.result('GET')
        # New user posts form through Twitter
        request.twitter_access_token
        self.mocker.result(TOKEN)
        userinfo.id
        self.mocker.result(2)
        userinfo.screen_name
        self.mocker.result('unknown')
        userinfo.AsJsonString()
        self.mocker.result('{}')
        request.twitter_userinfo
        self.mocker.result(userinfo)
        request.method
        self.mocker.result('POST')
        request.POST
        self.mocker.result({'username': '******'})
        o = self.mocker.patch(oauthtwitter)
        o._login_and_redirect(request=request, user=ANY)
        self.mocker.result('New user')
        with self.mocker:
            response = oauthtwitter.register(request)
            self.assertEqual(response.status_code, 200)
            response = o.register(request)
            self.assertEqual(response, 'New user')
            self.assertTrue(User.objects.get(username='******'))

    def test_authenticate(self):
        # Associated Twitter user
        twitter = self.mocker.mock()
        twitter.id
        self.mocker.result(1)
        # Unknown Twitter uesr
        unknown = self.mocker.mock()
        unknown.id
        self.mocker.result(2)
        with self.mocker:
            self.assertEqual(oauthtwitter._authenticate(twitter),
                             User.objects.get(username="******"))
            self.assertEqual(oauthtwitter._authenticate(unknown), None)

    def test_create_user(self):
        o = self.mocker.patch(oauthtwitter)
        request = self.mocker.mock()
        # User already logged in
        request.user.is_anonymous()
        self.mocker.result(False)
        o._login_and_redirect(request=request, user=None)
        self.mocker.result('Logged in')
        # Anonymous user with new User
        request.user.is_anonymous()
        self.mocker.result(True)
        request.twitter_access_token
        self.mocker.result(TOKEN)
        unknown = self.mocker.mock()
        unknown.id
        self.mocker.result(2)
        unknown.screen_name
        self.mocker.result("unknown")
        unknown.AsJsonString()
        self.mocker.result('{}')
        request.twitter_userinfo
        self.mocker.result(unknown)
        o._login_and_redirect(request=request,
                              user=MATCH(lambda x: isinstance(x, User)))
        self.mocker.result('New user')
        # Anonymous user with existing User
        request.user.is_anonymous()
        self.mocker.result(True)
        request.twitter_access_token
        self.mocker.result(TOKEN)
        twitter = self.mocker.mock()
        twitter.screen_name
        self.mocker.result("twitter")
        request.twitter_userinfo
        self.mocker.result(twitter)
        with self.mocker:
            response = o._create_user(request)
            self.assertEqual(response, 'Logged in')
            response = o._create_user(request)
            self.assertEqual(response, 'New user')
            response = o._create_user(request)
            self.assertEqual(response['Location'], '/twitter/register/')

    def test_login_and_redirect(self):
        o = self.mocker.patch(oauthtwitter)
        request = self.mocker.mock()
        # User already logged in
        twitter = User.objects.get(username='******')
        request.user
        self.mocker.result(twitter)
        # No User to log in
        True
        # Login a Twitter user
        o._login(request, twitter)
        request.user
        self.mocker.result(AnonymousUser())
        request.twitter_access_token
        self.mocker.result(TOKEN)
        userinfo = self.mocker.mock()
        userinfo.AsJsonString()
        self.mocker.result('{}')
        request.twitter_userinfo
        self.mocker.result(userinfo)
        request.session
        self.mocker.result({SUCCESS_URL_KEY: (TOKEN, '/home/')})
        request.twitter_request_token
        self.mocker.result(TOKEN)
        with self.mocker:
            response = o._login_and_redirect(request, user=True)
            self.assertEqual(response['Location'], settings.LOGIN_REDIRECT_URL)
            response = o._login_and_redirect(request, user=None)
            self.assertEqual(response['Location'], settings.LOGIN_URL)
            response = o._login_and_redirect(request, user=twitter)
            self.assertEqual(response['Location'], '/home/')
            self.assertEqual(str(twitter.twitter.access_token), str(TOKEN))
            self.assertEqual(twitter.twitter.userinfo_json, '{}')

    def test_on_new_user(self):
        # With auto_create_user
        request = self.mocker.mock()
        a = self.mocker.patch(OAuthTwitter(auto_create_user=True))
        a._create_user(request)
        self.mocker.result('auto_create')
        # Without
        b = self.mocker.patch(oauthtwitter)
        with self.mocker:
            response = a._on_new_user(request)
            self.assertEqual(response, 'auto_create')
            response = b._on_new_user(request)
            self.assertEqual(response['Location'], '/twitter/register/')

    def test_redirect_to_login(self):
        response = oauthtwitter._redirect_to_login(None)
        self.assertEqual(response['Location'], settings.LOGIN_URL)
コード例 #20
0
class TestControlPanel(unittest.TestCase):

    layer = COLLECTIVE_FLATTR_INTEGRATION_TESTING



    def setUp(self):
        self.portal = self.layer['portal']
        setRoles(self.portal, TEST_USER_ID, ('Manager',))

        self.reg = getUtility(IRegistry).forInterface(ICollectiveFlattr)
        self.mocker = None
        alsoProvides(self.layer['request'], IFormLayer)


    def tearDown(self):
        if self.mocker:
            self.mocker.reset()

    def test_test_access_token_fail(self):
        self.reg.access_token = u'NEW'
        self.reg.access_token_type = u'Bearer'
        self.mocker = Mocker()

        flattr_view = self.mocker.patch(Flattr)

        flattr_view.opener
        self.mocker.result(MockOpener('{"error": "unauthorized", "error_description": "Hello World"}', error=True, verify_data=lambda x: x.get_full_url()==u'https://api.flattr.com/rest/v2/user' and x.headers=={'Content-type':'application/json'}))

        self.layer['request'].form = {'form.button.TestAccessToken': True}
        with controlpanel(self.portal, self.layer['request']) as view:
            with self.mocker:
                ret = view()

                self.failUnless(u'Configured access token does not work :(' in ret)
                self.failUnless(u'error' in ret)

                self.assertEquals(view.test_access_token,
                    u'Configured access token does not work :(')


    def test_test_access_token_success(self):
        self.reg.access_token = u'NEW'
        self.reg.access_token_type = u'Bearer'
        self.reg.customer_key = u'Key'
        self.reg.customer_secret = u'Secret'
        self.mocker = Mocker()

        flattr_view = self.mocker.patch(Flattr)

        flattr_view.opener
        self.mocker.result(MockOpener('{"username": "******"}', verify_data=lambda x: x.get_full_url()==u'https://api.flattr.com/rest/v2/user' and x.headers=={'Content-type':'application/json'}))

        self.layer['request'].form = {'form.button.TestAccessToken': True}
        with controlpanel(self.portal, self.layer['request']) as view:
            with self.mocker:
                ret = view()

                self.failUnless(u'username' in ret)
                self.failUnless(u'Hello World' in ret)
                self.failUnless(u'username' in view.test_access_token)
                self.failUnless(u'Hello World' in view.test_access_token)

                # call again. without access token
                self.reg.access_token = u''
                self.reg.access_token_type = u''
                ret = view()

                self.failUnless(u'error' in ret)
                self.failUnless(u'No access token configured' in ret)

    def test_authenticate(self):
        self.reg.customer_key = u'Key'
        self.reg.customer_secret = u'Secret'

        self.layer['request'].form = {'form.button.AcquireToken': True}
        with controlpanel(self.portal, self.layer['request']) as view:
            self.reg.customer_key = u''
            ret = view()

            self.failUnless(u'error' in ret)
            self.failUnless(u'Unable to create authorize '
                'url. consumer and consumer_secret not configured :(' in ret)

            # call again for success
            self.reg.customer_key = u'consumer'
            ret = view()

            self.assertEquals(ret, None)
            redirect = self.layer['request'].response.headers['location']
            
            self.failUnless(redirect.startswith(self.reg.authorize_url))
            self.failUnless(u'collective_flattr' in redirect)
            self.failUnless(u'client_id=consumer' in redirect)
            self.failUnless(u'redirect_uri' in redirect)
            self.failUnless(u'scope=thing' in redirect)
            self.failUnless(u'response_type=code' in redirect)

    def test_clear_access_token(self):
        self.layer['request'].form = {'form.button.ClearAccessToken': True}
        self.reg.access_token = u'my access token'
        self.reg.access_token_type = u'my access token secret'
        with controlpanel(self.portal, self.layer['request']) as view:
            ret = view()

            self.failUnless(u'info' in ret)
            self.failUnless(u'Cleared access token' in ret)

            self.assertEquals(self.reg.access_token, u'')
            self.assertEquals(self.reg.access_token_type, u'')