Exemple #1
0
    def test_twitter_login(self):
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.status_code = 200
            response.text = 'oauth_callback_confirmed=true&oauth_token=123456789'
            res = self.testapp.get('/twitter/login')
            self.assertEqual(res.status, '302 Found')
            loc = 'https://api.twitter.com/oauth/authenticate?oauth_token=123456789'
            self.assertEqual(res.location, loc)

        # simulate an authentication error from Twitter
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.status_code = 401
            res = self.testapp.get('/twitter/login', status=401)
            self.assertEqual(res.status, '401 Unauthorized')

        # simulate an oauth_callback_confirmed=false
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.status_code = 200
            response.text = 'oauth_callback_confirmed=false'
            res = self.testapp.get('/twitter/login', status=401)
            self.assertEqual(res.status, '401 Unauthorized')
            res.mustcontain('oauth_callback_confirmed is not true')
    def test_twitter_login(self):
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.status_code = 200
            response.text = 'oauth_callback_confirmed=true&oauth_token=123456789'
            res = self.testapp.get('/twitter/login')
            self.assertEqual(res.status, '302 Found')
            loc = 'https://api.twitter.com/oauth/authenticate?oauth_token=123456789'
            self.assertEqual(res.location, loc)

        # simulate an authentication error from Twitter
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.status_code = 401
            res = self.testapp.get('/twitter/login', status=401)
            self.assertEqual(res.status, '401 Unauthorized')

        # simulate an oauth_callback_confirmed=false
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.status_code = 200
            response.text = 'oauth_callback_confirmed=false'
            res = self.testapp.get('/twitter/login', status=401)
            self.assertEqual(res.status, '401 Unauthorized')
            res.mustcontain('oauth_callback_confirmed is not true')
    def test_oauth2_step2(self):
        token_uri = 'http://example.com/oauth2/token'
        client_id = '1234'
        client_secret = 'secret'
        redirect_url = 'http://localhost/oauth2/callback'
        scope = 'scope1 scope2'
        request = DummyRequest()
        response = oauth2_step2(request, token_uri, client_id, client_secret,
                                redirect_url, scope)
        self.assertEqual(response.status, '400 Bad Request')
        self.assertEqual(response.message, 'Missing required code')

        request.params = {'code': 'abcdef'}
        response = oauth2_step2(request, token_uri, client_id, client_secret,
                                redirect_url, scope)
        self.assertEqual(response.status, '400 Bad Request')
        self.assertEqual(response.message, 'Missing required state')

        request.params['state'] = 'random-string'
        response = oauth2_step2(request, token_uri, client_id, client_secret,
                                redirect_url, scope)
        self.assertEqual(response.status, '401 Unauthorized')
        self.assertEqual(
            response.message,
            'Missing internal state. You may be a victim of CSRF')

        request.session = {'state': 'other-string'}
        response = oauth2_step2(request, token_uri, client_id, client_secret,
                                redirect_url, scope)
        self.assertEqual(response.status, '401 Unauthorized')
        self.assertEqual(
            response.message,
            'State parameter does not match internal state. You may be a victim of CSRF'
        )

        with mock.patch('requests.post') as fake:
            fake.return_value.status_code = 401
            fake.return_value.text = 'Unauthorized request'
            request.session['state'] = 'random-string'
            response = oauth2_step2(request, token_uri, client_id,
                                    client_secret, redirect_url, scope)
            self.assertEqual(response.status, '401 Unauthorized')
            self.assertEqual(response.message, 'Unauthorized request')

        with mock.patch('requests.post') as fake:
            fake.return_value.status_code = 200
            fake.return_value.json = lambda: {'access_token': 'qwerty'}
            request.session['state'] = 'random-string'
            response = oauth2_step2(request, token_uri, client_id,
                                    client_secret, redirect_url, scope)
            self.assertEqual(response, 'qwerty')

        with mock.patch('requests.post') as fake:
            fake.return_value.status_code = 200
            fake.return_value.json = lambda: None
            fake.return_value.text = 'access_token=qwerty'
            request.session['state'] = 'random-string'
            response = oauth2_step2(request, token_uri, client_id,
                                    client_secret, redirect_url, scope)
            self.assertEqual(response, 'qwerty')
    def test_get_user_info_non_authorized2(self):
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.ok = True
            response.json = lambda: {
                'token_type': 'bearer',
                'access_token': '1234567890',
            }
            with mock.patch('requests.get') as fake2:
                response2 = fake2.return_value
                response2.ok = False

                self.assertRaises(HTTPUnauthorized, get_user_info,
                                  self.settings, '1234')
    def test_get_user_info_non_authorized2(self):
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.ok = True
            response.json = lambda: {
                'token_type': 'bearer',
                'access_token': '1234567890',
            }
            with mock.patch('requests.get') as fake2:
                response2 = fake2.return_value
                response2.ok = False

                self.assertRaises(HTTPUnauthorized,
                                  get_user_info, self.settings, '1234')
Exemple #6
0
    def test_persona_login(self):

        res = self.testapp.get('/persona/login', status=405)
        self.assertEqual(res.status, '405 Method Not Allowed')
        res.mustcontain('Only POST is allowed')

        res = self.testapp.post('/persona/login', status=400)
        self.assertEqual(res.status, '400 Bad Request')
        res.mustcontain('The assertion parameter is required')

        with mock.patch('requests.post') as fake_post:
            fake_post.return_value.ok = False
            res = self.testapp.post(
                '/persona/login', {
                    'assertion': 'test-assertion',
                    'next_url': 'http://localhost/oauth2/clients',
                },
                status=502)
            self.assertEqual(res.status, '502 Bad Gateway')
            res.mustcontain('Mozilla Persona verifier is not working properly')

        with mock.patch('requests.post') as fake_post:
            fake_post.return_value.ok = True
            fake_post.return_value.json = lambda: {
                'status': 'failure',
            }
            res = self.testapp.post(
                '/persona/login', {
                    'assertion': 'test-assertion',
                    'next_url': 'http://localhost/oauth2/clients',
                },
                status=403)
            self.assertEqual(res.status, '403 Forbidden')
            res.mustcontain(
                'Mozilla Persona verifier can not verify your identity')

        with mock.patch('requests.post') as fake_post:
            fake_post.return_value.ok = True
            fake_post.return_value.json = lambda: {
                'status': 'okay',
                'email': '*****@*****.**',
            }
            res = self.testapp.post(
                '/persona/login', {
                    'assertion': 'test-assertion',
                    'next_url': 'http://localhost/oauth2/clients',
                })
            self.assertEqual(res.status, '302 Found')
            self.assertEqual(res.location, 'http://localhost/register')
    def test_express_checkout_details(self):
        request = testing.DummyRequest()
        pec = PayPalExpressCheckout(request)
        self.assertEqual(pec.nvp_url, 'http://paypal.com/nvp')
        self.assertEqual(pec.express_checkout_url,
                         'http://paypal.com/express_checkout')

        with mock.patch('requests.post') as fake:
            fake.return_value.ok = True
            fake.return_value.text = 'ACK=Success&AMT=5.00&FIRSTNAME=John&LASTNAME=Doe&SHIPTOCITY=ExampleCity&SHIPTOCOUNTRYNAME=ExampleCountry&SHIPTOSTATE=ExampleState&SHIPTOSTREET=ExampleStreet&SHIPTOZIP=123456&[email protected]'
            result = pec.get_express_checkout_details('123', '456')
            fake.assert_called_with('http://paypal.com/nvp', data={
                'METHOD': 'GetExpressCheckoutDetails',
                'VERSION': '72.0',
                'USER': '******',
                'PWD': 'paypal_password',
                'SIGNATURE': 'paypal_signature',
                'TOKEN': '123',
                'PAYERID': '456',
            })
            self.assertEqual(result, {
                'amount': 5,
                'firstname': 'John',
                'lastname': 'Doe',
                'city': 'ExampleCity',
                'country': 'ExampleCountry',
                'state': 'ExampleState',
                'street': 'ExampleStreet',
                'zip': '123456',
                'email': '*****@*****.**',
            })
    def test_oauth2_step1(self):
        with mock.patch('uuid.uuid4') as fake:
            fake.return_value = 'random-string'

            request = DummyRequest()
            request.params = {'next_url': 'http://localhost/'}
            request.session = {}
            response = oauth2_step1(
                request=request,
                auth_uri='http://example.com/oauth2/auth',
                client_id='1234',
                redirect_url='http://localhost/oauth2/callback',
                scope='scope1 scope2')
            self.assertEqual(response.status, '302 Found')
            url = urlparse.urlparse(response.location)
            self.assertEqual(url.netloc, 'example.com')
            self.assertEqual(url.path, '/oauth2/auth')
            query = urlparse.parse_qs(url.query)
            self.assertEqual(
                query, {
                    'scope': ['scope1 scope2'],
                    'state': ['random-string'],
                    'redirect_uri': ['http://localhost/oauth2/callback'],
                    'response_type': ['code'],
                    'client_id': ['1234'],
                })
            self.assertEqual(request.session['next_url'], 'http://localhost/')
 def test_get_user_info(self):
     with mock.patch('requests.post') as fake:
         response = fake.return_value
         response.ok = True
         response.json = lambda: {
             'token_type': 'bearer',
             'access_token': '1234567890',
         }
         with mock.patch('requests.get') as fake2:
             response2 = fake2.return_value
             response2.ok = True
             response2.json = lambda: {
                 'screen_name': 'John Doe',
             }
             info = get_user_info(self.settings, '1234')
             self.assertEqual(info, {'screen_name': 'John Doe'})
    def test_get_user_info_non_authorized(self):
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.ok = False

            self.assertRaises(HTTPUnauthorized,
                              get_user_info, self.settings, '1234')
 def test_get_user_info(self):
     with mock.patch('requests.post') as fake:
         response = fake.return_value
         response.ok = True
         response.json = lambda: {
             'token_type': 'bearer',
             'access_token': '1234567890',
         }
         with mock.patch('requests.get') as fake2:
             response2 = fake2.return_value
             response2.ok = True
             response2.json = lambda: {
                 'screen_name': 'John Doe',
             }
             info = get_user_info(self.settings, '1234')
             self.assertEqual(info, {'screen_name': 'John Doe'})
    def test_get_user_info_non_authorized(self):
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.ok = False

            self.assertRaises(HTTPUnauthorized, get_user_info, self.settings,
                              '1234')
    def test_contributions_donate(self):
        with mock.patch('requests.post') as fake:
            fake.return_value.ok = True
            fake.return_value.text = 'ACK=Success&TOKEN=123'
            res = self.testapp.post('/contribute/donate', {
                'amount': '5',
                'submit': 'submit',
            }, status=302)

            self.assertEqual(res.status, '302 Found')
            self.assertEqual(res.location, 'https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=123')

            # USER, PWD, and SIGNATURE are Paypal testing values
            # They are set in yithlibrary.testing.TestCase.setUp
            fake.assert_called_with('https://api-3t.sandbox.paypal.com/nvp', data={
                'METHOD': 'SetExpressCheckout',
                'VERSION': '72.0',
                'USER': '******',
                'PWD': 'QFZCWN5HZM8VBG7Q',
                'SIGNATURE': 'A-IzJhZZjhg29XQ2qnhapuwxIDzyAZQ92FRP5dqBzVesOkzbdUONzmOU',
                'LOCALECODE': 'EN',
                'PAYMENTREQUEST_0_ITEMAMT': 5,
                'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
                'PAYMENTREQUEST_0_CURRENCYCODE': 'USD',
                'PAYMENTREQUEST_0_AMT': 5,
                'PAYMENTREQUEST_0_DESC': 'Donation',
                'L_PAYMENTREQUEST_0_NAME0': 'Donation of $5',
                'L_PAYMENTREQUEST_0_AMT0': 5,
                'BRANDNAME': 'Yith Library',
                'RETURNURL': 'http://localhost/contribute/paypal-success-callback',
                'CANCELURL': 'http://localhost/contribute/paypal-cancel-callback',
            })
    def test_express_checkout_token(self):
        request = testing.DummyRequest()
        pec = PayPalExpressCheckout(request)
        self.assertEqual(pec.nvp_url, 'http://paypal.com/nvp')
        self.assertEqual(pec.express_checkout_url,
                         'http://paypal.com/express_checkout')

        with mock.patch('requests.post') as fake:
            fake.return_value.ok = True
            fake.return_value.text = 'ACK=Success&TOKEN=123'
            result = pec.get_express_checkout_token(5)
            fake.assert_called_with('http://paypal.com/nvp', data={
                'METHOD': 'SetExpressCheckout',
                'VERSION': '72.0',
                'USER': '******',
                'PWD': 'paypal_password',
                'SIGNATURE': 'paypal_signature',
                'LOCALECODE': 'EN',
                'PAYMENTREQUEST_0_ITEMAMT': 5,
                'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
                'PAYMENTREQUEST_0_CURRENCYCODE': 'USD',
                'PAYMENTREQUEST_0_AMT': 5,
                'PAYMENTREQUEST_0_DESC': 'Donation',
                'L_PAYMENTREQUEST_0_NAME0': 'Donation of $5',
                'L_PAYMENTREQUEST_0_AMT0': 5,
                'BRANDNAME': 'Yith Library',
                'RETURNURL': 'http://example.com/contribute/paypal-success-callback',
                'CANCELURL': 'http://example.com/contribute/paypal-cancel-callback',
            })
            self.assertEqual(result, '123')

        self.assertEqual(
            pec.get_express_checkout_url('123'),
            'http://paypal.com/express_checkout?cmd=_express-checkout&token=123')
def sqlalchemy_setup(db_uri):
    engine = create_engine(db_uri)
    init_sqlalchemy(engine)

    sqlalchemy_patcher = mock.patch('pyramid_sqlalchemy.includeme', includeme_test)
    sqlalchemy_patcher.start()

    return SQLAlchemyTestContext(engine, sqlalchemy_patcher)
Exemple #16
0
 def test_form_fail(self):
     create_and_login_user(self.testapp, allow_google_analytics=False)
     # make the form fail
     with mock.patch('deform.Form.validate') as fake:
         fake.side_effect = DummyValidationFailure('f', 'c', 'e')
         res = self.testapp.post('/preferences', {
             'submit': 'Save Changes',
         })
         self.assertEqual(res.status, '200 OK')
Exemple #17
0
def sqlalchemy_setup(db_uri):
    engine = create_engine(db_uri)
    init_sqlalchemy(engine)

    sqlalchemy_patcher = mock.patch('pyramid_sqlalchemy.includeme',
                                    includeme_test)
    sqlalchemy_patcher.start()

    return SQLAlchemyTestContext(engine, sqlalchemy_patcher)
 def test_form_fail(self):
     create_and_login_user(self.testapp, allow_google_analytics=False)
     # make the form fail
     with mock.patch('deform.Form.validate') as fake:
         fake.side_effect = DummyValidationFailure('f', 'c', 'e')
         res = self.testapp.post('/preferences', {
             'submit': 'Save Changes',
         })
         self.assertEqual(res.status, '200 OK')
    def test_user_information_form_fail(self):
        create_and_login_user(self.testapp)

        # make the form fail
        with mock.patch('deform.Form.validate') as fake:
            fake.side_effect = DummyValidationFailure('f', 'c', 'e')
            res = self.testapp.post('/profile', {
                'submit': 'Save Changes',
            })
            self.assertEqual(res.status, '200 OK')
Exemple #20
0
    def test_user_information_form_fail(self):
        create_and_login_user(self.testapp)

        # make the form fail
        with mock.patch('deform.Form.validate') as fake:
            fake.side_effect = DummyValidationFailure('f', 'c', 'e')
            res = self.testapp.post('/profile', {
                'submit': 'Save Changes',
            })
            self.assertEqual(res.status, '200 OK')
    def test_contributions_donate(self):
        with mock.patch('requests.post') as fake:
            fake.return_value.ok = True
            fake.return_value.text = 'ACK=Success&TOKEN=123'
            res = self.testapp.post('/contribute/donate', {
                'amount': '5',
                'submit': 'submit',
            },
                                    status=302)

            self.assertEqual(res.status, '302 Found')
            self.assertEqual(
                res.location,
                'https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=123'
            )

            # USER, PWD, and SIGNATURE are Paypal testing values
            # They are set in yithlibrary.testing.TestCase.setUp
            fake.assert_called_with(
                'https://api-3t.sandbox.paypal.com/nvp',
                data={
                    'METHOD':
                    'SetExpressCheckout',
                    'VERSION':
                    '72.0',
                    'USER':
                    '******',
                    'PWD':
                    'QFZCWN5HZM8VBG7Q',
                    'SIGNATURE':
                    'A-IzJhZZjhg29XQ2qnhapuwxIDzyAZQ92FRP5dqBzVesOkzbdUONzmOU',
                    'LOCALECODE':
                    'EN',
                    'PAYMENTREQUEST_0_ITEMAMT':
                    5,
                    'PAYMENTREQUEST_0_PAYMENTACTION':
                    'Sale',
                    'PAYMENTREQUEST_0_CURRENCYCODE':
                    'USD',
                    'PAYMENTREQUEST_0_AMT':
                    5,
                    'PAYMENTREQUEST_0_DESC':
                    'Donation',
                    'L_PAYMENTREQUEST_0_NAME0':
                    'Donation of $5',
                    'L_PAYMENTREQUEST_0_AMT0':
                    5,
                    'BRANDNAME':
                    'Yith Library',
                    'RETURNURL':
                    'http://localhost/contribute/paypal-success-callback',
                    'CANCELURL':
                    'http://localhost/contribute/paypal-cancel-callback',
                })
    def test_destroy_form_fail(self):
        create_and_login_user(self.testapp)

        # make the form fail
        with mock.patch('deform.Form.validate') as fake:
            fake.side_effect = DummyValidationFailure('f', 'c', 'e')
            res = self.testapp.post('/destroy', {
                'reason': '',
                'submit': 'Yes, I am sure. Destroy my account',
            })
            self.assertEqual(res.status, '200 OK')
    def test_get_user_info(self):
        with mock.patch('requests.get') as fake:
            fake.return_value.status_code = 401
            fake.return_value.text = 'Unauthorized request'

            response = get_user_info('http://example.com/info', 'qwerty')
            self.assertEqual(response.status, '401 Unauthorized')
            self.assertEqual(response.message, 'Unauthorized request')

        with mock.patch('requests.get') as fake:
            fake.return_value.status_code = 200
            fake.return_value.json = lambda: {
                'name': 'John',
                'surname': 'Doe',
            }

            response = get_user_info('http://example.com/info', 'qwerty')
            self.assertEqual(response, {
                'name': 'John',
                'surname': 'Doe',
            })
Exemple #24
0
    def test_destroy_form_fail(self):
        create_and_login_user(self.testapp)

        # make the form fail
        with mock.patch('deform.Form.validate') as fake:
            fake.side_effect = DummyValidationFailure('f', 'c', 'e')
            res = self.testapp.post(
                '/destroy', {
                    'reason': '',
                    'submit': 'Yes, I am sure. Destroy my account',
                })
            self.assertEqual(res.status, '200 OK')
    def test_twitter_callback_failures(self):
        res = self.testapp.get('/twitter/callback', status=400)
        self.assertEqual(res.status, '400 Bad Request')
        res.mustcontain('Missing required oauth_token')

        res = self.testapp.get('/twitter/callback?oauth_token=123456789',
                               status=400)
        self.assertEqual(res.status, '400 Bad Request')
        res.mustcontain('Missing required oauth_verifier')

        good_url = '/twitter/callback?oauth_token=123456789&oauth_verifier=abc'
        res = self.testapp.get(good_url, status=400)
        self.assertEqual(res.status, '400 Bad Request')
        res.mustcontain('No oauth_token was found in the session')

        # bad request because oauth tokens are different
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.status_code = 200
            response.text = 'oauth_callback_confirmed=true&oauth_token=987654321'
            self.testapp.get('/twitter/login')

            res = self.testapp.get(good_url, status=401)
            self.assertEqual(res.status, '401 Unauthorized')
            res.mustcontain("OAuth tokens don't match")

        # good request, twitter is not happy with us
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.status_code = 200
            response.text = 'oauth_callback_confirmed=true&oauth_token=123456789'
            self.testapp.get('/twitter/login')

            response = fake.return_value
            response.status_code = 401
            response.text = 'Invalid token'

            res = self.testapp.get(good_url, status=401)
            self.assertEqual(res.status, '401 Unauthorized')
            res.mustcontain('Invalid token')
Exemple #26
0
    def test_twitter_callback_failures(self):
        res = self.testapp.get('/twitter/callback', status=400)
        self.assertEqual(res.status, '400 Bad Request')
        res.mustcontain('Missing required oauth_token')

        res = self.testapp.get('/twitter/callback?oauth_token=123456789',
                               status=400)
        self.assertEqual(res.status, '400 Bad Request')
        res.mustcontain('Missing required oauth_verifier')

        good_url = '/twitter/callback?oauth_token=123456789&oauth_verifier=abc'
        res = self.testapp.get(good_url, status=400)
        self.assertEqual(res.status, '400 Bad Request')
        res.mustcontain('No oauth_token was found in the session')

        # bad request because oauth tokens are different
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.status_code = 200
            response.text = 'oauth_callback_confirmed=true&oauth_token=987654321'
            self.testapp.get('/twitter/login')

            res = self.testapp.get(good_url, status=401)
            self.assertEqual(res.status, '401 Unauthorized')
            res.mustcontain("OAuth tokens don't match")

        # good request, twitter is not happy with us
        with mock.patch('requests.post') as fake:
            response = fake.return_value
            response.status_code = 200
            response.text = 'oauth_callback_confirmed=true&oauth_token=123456789'
            self.testapp.get('/twitter/login')

            response = fake.return_value
            response.status_code = 401
            response.text = 'Invalid token'

            res = self.testapp.get(good_url, status=401)
            self.assertEqual(res.status, '401 Unauthorized')
            res.mustcontain('Invalid token')
    def test_register_new_user_form_failed(self):
        self.testapp.post('/__session', {
            'user_info__provider': 'twitter',
            'user_info__external_id': '1234',
            'user_info__screen_name': 'John Doe',
            'user_info__first_name': 'John',
            'user_info__last_name': 'Doe',
            'user_info__email': '*****@*****.**',
        }, status=302)

        with mock.patch('deform.Form.validate') as fake:
            fake.side_effect = DummyValidationFailure('f', 'c', 'e')
            res = self.testapp.post('/register', {
                'submit': 'Register into Yith Library',
            })
            self.assertEqual(res.status, '200 OK')
Exemple #28
0
    def test_register_new_user_form_failed(self):
        self.testapp.post('/__session', {
            'user_info__provider': 'twitter',
            'user_info__external_id': '1234',
            'user_info__screen_name': 'John Doe',
            'user_info__first_name': 'John',
            'user_info__last_name': 'Doe',
            'user_info__email': '*****@*****.**',
        },
                          status=302)

        with mock.patch('deform.Form.validate') as fake:
            fake.side_effect = DummyValidationFailure('f', 'c', 'e')
            res = self.testapp.post('/register', {
                'submit': 'Register into Yith Library',
            })
            self.assertEqual(res.status, '200 OK')
 def test_contributions_confirm_details(self):
     with mock.patch('requests.post') as fake:
         fake.return_value.ok = True
         fake.return_value.text = 'ACK=Success&AMT=5.00&FIRSTNAME=John&LASTNAME=Doe&SHIPTOCITY=ExampleCity&SHIPTOCOUNTRYNAME=ExampleCountry&SHIPTOSTATE=ExampleState&SHIPTOSTREET=ExampleStreet&SHIPTOZIP=123456&[email protected]'
         res = self.testapp.get('/contribute/paypal-success-callback?token=123&PayerID=456')
         self.assertEqual(res.status, '200 OK')
         res.mustcontain('John', 'Doe', 'ExampleCity', 'ExampleCountry',
                         'ExampleState', 'ExampleStreet', '123456')
         fake.assert_called_with('https://api-3t.sandbox.paypal.com/nvp', data={
             'METHOD': 'GetExpressCheckoutDetails',
             'VERSION': '72.0',
             'USER': '******',
             'PWD': 'QFZCWN5HZM8VBG7Q',
             'SIGNATURE': 'A-IzJhZZjhg29XQ2qnhapuwxIDzyAZQ92FRP5dqBzVesOkzbdUONzmOU',
             'TOKEN': '123',
             'PAYERID': '456',
         })
 def test_contributions_confirm_details(self):
     with mock.patch('requests.post') as fake:
         fake.return_value.ok = True
         fake.return_value.text = 'ACK=Success&AMT=5.00&FIRSTNAME=John&LASTNAME=Doe&SHIPTOCITY=ExampleCity&SHIPTOCOUNTRYNAME=ExampleCountry&SHIPTOSTATE=ExampleState&SHIPTOSTREET=ExampleStreet&SHIPTOZIP=123456&[email protected]'
         res = self.testapp.get(
             '/contribute/paypal-success-callback?token=123&PayerID=456')
         self.assertEqual(res.status, '200 OK')
         res.mustcontain('John', 'Doe', 'ExampleCity', 'ExampleCountry',
                         'ExampleState', 'ExampleStreet', '123456')
         fake.assert_called_with(
             'https://api-3t.sandbox.paypal.com/nvp',
             data={
                 'METHOD': 'GetExpressCheckoutDetails',
                 'VERSION': '72.0',
                 'USER': '******',
                 'PWD': 'QFZCWN5HZM8VBG7Q',
                 'SIGNATURE':
                 'A-IzJhZZjhg29XQ2qnhapuwxIDzyAZQ92FRP5dqBzVesOkzbdUONzmOU',
                 'TOKEN': '123',
                 'PAYERID': '456',
             })
    def test_express_checkout_payment(self):
        request = testing.DummyRequest()
        pec = PayPalExpressCheckout(request)
        self.assertEqual(pec.nvp_url, 'http://paypal.com/nvp')
        self.assertEqual(pec.express_checkout_url,
                         'http://paypal.com/express_checkout')

        with mock.patch('requests.post') as fake:
            fake.return_value.ok = True
            fake.return_value.text = 'ACK=Success'
            result = pec.do_express_checkout_payment('123', '456', 5)
            fake.assert_called_with('http://paypal.com/nvp', data={
                'METHOD': 'DoExpressCheckoutPayment',
                'VERSION': '72.0',
                'USER': '******',
                'PWD': 'paypal_password',
                'SIGNATURE': 'paypal_signature',
                'TOKEN': '123',
                'PAYERID': '456',
                'LOCALECODE': 'EN',
                'PAYMENTREQUEST_0_ITEMAMT': 5,
                'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
                'PAYMENTREQUEST_0_CURRENCYCODE': 'USD',
                'PAYMENTREQUEST_0_AMT': 5,
                'PAYMENTREQUEST_0_DESC': 'Donation',
                'L_PAYMENTREQUEST_0_NAME0': 'Donation of $5',
                'L_PAYMENTREQUEST_0_AMT0': 5,
                'BRANDNAME': 'Yith Library',
            })
            self.assertTrue(result)

            # Simulate a failure
            fake.return_value.ok = True
            fake.return_value.text = 'ACK=Failure'
            result = pec.do_express_checkout_payment('123', '456', 5)
            self.assertFalse(result)
    def test_contributions_confirm_success_with_user(self):
        user, user_id = create_and_login_user(self.testapp)

        with mock.patch('requests.post') as fake:
            fake.return_value.ok = True
            fake.return_value.text = 'ACK=Success'

            self.assertEqual(Session.query(Donation).count(), 0)

            res = self.testapp.post('/contribute/paypal-success-callback', {
                'submit': 'Submit',
                'token': '123',
                'payerid': '456',
                'amount': '10',
                'firstname': 'John',
                'lastname': 'Doe',
                'city': 'ExampleCity',
                'country': 'ExampleCountry',
                'state': 'ExampleState',
                'street': 'ExampleStreet',
                'zip': '123456',
                'email': '*****@*****.**',
            },
                                    status=302)
            self.assertEqual(res.status, '302 Found')
            self.assertEqual(res.location, 'http://localhost/contribute')

            session = self.get_session(res)
            self.assertEqual(
                session['_f_success'],
                ['Thank you very much for your great contribution'])

            fake.assert_called_with(
                'https://api-3t.sandbox.paypal.com/nvp',
                data={
                    'METHOD': 'DoExpressCheckoutPayment',
                    'VERSION': '72.0',
                    'USER': '******',
                    'PWD': 'QFZCWN5HZM8VBG7Q',
                    'SIGNATURE':
                    'A-IzJhZZjhg29XQ2qnhapuwxIDzyAZQ92FRP5dqBzVesOkzbdUONzmOU',
                    'TOKEN': '123',
                    'PAYERID': '456',
                    'LOCALECODE': 'EN',
                    'PAYMENTREQUEST_0_ITEMAMT': 10,
                    'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
                    'PAYMENTREQUEST_0_CURRENCYCODE': 'USD',
                    'PAYMENTREQUEST_0_AMT': 10,
                    'PAYMENTREQUEST_0_DESC': 'Donation',
                    'L_PAYMENTREQUEST_0_NAME0': 'Donation of $10',
                    'L_PAYMENTREQUEST_0_AMT0': 10,
                    'BRANDNAME': 'Yith Library',
                })

            res.request.registry = self.testapp.app.registry
            mailer = get_mailer(res.request)

            # a couple of emails are sent
            self.assertEqual(len(mailer.outbox), 2)
            self.assertEqual(mailer.outbox[0].subject,
                             'Thanks for your contribution!')
            self.assertEqual(mailer.outbox[0].recipients, ['*****@*****.**'])
            self.assertEqual(mailer.outbox[1].subject,
                             'A new donation was received!')
            self.assertEqual(mailer.outbox[1].recipients,
                             ['*****@*****.**', '*****@*****.**'])

            # a new object in the database stores this donation
            self.assertEqual(Session.query(Donation).count(), 1)
            donation = Session.query(Donation).one()
            self.assertEqual(donation.amount, 10)
            self.assertEqual(donation.first_name, 'John')
            self.assertEqual(donation.last_name, 'Doe')
            self.assertEqual(donation.city, 'ExampleCity')
            self.assertEqual(donation.country, 'ExampleCountry')
            self.assertEqual(donation.state, 'ExampleState')
            self.assertEqual(donation.street, 'ExampleStreet')
            self.assertEqual(donation.zipcode, '123456')
            self.assertEqual(donation.email, '*****@*****.**')
            self.assertEqual(donation.creation,
                             datetime.datetime(2013, 1, 2, 10, 11, 2))
            self.assertTrue(donation.send_sticker)
            self.assertEqual(donation.user_id, user_id)
    def test_contributions_confirm_success_with_user(self):
        user, user_id = create_and_login_user(self.testapp)

        with mock.patch('requests.post') as fake:
            fake.return_value.ok = True
            fake.return_value.text = 'ACK=Success'

            self.assertEqual(Session.query(Donation).count(), 0)

            res = self.testapp.post('/contribute/paypal-success-callback', {
                'submit': 'Submit',
                'token': '123',
                'payerid': '456',
                'amount': '10',
                'firstname': 'John',
                'lastname': 'Doe',
                'city': 'ExampleCity',
                'country': 'ExampleCountry',
                'state': 'ExampleState',
                'street': 'ExampleStreet',
                'zip': '123456',
                'email': '*****@*****.**',
            }, status=302)
            self.assertEqual(res.status, '302 Found')
            self.assertEqual(res.location, 'http://localhost/contribute')

            session = self.get_session(res)
            self.assertEqual(session['_f_success'], ['Thank you very much for your great contribution'])

            fake.assert_called_with('https://api-3t.sandbox.paypal.com/nvp', data={
                'METHOD': 'DoExpressCheckoutPayment',
                'VERSION': '72.0',
                'USER': '******',
                'PWD': 'QFZCWN5HZM8VBG7Q',
                'SIGNATURE': 'A-IzJhZZjhg29XQ2qnhapuwxIDzyAZQ92FRP5dqBzVesOkzbdUONzmOU',
                'TOKEN': '123',
                'PAYERID': '456',
                'LOCALECODE': 'EN',
                'PAYMENTREQUEST_0_ITEMAMT': 10,
                'PAYMENTREQUEST_0_PAYMENTACTION': 'Sale',
                'PAYMENTREQUEST_0_CURRENCYCODE': 'USD',
                'PAYMENTREQUEST_0_AMT': 10,
                'PAYMENTREQUEST_0_DESC': 'Donation',
                'L_PAYMENTREQUEST_0_NAME0': 'Donation of $10',
                'L_PAYMENTREQUEST_0_AMT0': 10,
                'BRANDNAME': 'Yith Library',
            })

            res.request.registry = self.testapp.app.registry
            mailer = get_mailer(res.request)

            # a couple of emails are sent
            self.assertEqual(len(mailer.outbox), 2)
            self.assertEqual(mailer.outbox[0].subject,
                             'Thanks for your contribution!')
            self.assertEqual(mailer.outbox[0].recipients,
                             ['*****@*****.**'])
            self.assertEqual(mailer.outbox[1].subject,
                             'A new donation was received!')
            self.assertEqual(mailer.outbox[1].recipients,
                             ['*****@*****.**', '*****@*****.**'])

            # a new object in the database stores this donation
            self.assertEqual(Session.query(Donation).count(), 1)
            donation = Session.query(Donation).one()
            self.assertEqual(donation.amount, 10)
            self.assertEqual(donation.first_name, 'John')
            self.assertEqual(donation.last_name, 'Doe')
            self.assertEqual(donation.city, 'ExampleCity')
            self.assertEqual(donation.country, 'ExampleCountry')
            self.assertEqual(donation.state, 'ExampleState')
            self.assertEqual(donation.street, 'ExampleStreet')
            self.assertEqual(donation.zipcode, '123456')
            self.assertEqual(donation.email, '*****@*****.**')
            self.assertEqual(donation.creation,
                             datetime.datetime(2013, 1, 2, 10, 11, 2))
            self.assertTrue(donation.send_sticker)
            self.assertEqual(donation.user_id, user_id)