def test_find_match_not_matched(self):
        key1 = "chr1:154000-230000"
        mocker = Mocker()

        junction = mocker.mock()
        junction.coverage
        mocker.result(40)

        container1 = mocker.mock()
        container2 = mocker.mock()

        container1.keys()
        mocker.result([key1])

        container1[key1]
        mocker.result(junction)

        container2[key1]
        mocker.throw(KeyError)
        mocker.count(1)

        mocker.replay()

        self.common, self.diff = jc.findMatch(container1, container2)
        self.assertEqual(self.common.keys(), [])
        self.assertEqual(self.diff.keys(), [key1])

        mocker.restore()
        mocker.verify()
Exemple #2
0
    def test_find_match_not_matched(self):
        key1 = 'chr1:154000-230000'
        mocker = Mocker()

        junction = mocker.mock()
        junction.coverage
        mocker.result(40)

        container1 = mocker.mock()
        container2 = mocker.mock()

        container1.keys()
        mocker.result([key1])

        container1[key1]
        mocker.result(junction)

        container2[key1]
        mocker.throw(KeyError)
        mocker.count(1)

        mocker.replay()

        self.common, self.diff = jc.findMatch(container1, container2)
        self.assertEqual(self.common.keys(), [])
        self.assertEqual(self.diff.keys(), [key1])

        mocker.restore()
        mocker.verify()
Exemple #3
0
 def test(serial):
     m = Mocker()
     proj = Project.create()
     log = m.replace("editxt.project.log", passthrough=False)
     nsdat = m.replace(NSData, passthrough=False)
     nspls = m.replace(NSPropertyListSerialization, passthrough=False)
     create_document_view_with_state = m.method(Project.create_document_view_with_state)
     create_document_view = m.method(Project.create_document_view)
     proj._documents = docs = m.mock(KVOList)
     if "path" in serial:
         data = nsdat.dataWithContentsOfFile_(serial["path"]) >> m.mock()
         serial_, format, error = nspls. \
             propertyListFromData_mutabilityOption_format_errorDescription_( \
                 data, NSPropertyListImmutable, None, None) >> ({}, m.mock(), None)
     else:
         serial_ = serial
     docs_ = serial_.get("documents", [])
     for item in docs_:
         create_document_view_with_state(item)
         if item == "doc_not_found":
             m.throw(Exception("document not found"))
             log.warn("cannot open document: %r" % item)
         #proj._is_dirty = True
     bool(docs); m.result(bool(docs_))
     if not docs_:
         create_document_view()
         #proj._is_dirty = True
     with m:
         proj.deserialize(serial)
         if "path" in serial:
             eq_(proj.path, serial["path"])
             assert "name" not in serial
         else:
             eq_(proj.name, serial.get("name", const.UNTITLED_PROJECT_NAME))
             eq_(proj.expanded, serial.get("expanded", True))
Exemple #4
0
def test_order_not_filled():
    order = Order("item #1", 1)

    mocker = Mocker()
    inventory = mocker.mock()
    inventory.remove("item #1", 1)
    mocker.throw(QuantityError)

    mocker.replay()
    order.fill(inventory)

    mocker.verify()
    assert not order.filled
def test_selenium_driver_raises_on_start_test_when_selenium_cant_start():
    
    mocker = Mocker()
    
    context = Context(Settings())
    selenium_mock = mocker.mock()
    selenium_mock.start()
    mocker.throw(DriverError("invalid usage"))

    with mocker:
        driver = SeleniumDriver(context, selenium=selenium_mock)
    
        assert_raises(DriverError, driver.start_test, url="http://localhost", \
                      exc_pattern=re.compile(r"Error when starting selenium. Is it running ?"))
def test_wait_for_disappear_works_even_when_is_visible_raises():
    
    mocker = Mocker()
    
    context = Context(Settings())
    selenium_mock = mocker.mock()
    selenium_mock.is_element_present('some element')
    mocker.count(min=1, max=None)
    mocker.result(True)
    selenium_mock.is_visible('some element')
    mocker.throw(Exception("ERROR: Element some element not found"))

    with mocker:
        driver = SeleniumDriver(context, selenium=selenium_mock)
        driver.wait_for_element_to_disappear("some element", 1)
Exemple #7
0
    def test_shared_exon(self):
        mocker = Mocker()

        self.model = mocker.mock()
        self.model.blockStarts
        mocker.result([100, 400, 700])
        mocker.count(2, None)

        self.model.blockSizes
        mocker.result([100, 100, 100])
        mocker.count(1, None)

        self.model.chrom
        mocker.result('chr1')
        mocker.count(2, None)

        self.model.start
        mocker.result(0)
        mocker.count(1, None)

        self.junctions1 = mocker.mock()
        self.junctions2 = mocker.mock()
        self.junc1 = [400]
        self.junc2 = [700]

        juncKey = 'chr1:200'
        self.junctions1[juncKey]
        mocker.result(self.junc1)

        self.junctions2[juncKey]
        mocker.result(self.junc2)

        juncKey = 'chr1:500'
        self.junctions1[juncKey]
        mocker.throw(KeyError)

        juncKey = 'chr1:800'
        self.junctions1[juncKey]
        mocker.throw(KeyError)

        mocker.replay()
        self.sharedExons = {}
        jc.scanJunctions(self.model, self.junctions1, self.junctions2,
                         self.sharedExons)

        for j in self.sharedExons:
            self.assertEqual(self.sharedExons[j], [400])
            self.assertEqual(j, 'chr1:200')
Exemple #8
0
 def test(c):
     m = Mocker()
     lg = m.replace("editxt.textcommand.log")
     mi = m.mock(ak.NSMenuItem)
     tv = m.mock(ak.NSTextView)
     tc = m.mock()
     tcc = CommandManager("<history>")
     cmds = m.replace(tcc, "commands")
     cmds.get(mi.tag() >> 42) >> (tc if c.has_command else None)
     if c.has_command:
         tc(tv, None)
         if c.error:
             m.throw(Exception)
             lg.exception("%s.execute failed", ANY)
     with m:
         tcc.do_menu_command(tv, mi)
Exemple #9
0
 def test(c):
     m = Mocker()
     lg = m.replace("editxt.textcommand.log")
     mi = m.mock(ak.NSMenuItem)
     tv = m.mock(ak.NSTextView)
     tc = m.mock()
     tcc = TextCommandController("<history>")
     cmds = m.replace(tcc, 'commands')
     cmds.get(mi.tag() >> 42) >> (tc if c.has_command else None)
     if c.has_command:
         tc(tv, mi, None)
         if c.error:
             m.throw(Exception)
             lg.error("%s.execute failed", ANY, exc_info=True)
     with m:
         tcc.do_textview_command(tv, mi)
Exemple #10
0
 def test(c):
     m = Mocker()
     lg = m.replace("editxt.textcommand.log", passthrough=False)
     mi = m.mock(NSMenuItem)
     tv = m.mock(NSTextView)
     tc = m.mock(TextCommand)
     tcc = TextCommandController(None)
     cmds = m.replace(tcc.commands)
     cmd = cmds.get(mi.tag() >> 42) >> (tc if c.has_command else None)
     if c.has_command:
         cmd.execute(tv, mi)
         if c.error:
             m.throw(Exception)
             lg.error("%s.execute failed", ANY, exc_info=True)
     with m:
         tcc.do_textview_command(tv, mi)
Exemple #11
0
 def test(c):
     m = Mocker()
     lg = m.replace("editxt.textcommand.log")
     mi = m.mock(ak.NSMenuItem)
     tv = m.mock(ak.NSTextView)
     tc = m.mock()
     tcc = TextCommandController("<history>")
     cmds = m.replace(tcc, 'commands')
     cmds.get(mi.tag() >> 42) >> (tc if c.has_command else None)
     if c.has_command:
         tc(tv, mi, None)
         if c.error:
             m.throw(Exception)
             lg.error("%s.execute failed", ANY, exc_info=True)
     with m:
         tcc.do_textview_command(tv, mi)
    def test_shared_exon(self):
        mocker = Mocker()

        self.model = mocker.mock()
        self.model.blockStarts
        mocker.result([100, 400, 700])
        mocker.count(2, None)

        self.model.blockSizes
        mocker.result([100, 100, 100])
        mocker.count(1, None)

        self.model.chrom
        mocker.result("chr1")
        mocker.count(2, None)

        self.model.start
        mocker.result(0)
        mocker.count(1, None)

        self.junctions1 = mocker.mock()
        self.junctions2 = mocker.mock()
        self.junc1 = [400]
        self.junc2 = [700]

        juncKey = "chr1:200"
        self.junctions1[juncKey]
        mocker.result(self.junc1)

        self.junctions2[juncKey]
        mocker.result(self.junc2)

        juncKey = "chr1:500"
        self.junctions1[juncKey]
        mocker.throw(KeyError)

        juncKey = "chr1:800"
        self.junctions1[juncKey]
        mocker.throw(KeyError)

        mocker.replay()
        self.sharedExons = {}
        jc.scanJunctions(self.model, self.junctions1, self.junctions2, self.sharedExons)

        for j in self.sharedExons:
            self.assertEqual(self.sharedExons[j], [400])
            self.assertEqual(j, "chr1:200")
Exemple #13
0
 def test(c):
     m = Mocker()
     lg = m.replace("editxt.textcommand.log")
     tv = m.mock(ak.NSTextView)
     tcc = TextCommandController("<history>")
     sel = "<selector>"
     callback = m.mock()
     handlers = m.replace(tcc, 'input_handlers')
     cmd = handlers.get(sel) >> (callback if c.has_selector else None)
     if c.has_selector:
         callback(tv, None, None)
         if c.error:
             m.throw(Exception)
             lg.error("%s failed", callback, exc_info=True)
     with m:
         result = tcc.do_textview_command_by_selector(tv, sel)
         eq_(result, c.result)
Exemple #14
0
 def test(c):
     m = Mocker()
     lg = m.replace("editxt.textcommand.log")
     tv = m.mock(ak.NSTextView)
     tcc = TextCommandController("<history>")
     sel = "<selector>"
     callback = m.mock()
     handlers = m.replace(tcc, 'input_handlers')
     cmd = handlers.get(sel) >> (callback if c.has_selector else None)
     if c.has_selector:
         callback(tv, None, None)
         if c.error:
             m.throw(Exception)
             lg.error("%s failed", callback, exc_info=True)
     with m:
         result = tcc.do_textview_command_by_selector(tv, sel)
         eq_(result, c.result)
Exemple #15
0
 def test(c):
     m = Mocker()
     lg = m.replace("editxt.textcommand.log")
     tv = m.mock(ak.NSTextView)
     tcc = CommandManager("<history>")
     sel = "<selector>"
     callback = m.mock()
     handlers = m.replace(tcc, "input_handlers")
     cmd = handlers.get(sel) >> (callback if c.has_selector else None)
     if c.has_selector:
         callback(tv, None)
         if c.error:
             m.throw(Exception)
             lg.exception("%s failed", callback)
     with m:
         result = tcc.do_command(tv, sel)
         eq_(result, c.result)
    def test_is_element_visible_with_element_removal_while_executing(self):
        from selenium.common.exceptions import StaleElementReferenceException

        mocker = Mocker()

        context = Context(Settings())
        browser_mock = mocker.mock()

        xpath = '//div'

        browser_mock.find_by_xpath(xpath)

        element_mock = mocker.mock()
        mocker.result(element_mock)
        element_mock.visible
        mocker.throw(StaleElementReferenceException)

        with mocker:
            driver = SplinterDriver(context, browser=browser_mock)
            is_visible = driver.is_element_visible(xpath)
            self.assertEqual(is_visible, False)
    def test_find_match_match_not_match(self):
        key1 = ["chr1:154000-230000", "chr1:155000-230000"]
        key2 = ["chr1:154000-230000"]
        mocker = Mocker()
        junction = mocker.mock()
        junction.coverage
        mocker.result(40)
        mocker.count(1, None)

        container1 = mocker.mock()
        container2 = mocker.mock()

        container1.keys()
        mocker.result(key1)

        container1[key1[0]]
        mocker.result(junction)
        mocker.count(1, None)

        container1[key1[1]]
        mocker.result(junction)
        mocker.count(1, None)

        container2[key1[0]]
        mocker.result(junction)
        mocker.count(1, None)

        container2[key1[1]]
        mocker.throw(KeyError)
        mocker.count(1)

        mocker.replay()
        self.common, self.diff = jc.findMatch(container1, container2)
        self.assertEqual(self.common.keys(), [key1[0]])
        self.assertEqual(self.diff.keys(), [key1[1]])

        mocker.restore()
        mocker.verify()
Exemple #18
0
    def test_find_match_match_not_match(self):
        key1 = ['chr1:154000-230000', 'chr1:155000-230000']
        key2 = ['chr1:154000-230000']
        mocker = Mocker()
        junction = mocker.mock()
        junction.coverage
        mocker.result(40)
        mocker.count(1, None)

        container1 = mocker.mock()
        container2 = mocker.mock()

        container1.keys()
        mocker.result(key1)

        container1[key1[0]]
        mocker.result(junction)
        mocker.count(1, None)

        container1[key1[1]]
        mocker.result(junction)
        mocker.count(1, None)

        container2[key1[0]]
        mocker.result(junction)
        mocker.count(1, None)

        container2[key1[1]]
        mocker.throw(KeyError)
        mocker.count(1)

        mocker.replay()
        self.common, self.diff = jc.findMatch(container1, container2)
        self.assertEqual(self.common.keys(), [key1[0]])
        self.assertEqual(self.diff.keys(), [key1[1]])

        mocker.restore()
        mocker.verify()
Exemple #19
0
 def test(serial):
     m = Mocker()
     proj = Project.create()
     log = m.replace(mod, 'log')
     nsdat = m.replace(fn, 'NSData')
     nspls = m.replace(fn, 'NSPropertyListSerialization')
     create_document_view_with_state = m.method(
         Project.create_document_view_with_state)
     create_document_view = m.method(Project.create_document_view)
     proj._documents = docs = m.mock(KVOList)
     if "path" in serial:
         data = nsdat.dataWithContentsOfFile_(serial["path"]) >> m.mock()
         serial_, format, error = nspls. \
             propertyListFromData_mutabilityOption_format_errorDescription_( \
                 data, NSPropertyListImmutable, None, None) >> ({}, m.mock(), None)
     else:
         serial_ = serial
     docs_ = serial_.get("documents", [])
     for item in docs_:
         create_document_view_with_state(item)
         if item == "doc_not_found":
             m.throw(Exception("document not found"))
             log.warn("cannot open document: %r" % item)
         #proj._is_dirty = True
     bool(docs)
     m.result(bool(docs_))
     if not docs_:
         create_document_view()
         #proj._is_dirty = True
     with m:
         proj.deserialize(serial)
         if "path" in serial:
             eq_(proj.path, serial["path"])
             assert "name" not in serial
         else:
             eq_(proj.name, serial.get("name", const.UNTITLED_PROJECT_NAME))
             eq_(proj.expanded, serial.get("expanded", True))
 def test_create_database_terminates_the_instance_if_it_fails_to_create_the_database_and_save_instance_with_error_state(self):
     exc_msg = u"I've failed to create your database, sorry! :("
     mocker = Mocker()
     c_database = mocker.replace("mysqlapi.api.models.DatabaseManager.create_database")
     c_database()
     mocker.throw(Exception(exc_msg))
     mocker.replay()
     instance = Instance(
         ec2_id="i-00009",
         name="home",
         host="unknown.host",
         state="running",
     )
     ec2_client = mocks.FakeEC2Client()
     try:
         t = create_database(instance, ec2_client)
         t.join()
         self.assertIn("terminate instance home", ec2_client.actions)
         self.assertIsNotNone(instance.pk)
         self.assertEqual("error", instance.state)
         self.assertEqual(exc_msg, instance.reason)
     finally:
         instance.delete()
     mocker.verify()
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)
Exemple #22
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)