예제 #1
0
def test_get_amount_and_total_back_from_api():
    "Test that we get correct amounts and totals back on POSTs to tip.json"
    client = TestClient()

    # First, create some test data
    # We need accounts
    db.execute(CREATE_ACCOUNT, ("test_tippee1",))
    db.execute(CREATE_ACCOUNT, ("test_tippee2",))
    db.execute(CREATE_ACCOUNT, ("test_tipper",))

    # We need to get ourselves a token!
    response = client.get('/')
    csrf_token = response.request.context['csrf_token']

    # Then, add a $1.50 and $3.00 tip
    response1 = client.post("/test_tippee1/tip.json",
                            {'amount': "1.00", 'csrf_token': csrf_token},
                            user='******')

    response2 = client.post("/test_tippee2/tip.json",
                            {'amount': "3.00", 'csrf_token': csrf_token},
                            user='******')

    # Confirm we get back the right amounts.
    first_data = json.loads(response1.body)
    second_data = json.loads(response2.body)
    assert_equal(first_data['amount'], "1.00")
    assert_equal(first_data['total_giving'], "1.00")
    assert_equal(second_data['amount'], "3.00")
    assert_equal(second_data['total_giving'], "4.00")
예제 #2
0
    def test_get_amount_and_total_back_from_api(self):
        "Test that we get correct amounts and totals back on POSTs to tip.json"
        client = TestClient()

        # First, create some test data
        # We need accounts
        now = datetime.datetime.now(pytz.utc)
        self.make_participant("test_tippee1", claimed_time=now)
        self.make_participant("test_tippee2", claimed_time=now)
        self.make_participant("test_tipper")

        # We need to get ourselves a token!
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        # Then, add a $1.50 and $3.00 tip
        response1 = client.post("/test_tippee1/tip.json",
                                {'amount': "1.00", 'csrf_token': csrf_token},
                                user='******')

        response2 = client.post("/test_tippee2/tip.json",
                                {'amount': "3.00", 'csrf_token': csrf_token},
                                user='******')

        # Confirm we get back the right amounts.
        first_data = json.loads(response1.body)
        second_data = json.loads(response2.body)
        assert first_data['amount'] == "1.00"
        assert first_data['total_giving'] == "1.00"
        assert second_data['amount'] == "3.00"
        assert second_data['total_giving'] == "4.00"
예제 #3
0
    def test_post_bad_platform(self):
        client = TestClient()

        now = datetime.datetime.now(pytz.utc)
        self.make_participant("test_tippee1", claimed_time=now)
        self.make_participant("test_tipper", claimed_time=now)

        api_key = json.loads(
            client.get('/test_tipper/api-key.json',
                       'test_tipper').body)['api_key']

        response = client.post('/test_tipper/tips.json',
                               json.dumps([{
                                   'username': '******',
                                   'platform': 'badname',
                                   'amount': '1.00'
                               }]),
                               user='******',
                               content_type='application/json',
                               HTTP_AUTHORIZATION='Basic ' +
                               base64.b64encode(api_key + ':'))

        assert response.code == 200

        resp = json.loads(response.body)

        for tip in resp:
            assert 'error' in tip
예제 #4
0
    def test_get_amount_and_total_back_from_api(self):
        "Test that we get correct amounts and totals back on POSTs to tip.json"
        client = TestClient()

        # First, create some test data
        # We need accounts
        now = datetime.datetime.now(pytz.utc)
        self.make_participant("test_tippee1", claimed_time=now)
        self.make_participant("test_tippee2", claimed_time=now)
        self.make_participant("test_tipper")

        # We need to get ourselves a token!
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        # Then, add a $1.50 and $3.00 tip
        response1 = client.post("/test_tippee1/tip.json", {
            'amount': "1.00",
            'csrf_token': csrf_token
        },
                                user='******')

        response2 = client.post("/test_tippee2/tip.json", {
            'amount': "3.00",
            'csrf_token': csrf_token
        },
                                user='******')

        # Confirm we get back the right amounts.
        first_data = json.loads(response1.body)
        second_data = json.loads(response2.body)
        assert_equal(first_data['amount'], "1.00")
        assert_equal(first_data['total_giving'], "1.00")
        assert_equal(second_data['amount'], "3.00")
        assert_equal(second_data['total_giving'], "4.00")
예제 #5
0
    def test_post_bad_platform(self):
        client = TestClient()

        now = datetime.datetime.now(pytz.utc)
        self.make_participant("test_tippee1", claimed_time=now)
        self.make_participant("test_tipper", claimed_time=now)

        api_key = json.loads(client.get('/test_tipper/api-key.json', 'test_tipper').body)['api_key']

        response = client.post( '/test_tipper/tips.json'
                              , json.dumps([{ 'username': '******'
                                            , 'platform': 'badname'
                                            , 'amount': '1.00'
                                             }])
                              , user='******'
                              , content_type='application/json'
                              , HTTP_AUTHORIZATION='Basic ' + base64.b64encode(api_key + ':')
                               )

        assert response.code == 200

        resp = json.loads(response.body)

        for tip in resp:
            assert 'error' in tip
예제 #6
0
    def test_get_response_with_tips(self):
        client = TestClient()

        now = datetime.datetime.now(pytz.utc)
        self.make_participant("test_tippee1", claimed_time=now)
        self.make_participant("test_tipper", claimed_time=now)

        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        response1 = client.post('/test_tippee1/tip.json', {
            'amount': '1.00',
            'csrf_token': csrf_token
        },
                                user='******')

        response = client.get('/test_tipper/tips.json', 'test_tipper')

        assert response1.code == 200
        assert json.loads(response1.body)['amount'] == '1.00'

        data = json.loads(response.body)[0]

        assert response.code == 200
        assert data['username'] == 'test_tippee1'
        assert data['amount'] == '1.00'
예제 #7
0
    def setUp(self):
        self.client = TestClient()
        Harness.setUp(self)

        self._blech = (os.environ['CANONICAL_SCHEME'],
                       os.environ['CANONICAL_HOST'])
        os.environ['CANONICAL_SCHEME'] = 'https'
        os.environ['CANONICAL_HOST'] = 'www.gittip.com'
        wireup.canonical()
예제 #8
0
    def test_get_response(self):
        client = TestClient()

        now = datetime.datetime.now(pytz.utc)
        self.make_participant("test_tipper", claimed_time=now)

        response = client.get('/test_tipper/tips.json', 'test_tipper')

        assert response.code == 200
        assert len(json.loads(response.body)) == 0 # empty array
예제 #9
0
    def test_get_response(self):
        client = TestClient()

        now = datetime.datetime.now(pytz.utc)
        self.make_participant("test_tipper", claimed_time=now)

        response = client.get('/test_tipper/tips.json', 'test_tipper')

        assert response.code == 200
        assert len(json.loads(response.body)) == 0  # empty array
예제 #10
0
    def test_github_user_info_status_handling(self, requests):
        client = TestClient()
        # Check that different possible github statuses are handled correctly
        for (github_status, github_content), expected_gittip_response in [
            ((200, DUMMY_GITHUB_JSON), 200), ((404, ""), 404),
            ((500, ""), 502), ((777, ""), 502)
        ]:

            requests.get().status_code = github_status
            requests.get().text = github_content
            response = client.get('/on/github/not-in-the-db/')
            assert response.code == expected_gittip_response
예제 #11
0
    def change_bitcoin_address(self, address, user='******'):
        self.make_participant('alice')

        client = TestClient()
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        response = client.post("/alice/bitcoin.json", {
            'bitcoin_address': address,
            'csrf_token': csrf_token
        },
                               user=user)
        return response
예제 #12
0
    def change_username(self, new_username, user='******'):
        self.make_participant('alice')

        client = TestClient()
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        response = client.post("/alice/username.json", {
            'username': new_username,
            'csrf_token': csrf_token
        },
                               user=user)
        return response
    def test_github_user_info_status_handling(self, requests):
        client = TestClient()
        # Check that different possible github statuses are handled correctly
        for (github_status, github_content), expected_gittip_response in [
                ((200, DUMMY_GITHUB_JSON), 200),
                ((404, ""), 404),
                ((500, ""), 502),
                ((777, ""), 502)]:

            requests.get().status_code = github_status
            requests.get().text = github_content
            response = client.get('/on/github/not-in-the-db/')
            assert_equal(response.code, expected_gittip_response)
예제 #14
0
    def change_statement(self, statement, number='singular', user='******'):
        self.make_participant('alice')

        client = TestClient()
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        response = client.post("/alice/statement.json", {
            'statement': statement,
            'number': number,
            'csrf_token': csrf_token
        },
                               user=user)
        return response
예제 #15
0
    def change_username(self, new_username, user='******'):
        self.make_participant('alice')

        client = TestClient()
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        response = client.post( "/alice/username.json"
                              , { 'username': new_username
                                , 'csrf_token': csrf_token
                                 }
                              , user=user
                               )
        return response
예제 #16
0
class Tests(Harness):

    def setUp(self):
        Harness.setUp(self)
        self.website = test_website
        self.client = TestClient()

    def tearDown(self):
        self.website.oauth_cache = {}


    @mock.patch('requests.post')
    @mock.patch('requests.get')
    @mock.patch('gittip.utils.mixpanel.track')
    def test_associate_opts_in(self, track, get, post):
        self.website.oauth_cache = {"deadbeef": ("deadbeef", "opt-in", "")}

        post.return_value.status_code = 200
        post.return_value.text = "oauth_token=foo&oauth_token_secret=foo&user_id=foo"

        get.return_value.status_code = 200
        get.return_value.text = '{"id": 1234, "screen_name": "alice"}'

        response = self.client.get("/on/twitter/associate?oauth_token=deadbeef&"
                                   "oauth_verifier=donald_trump")
        assert response.code == 302, response.body
        assert response.headers['Location'] == "/alice/", response.headers


    @mock.patch('requests.post')
    @mock.patch('requests.get')
    @mock.patch('gittip.utils.mixpanel.track')
    def test_associate_connects(self, track, get, post):
        self.make_participant('alice')
        self.website.oauth_cache = {"deadbeef": ("deadbeef", "connect", "")}

        post.return_value.status_code = 200
        post.return_value.text = "oauth_token=foo&oauth_token_secret=foo&user_id=foo"

        get.return_value.status_code = 200
        get.return_value.text = '{"id": 1234, "screen_name": "alice"}'

        response = self.client.get("/on/twitter/associate?oauth_token=deadbeef&"
                                   "oauth_verifier=donald_trump", user="******")
        assert response.code == 302, response.body
        assert response.headers['Location'] == "/alice/", response.headers

        rec = self.db.one("SELECT * FROM elsewhere")
        assert rec.participant == 'alice', rec
        assert rec.platform == 'twitter', rec
예제 #17
0
    def change_bitcoin_address(self, address, user='******'):
        self.make_participant('alice')

        client = TestClient()
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        response = client.post( "/alice/bitcoin.json"
                              , { 'bitcoin_address': address
                                , 'csrf_token': csrf_token
                                 }
                              , user=user
                               )
        return response
예제 #18
0
    def change_statement(self, statement, number='singular', user='******'):
        self.make_participant('alice')

        client = TestClient()
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        response = client.post( "/alice/statement.json"
                              , { 'statement': statement
                                , 'number': number
                                , 'csrf_token': csrf_token
                                 }
                              , user=user
                               )
        return response
예제 #19
0
    def test_sandwiched_tipless_payday_comes_through(self):
        alice, bob = self.make_participants_and_tips()
        self.run_payday()  # zeroth, ignored
        self.run_payday()  # first

        # Oops! Sorry, Carl. :-(
        alice.set_tip_to('carl', '0.00')
        bob.set_tip_to('carl', '0.00')
        self.run_payday()  # second

        # Bouncing back ...
        alice.set_tip_to('carl', '5.00')
        self.run_payday()  # third

        expected = [
            {
                "date": datetime.date.today().strftime('%Y-%m-%d'),
                "npatrons": 1  # most recent first
                ,
                "receipts": 5.00
            },
            {
                "date": datetime.date.today().strftime('%Y-%m-%d'),
                "npatrons": 0,
                "receipts": 0.00
            },
            {
                "date": datetime.date.today().strftime('%Y-%m-%d'),
                "npatrons": 2,
                "receipts": 3.00
            }
        ]
        actual = json.loads(TestClient().get('/carl/charts.json').body)

        assert actual == expected
예제 #20
0
    def hit_anonymous(self, method='GET', expected_code=200):
        user, ignored = TwitterAccount('alice', {}).opt_in('alice')

        client = TestClient()
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        if method == 'GET':
            response = client.get("/alice/anonymous.json", user='******')
        else:
            assert method == 'POST'
            response = client.post("/alice/anonymous.json",
                                   {'csrf_token': csrf_token},
                                   user='******')
        if response.code != expected_code:
            print(response.body)
        return response
예제 #21
0
    def test_anonymous_does_not_get_goal_if_user_regifts(self):
        alice = self.make_participant('alice', last_bill_result='')

        alice.goal = 0

        data = json.loads(TestClient().get('/alice/public.json').body)

        assert_equal(data.has_key('goal'), False)
예제 #22
0
    def test_anonymous_gets_user_goal_if_set(self):
        alice = self.make_participant('alice', last_bill_result='')

        alice.goal = Decimal('1.00')

        data = json.loads(TestClient().get('/alice/public.json').body)

        assert_equal(data['goal'], '1.00')
예제 #23
0
    def change_goal(self, goal, goal_custom="", username="******"):
        if isinstance(username, Participant):
            username = username.username
        elif username == 'alice':
            self.make_alice()

        client = TestClient()
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        response = client.post("/alice/goal.json", {
            'goal': goal,
            'goal_custom': goal_custom,
            'csrf_token': csrf_token
        },
                               user=username)
        return response
예제 #24
0
    def test_anonymous_does_not_get_my_tip(self):
        alice = self.make_participant('alice', last_bill_result='')
        self.make_participant('bob')

        alice.set_tip_to('bob', '1.00')

        data = json.loads(TestClient().get('/bob/public.json').body)

        assert_equal(data.has_key('my_tip'), False)
예제 #25
0
    def test_anonymous_gets_giving(self):
        alice = self.make_participant('alice', last_bill_result='')
        self.make_participant('bob')

        alice.set_tip_to('bob', '1.00')

        data = json.loads(TestClient().get('/alice/public.json').body)

        assert_equal(data['giving'], '1.00')
예제 #26
0
    def change_goal(self, goal, goal_custom="", user="******"):
        if isinstance(user, Participant):
            user = user.username
        else:
            self.make_alice()

        client = TestClient()
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        response = client.post( "/alice/goal.json"
                              , { 'goal': goal
                                , 'goal_custom': goal_custom
                                , 'csrf_token': csrf_token
                                 }
                              , user=user
                               )
        return response
예제 #27
0
    def setUp(self):
        self.client = TestClient()
        Harness.setUp(self)

        self._blech = ( os.environ['CANONICAL_SCHEME']
                      , os.environ['CANONICAL_HOST']
                       )
        os.environ['CANONICAL_SCHEME'] = 'https'
        os.environ['CANONICAL_HOST'] = 'www.gittip.com'
        wireup.canonical()
예제 #28
0
    def test_set_tip_out_of_range(self):
        client = TestClient()
        now = datetime.datetime.now(pytz.utc)
        self.make_participant("alice", claimed_time=now)
        self.make_participant("bob", claimed_time=now)

        response = client.get('/')
        csrf_token = response.request.context['csrf_token']
        response = client.post("/alice/tip.json",
                                {'amount': "110.00", 'csrf_token': csrf_token},
                                user='******')
        assert "bad amount" in response.body
        assert response.code == 400
        
        response = client.post("/alice/tip.json",
                                {'amount': "-1.00", 'csrf_token': csrf_token},
                                user='******')
        assert "bad amount" in response.body
        assert response.code == 400
예제 #29
0
    def test_anonymous_gets_null_giving_if_user_anonymous(self):
        alice = self.make_participant( 'alice'
                                     , last_bill_result=''
                                     , anonymous=True
                                      )
        self.make_participant('bob')
        alice.set_tip_to('bob', '1.00')
        data = json.loads(TestClient().get('/alice/public.json').body)

        assert data['giving'] == None
예제 #30
0
    def test_never_received_gives_empty_array(self):
        alice, bob = self.make_participants_and_tips()
        self.run_payday()  # zeroeth, ignored
        self.run_payday()  # first
        self.run_payday()  # second
        self.run_payday()  # third

        expected = []
        actual = json.loads(TestClient().get('/alice/charts.json').body)

        assert actual == expected
예제 #31
0
    def hit_anonymous(self, method='GET', expected_code=200):
        user, ignored = TwitterAccount('alice', {}).opt_in('alice')

        client = TestClient()
        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        if method == 'GET':
            response = client.get( "/alice/anonymous.json"
                                 , user='******'
                                  )
        else:
            assert method == 'POST'
            response = client.post( "/alice/anonymous.json"
                                  , {'csrf_token': csrf_token}
                                  , user='******'
                                   )
        if response.code != expected_code:
            print(response.body)
        return response
예제 #32
0
    def test_authenticated_user_gets_their_tip(self):
        alice = self.make_participant('alice', last_bill_result='')
        self.make_participant('bob')

        alice.set_tip_to('bob', '1.00')

        raw = TestClient().get('/bob/public.json', user='******').body

        data = json.loads(raw)

        assert_equal(data['receiving'], '1.00')
        assert_equal(data['my_tip'], '1.00')
예제 #33
0
    def test_authenticated_user_gets_self_for_self(self):
        alice = self.make_participant('alice', last_bill_result='')
        self.make_participant('bob')

        alice.set_tip_to('bob', '3.00')

        raw = TestClient().get('/bob/public.json', user='******').body

        data = json.loads(raw)

        assert data['receiving'] == '3.00'
        assert data['my_tip'] == 'self'
예제 #34
0
    def also_prune_variant(self, also_prune, tippees=1):
        client = TestClient()

        now = datetime.datetime.now(pytz.utc)
        self.make_participant("test_tippee1", claimed_time=now)
        self.make_participant("test_tippee2", claimed_time=now)
        self.make_participant("test_tipper", claimed_time=now)

        api_key = json.loads(client.get('/test_tipper/api-key.json', 'test_tipper').body)['api_key']

        data = [
            {'username': '******', 'platform': 'gittip', 'amount': '1.00'},
            {'username': '******', 'platform': 'gittip', 'amount': '2.00'}
        ]

        response = client.post( '/test_tipper/tips.json'
                              , json.dumps(data)
                              , user='******'
                              , content_type='application/json'
                              , HTTP_AUTHORIZATION='Basic ' + base64.b64encode(api_key + ':')
                               )

        assert response.code == 200
        assert len(json.loads(response.body)) == 2

        response = client.post( '/test_tipper/tips.json?also_prune=' + also_prune
                              , json.dumps([{ 'username': '******'
                                            , 'platform': 'gittip'
                                            , 'amount': '1.00'
                                             }])
                              , user='******'
                              , content_type='application/json'
                              , HTTP_AUTHORIZATION='Basic ' + base64.b64encode(api_key + ':')
                               )

        assert response.code == 200

        response = client.get('/test_tipper/tips.json', 'test_tipper')
        assert response.code == 200
        assert len(json.loads(response.body)) == tippees
예제 #35
0
    def test_first_payday_comes_through(self):
        alice, bob = self.make_participants_and_tips()
        self.run_payday()  # zeroeth, ignored
        self.run_payday()  # first

        expected = [{
            "date": datetime.date.today().strftime('%Y-%m-%d'),
            "npatrons": 2,
            "receipts": 3.00
        }]
        actual = json.loads(TestClient().get('/carl/charts.json').body)

        assert actual == expected
예제 #36
0
    def test_authenticated_user_gets_zero_if_they_dont_tip(self):
        self.make_participant('alice', last_bill_result='')
        bob = self.make_participant('bob', last_bill_result='')
        self.make_participant('carl')

        bob.set_tip_to('carl', '3.00')

        raw = TestClient().get('/carl/public.json', user='******').body

        data = json.loads(raw)

        assert_equal(data['receiving'], '3.00')
        assert_equal(data['my_tip'], '0.00')
예제 #37
0
    def test_set_tip_out_of_range(self):
        client = TestClient()
        now = datetime.datetime.now(pytz.utc)
        self.make_participant("alice", claimed_time=now)
        self.make_participant("bob", claimed_time=now)

        response = client.get('/')
        csrf_token = response.request.context['csrf_token']
        response = client.post("/alice/tip.json", {
            'amount': "110.00",
            'csrf_token': csrf_token
        },
                               user='******')
        assert "bad amount" in response.body
        assert response.code == 400

        response = client.post("/alice/tip.json", {
            'amount': "-1.00",
            'csrf_token': csrf_token
        },
                               user='******')
        assert "bad amount" in response.body
        assert response.code == 400
예제 #38
0
    def test_get_response_with_tips(self):
        client = TestClient()

        now = datetime.datetime.now(pytz.utc)
        self.make_participant("test_tippee1", claimed_time=now)
        self.make_participant("test_tipper", claimed_time=now)

        response = client.get('/')
        csrf_token = response.request.context['csrf_token']

        response1 = client.post('/test_tippee1/tip.json',
            {'amount': '1.00', 'csrf_token': csrf_token},
            user='******')

        response = client.get('/test_tipper/tips.json', 'test_tipper')

        assert response1.code == 200
        assert json.loads(response1.body)['amount'] == '1.00'

        data = json.loads(response.body)[0]

        assert response.code == 200
        assert data['username'] == 'test_tippee1'
        assert data['amount'] == '1.00'
예제 #39
0
    def test_authenticated_user_doesnt_get_other_peoples_tips(self):
        alice = self.make_participant('alice', last_bill_result='')
        bob = self.make_participant('bob', last_bill_result='')
        carl = self.make_participant('carl', last_bill_result='')
        self.make_participant('dana')

        alice.set_tip_to('dana', '1.00')
        bob.set_tip_to('dana', '3.00')
        carl.set_tip_to('dana', '12.00')

        raw = TestClient().get('/dana/public.json', user='******').body

        data = json.loads(raw)

        assert_equal(data['receiving'], '16.00')
        assert_equal(data['my_tip'], '1.00')
예제 #40
0
    def test_out_of_band_transfer_gets_included_with_prior_payday(self):
        alice, bob = self.make_participants_and_tips()
        self.run_payday()  # zeroth, ignored
        self.run_payday()  # first
        self.run_payday()  # second

        # Do an out-of-band transfer.
        self.db.run(
            "UPDATE participants SET balance=balance - 4 WHERE username='******'"
        )
        self.db.run(
            "UPDATE participants SET balance=balance + 4 WHERE username='******'"
        )
        self.db.run(
            "INSERT INTO transfers (tipper, tippee, amount) VALUES ('alice', 'carl', 4)"
        )

        self.run_payday()  # third

        expected = [
            {
                "date": datetime.date.today().strftime('%Y-%m-%d'),
                "npatrons": 2  # most recent first
                ,
                "receipts": 3.00
            },
            {
                "date": datetime.date.today().strftime('%Y-%m-%d'),
                "npatrons":
                3  # Since this is rare, don't worry that we double-count alice.
                ,
                "receipts": 7.00
            },
            {
                "date": datetime.date.today().strftime('%Y-%m-%d'),
                "npatrons": 2,
                "receipts": 3.00
            }
        ]
        actual = json.loads(TestClient().get('/carl/charts.json').body)

        assert actual == expected
예제 #41
0
    def also_prune_variant(self, also_prune, tippees=1):
        client = TestClient()

        now = datetime.datetime.now(pytz.utc)
        self.make_participant("test_tippee1", claimed_time=now)
        self.make_participant("test_tippee2", claimed_time=now)
        self.make_participant("test_tipper", claimed_time=now)

        api_key = json.loads(
            client.get('/test_tipper/api-key.json',
                       'test_tipper').body)['api_key']

        data = [{
            'username': '******',
            'platform': 'gittip',
            'amount': '1.00'
        }, {
            'username': '******',
            'platform': 'gittip',
            'amount': '2.00'
        }]

        response = client.post('/test_tipper/tips.json',
                               json.dumps(data),
                               user='******',
                               content_type='application/json',
                               HTTP_AUTHORIZATION='Basic ' +
                               base64.b64encode(api_key + ':'))

        assert response.code == 200
        assert len(json.loads(response.body)) == 2

        response = client.post(
            '/test_tipper/tips.json?also_prune=' + also_prune,
            json.dumps([{
                'username': '******',
                'platform': 'gittip',
                'amount': '1.00'
            }]),
            user='******',
            content_type='application/json',
            HTTP_AUTHORIZATION='Basic ' + base64.b64encode(api_key + ':'))

        assert response.code == 200

        response = client.get('/test_tipper/tips.json', 'test_tipper')
        assert response.code == 200
        assert len(json.loads(response.body)) == tippees
    def make_client_and_csrf(self):
        client = TestClient()

        csrf_token = client.get('/').request.context['csrf_token']

        return client, csrf_token
예제 #43
0
 def setUp(self):
     super(Harness, self).setUp()
     self.client = TestClient()
예제 #44
0
class TestPages(Harness):
    def setUp(self):
        super(Harness, self).setUp()
        self.client = TestClient()

    def get(self, url, returning='body'):
        request = self.client.get(url)
        return getattr(request, returning)

    def test_homepage(self):
        actual = self.client.get('/').body
        expected = "Sustainable Crowdfunding"
        assert expected in actual, actual

    def test_homepage_with_anonymous_giver(self):
        TwitterAccount("bob", {}).opt_in("bob")
        alice = self.make_participant('alice', anonymous=True, last_bill_result='')
        alice.set_tip_to('bob', 1)
        update_homepage_queries_once(self.db)

        actual = self.client.get('/').body
        expected = "Anonymous"
        assert expected in actual, actual

    def test_profile(self):
        self.make_participant('cheese',
                              claimed_time=datetime.datetime.now(pytz.utc))
        expected = "I'm grateful for gifts"
        actual = self.get('/cheese/').decode('utf8') # deal with cent sign
        assert expected in actual, actual

    def test_widget(self):
        self.make_participant('cheese',
                              claimed_time=datetime.datetime.now(pytz.utc))
        expected = "javascript: window.open"
        actual = self.get('/cheese/widget.html')
        assert expected in actual, actual

    def test_bank_account(self):
        expected = "add<br> or change your bank account"
        actual = self.get('/bank-account.html')
        assert expected in actual, actual

    def test_credit_card(self):
        expected = "add<br> or change your credit card"
        actual = self.get('/credit-card.html')
        assert expected in actual, actual

    def test_github_associate(self):
        expected = "Bad request, program!"
        actual = self.get('/on/github/associate')
        assert expected in actual, actual

    def test_twitter_associate(self):
        expected = "Bad request, program!"
        actual = self.get('/on/twitter/associate')
        assert expected in actual, actual

    def test_about(self):
        expected = "small weekly cash gifts"
        actual = self.get('/about/')
        assert expected in actual, actual

    def test_about_stats(self):
        expected = "have joined Gittip"
        actual = self.get('/about/stats.html')
        assert expected in actual, actual

    def test_about_charts(self):
        expected = "Money transferred"
        actual = self.get('/about/charts.html')
        assert expected in actual, actual

    @patch('gittip.elsewhere.github.requests')
    def test_github_proxy(self, requests):
        requests.get().status_code = 200
        requests.get().text = GITHUB_USER_UNREGISTERED_LGTEST
        expected = "lgtest has not joined"
        actual = self.get('/on/github/lgtest/').decode('utf8')
        assert expected in actual, actual

    # This hits the network. XXX add a knob to skip this
    def test_twitter_proxy(self):
        expected = "Twitter has not joined"
        actual = self.get('/on/twitter/twitter/').decode('utf8')
        assert expected in actual, actual

    def test_404(self):
        actual = self.get('/about/four-oh-four.html')
        assert "Page Not Found" in actual, actual
        assert "{%" not in actual, actual

    def test_bank_account_complete(self):
        expected = "Page Not Found"
        actual = self.get('/bank-account-complete.html')
        assert expected in actual, actual

    def test_bank_account_json(self):
        expected = "Page Not Found"
        actual = self.get('/bank-account.json')
        assert expected in actual, actual

    def test_credit_card_json(self):
        expected = "Page Not Found"
        actual = self.get('/credit-card.json')
        assert expected in actual, actual
예제 #45
0
class TestPages(Harness):
    def setUp(self):
        super(Harness, self).setUp()
        self.client = TestClient()

    def get(self, url, returning="body"):
        request = self.client.get(url)
        return getattr(request, returning)

    def test_homepage(self):
        actual = self.client.get("/").body
        expected = "Sustainable Crowdfunding"
        assert expected in actual

    def test_homepage_with_anonymous_giver(self):
        TwitterAccount(self.db, "bob", {}).opt_in("bob")
        alice = self.make_participant("alice", anonymous=True, last_bill_result="")
        alice.set_tip_to("bob", 1)
        update_homepage_queries_once(self.db)

        actual = self.client.get("/").body
        expected = "Anonymous"
        assert expected in actual

    def test_profile(self):
        self.make_participant("cheese", claimed_time=datetime.datetime.now(pytz.utc))
        expected = "I'm grateful for gifts"
        actual = self.get("/cheese/").decode("utf8")  # deal with cent sign
        assert expected in actual

    def test_widget(self):
        self.make_participant("cheese", claimed_time=datetime.datetime.now(pytz.utc))
        expected = "javascript: window.open"
        actual = self.get("/cheese/widget.html")
        assert expected in actual

    def test_bank_account(self):
        expected = "add<br> or change your bank account"
        actual = self.get("/bank-account.html")
        assert expected in actual

    def test_credit_card(self):
        expected = "add<br> or change your credit card"
        actual = self.get("/credit-card.html")
        assert expected in actual

    def test_github_associate(self):
        expected = "Bad request, program!"
        actual = self.get("/on/github/associate")
        assert expected in actual

    def test_twitter_associate(self):
        expected = "Bad request, program!"
        actual = self.get("/on/twitter/associate")
        assert expected in actual

    def test_about(self):
        expected = "small weekly cash gifts"
        actual = self.get("/about/")
        assert expected in actual

    def test_about_stats(self):
        expected = "have joined Gittip"
        actual = self.get("/about/stats.html")
        assert expected in actual

    def test_about_charts(self):
        expected = "Money transferred"
        actual = self.get("/about/charts.html")
        assert expected in actual

    @patch("gittip.elsewhere.github.requests")
    def test_github_proxy(self, requests):
        requests.get().status_code = 200
        requests.get().text = GITHUB_USER_UNREGISTERED_LGTEST
        expected = "lgtest has not joined"
        actual = self.get("/on/github/lgtest/").decode("utf8")
        assert expected in actual

    # This hits the network. XXX add a knob to skip this
    def test_twitter_proxy(self):
        expected = "Twitter has not joined"
        actual = self.get("/on/twitter/twitter/").decode("utf8")
        assert expected in actual

    def test_404(self):
        actual = self.get("/about/four-oh-four.html")
        assert "Page Not Found" in actual
        assert "{%" not in actual

    def test_bank_account_complete(self):
        expected = "Page Not Found"
        actual = self.get("/bank-account-complete.html")
        assert expected in actual

    def test_bank_account_json(self):
        expected = "Page Not Found"
        actual = self.get("/bank-account.json")
        assert expected in actual

    def test_credit_card_json(self):
        expected = "Page Not Found"
        actual = self.get("/credit-card.json")
        assert expected in actual

    def test_anonymous_sign_out_redirects(self):
        response = self.client.get("/")
        csrf_token = response.request.context["csrf_token"]
        response = self.client.post("/sign-out.html", {"csrf_token": csrf_token})
        assert response.code == 302
        assert response.headers["Location"] == "/"

    def test_receipts_signed_in(self):
        alice = self.make_participant("alice", claimed_time=datetime.datetime.now(pytz.utc))
        self.db.run("INSERT INTO exchanges (id, participant, amount, fee) VALUES(100,'alice',1,0.1)")
        request = self.client.get("/alice/receipts/100.html", "alice")
        assert request.code == 200
class TestRecordAnExchange(Harness):

    # fixture
    # =======

    def setUp(self):
        super(Harness, self).setUp()
        self.client = TestClient()

    def get_csrf_token(self):
        response = self.client.get("/")
        return response.request.context["csrf_token"]

    def record_an_exchange(self, amount, fee, note, make_participants=True):
        if make_participants:
            now = utcnow()
            self.make_participant("alice", claimed_time=now, is_admin=True)
            self.make_participant("bob", claimed_time=now)
        return self.client.post(
            "/bob/history/record-an-exchange",
            {"amount": amount, "fee": fee, "note": note, "csrf_token": self.get_csrf_token()},
            "alice",
        )

    # tests
    # =====

    def test_success_is_302(self):
        actual = self.record_an_exchange("10", "0", "foo").code
        assert actual == 302

    def test_non_admin_is_404(self):
        self.make_participant("alice", claimed_time=utcnow())
        self.make_participant("bob", claimed_time=utcnow())
        actual = self.record_an_exchange("10", "0", "foo", False).code
        assert actual == 404

    def test_non_post_is_405(self):
        self.make_participant("alice", claimed_time=utcnow(), is_admin=True)
        self.make_participant("bob", claimed_time=utcnow())
        actual = self.client.get("/bob/history/record-an-exchange", "alice").code
        assert actual == 405

    def test_bad_amount_is_400(self):
        actual = self.record_an_exchange("cheese", "0", "foo").code
        assert actual == 400

    def test_bad_fee_is_400(self):
        actual = self.record_an_exchange("10", "cheese", "foo").code
        assert actual == 400

    def test_no_note_is_400(self):
        actual = self.record_an_exchange("10", "0", "").code
        assert actual == 400

    def test_whitespace_note_is_400(self):
        actual = self.record_an_exchange("10", "0", "    ").code
        assert actual == 400

    def test_dropping_balance_below_zero_is_500(self):
        actual = self.record_an_exchange("-10", "0", "noted").code
        assert actual == 500

    def test_success_records_exchange(self):
        self.record_an_exchange("10", "0.50", "noted")
        expected = {
            "amount": Decimal("10.00"),
            "fee": Decimal("0.50"),
            "participant": "bob",
            "recorder": "alice",
            "note": "noted",
        }
        SQL = "SELECT amount, fee, participant, recorder, note " "FROM exchanges"
        actual = self.db.one(SQL, back_as=dict)
        assert actual == expected

    def test_success_updates_balance(self):
        self.record_an_exchange("10", "0", "noted")
        expected = Decimal("10.00")
        SQL = "SELECT balance FROM participants WHERE username='******'"
        actual = self.db.one(SQL)
        assert actual == expected

    def test_withdrawals_work(self):
        self.make_participant("alice", claimed_time=utcnow(), is_admin=True)
        self.make_participant("bob", claimed_time=utcnow(), balance=20)
        self.record_an_exchange("-7", "0", "noted", False)
        expected = Decimal("13.00")
        SQL = "SELECT balance FROM participants WHERE username='******'"
        actual = self.db.one(SQL)
        assert actual == expected

    def test_withdrawals_take_fee_out_of_balance(self):
        self.make_participant("alice", claimed_time=utcnow(), is_admin=True)
        self.make_participant("bob", claimed_time=utcnow(), balance=20)
        self.record_an_exchange("-7", "1.13", "noted", False)
        SQL = "SELECT balance FROM participants WHERE username='******'"
        assert self.db.one(SQL) == Decimal("11.87")
예제 #47
0
 def toggle_is_suspicious(self):
     client = TestClient()
     client.get("/foo/toggle-is-suspicious.json", user="******")
예제 #48
0
 def test_redirect_redirects(self):
     self.make_participant('alice')
     actual = TestClient().get('/on/bountysource/redirect', user='******').code
     assert actual == 302
 def toggle_is_suspicious(self):
     client = TestClient()
     client.get('/foo/toggle-is-suspicious.json', user='******')
예제 #50
0
class Tests(Harness):

    def setUp(self):
        Harness.setUp(self)
        self.website = _test_website
        self.client = TestClient()

    def tearDown(self):
        Harness.tearDown(self)
        self.website.oauth_cache = {}


    @mock.patch('requests.post')
    @mock.patch('requests.get')
    def test_associate_opts_in(self, get, post):
        self.website.oauth_cache = {"deadbeef": ("deadbeef", "opt-in", "")}

        post.return_value.status_code = 200
        post.return_value.text = "oauth_token=foo&oauth_token_secret=foo&user_id=foo"

        get.return_value.status_code = 200
        get.return_value.text = '{"id": 1234, "screen_name": "alice"}'

        response = self.client.get("/on/twitter/associate?oauth_token=deadbeef&"
                                   "oauth_verifier=donald_trump")
        assert response.code == 302, response.body
        assert response.headers['Location'] == "/alice/", response.headers


    @mock.patch('requests.post')
    @mock.patch('requests.get')
    def test_associate_connects(self, get, post):
        self.make_participant('alice')
        self.website.oauth_cache = {"deadbeef": ("deadbeef", "connect", "")}

        post.return_value.status_code = 200
        post.return_value.text = "oauth_token=foo&oauth_token_secret=foo&user_id=foo"

        get.return_value.status_code = 200
        get.return_value.text = '{"id": 1234, "screen_name": "alice"}'

        response = self.client.get("/on/twitter/associate?oauth_token=deadbeef&"
                                   "oauth_verifier=donald_trump", user="******")
        assert response.code == 302, response.body
        assert response.headers['Location'] == "/alice/", response.headers

        rec = self.db.one("SELECT * FROM elsewhere")
        assert rec.participant == 'alice', rec
        assert rec.platform == 'twitter', rec


    @mock.patch('requests.post')
    @mock.patch('requests.get')
    def test_associate_confirms_on_connect(self, get, post):
        TwitterAccount(self.db, '1234', {'screen_name': 'alice'}).opt_in('alice')

        self.make_participant('bob')
        self.website.oauth_cache = {"deadbeef": ("deadbeef", "connect", "")}

        post.return_value.status_code = 200
        post.return_value.text = "oauth_token=foo&oauth_token_secret=foo&user_id=foo"

        get.return_value.status_code = 200
        get.return_value.text = '{"id": 1234, "screen_name": "alice"}'

        self.client.get('/') # populates cookies['csrf_token']
        response = self.client.get("/on/twitter/associate?oauth_token=deadbeef&"
                                   "oauth_verifier=donald_trump", user="******")
        assert "Please Confirm" in response.body, response.body


    @mock.patch('requests.post')
    @mock.patch('requests.get')
    def test_confirmation_properly_displays_remaining_bitbucket(self, get, post):
        alice, foo = TwitterAccount(self.db, '1234', {'screen_name': 'alice'}).opt_in('alice')
        alice.participant.take_over(BitbucketAccount(self.db, '1234', {'username': '******'}))

        self.make_participant('bob')
        self.website.oauth_cache = {"deadbeef": ("deadbeef", "connect", "")}

        post.return_value.status_code = 200
        post.return_value.text = "oauth_token=foo&oauth_token_secret=foo&user_id=foo"

        get.return_value.status_code = 200
        get.return_value.text = '{"id": 1234, "screen_name": "alice"}'

        self.client.get('/') # populates cookies['csrf_token']
        response = self.client.get("/on/twitter/associate?oauth_token=deadbeef&"
                                   "oauth_verifier=donald_trump", user="******")
        assert response.body.count("alice_bb<br />") == 2, response.body


    def test_can_post_to_take_over(self):
        TwitterAccount(self.db, '1234', {'screen_name': 'alice'}).opt_in('alice')

        self.make_participant('bob')
        self.website.connect_tokens = {("bob", "twitter", "1234"): "deadbeef"}

        csrf_token = self.client.get('/').request.context['csrf_token']
        response = self.client.post( "/on/take-over.html"
                                   , data={ "platform": "twitter"
                                          , "user_id": "1234"
                                          , "csrf_token": csrf_token
                                          , "connect_token": "deadbeef"
                                          , "should_reconnect": "yes"
                                           }
                                   , user="******"
                                    )

        assert response.code == 302, response.body
        expected = '/about/me.html'
        actual = response.headers['Location']
        assert actual == expected
예제 #51
0
 def setUp(self):
     Harness.setUp(self)
     self.website = _test_website
     self.client = TestClient()
예제 #52
0
class TestPages(Harness):
    def setUp(self):
        super(Harness, self).setUp()
        self.client = TestClient()

    def get(self, url, returning='body'):
        request = self.client.get(url)
        return getattr(request, returning)

    def test_homepage(self):
        actual = self.client.get('/').body
        expected = "Weekly Gift Exchange"
        assert expected in actual, actual

    def test_profile(self):
        self.make_participant('cheese',
                              claimed_time=datetime.datetime.now(pytz.utc))
        expected = "I'm grateful for gifts"
        actual = self.get('/cheese/')
        assert expected in actual, actual

    def test_widget(self):
        self.make_participant('cheese',
                              claimed_time=datetime.datetime.now(pytz.utc))
        expected = "javascript: window.open"
        actual = self.get('/cheese/widget.html')
        assert expected in actual, actual

    def test_bank_account(self):
        expected = "add or change your bank account"
        actual = self.get('/bank-account.html')
        assert expected in actual, actual

    def test_credit_card(self):
        expected = "add or change your credit card"
        actual = self.get('/credit-card.html')
        assert expected in actual, actual

    def test_github_associate(self):
        expected = "Bad request, program!"
        actual = self.get('/on/github/associate')
        assert expected in actual, actual

    def test_twitter_associate(self):
        expected = "Bad request, program!"
        actual = self.get('/on/twitter/associate')
        assert expected in actual, actual

    def test_about(self):
        expected = "small weekly cash gifts"
        actual = self.get('/about/')
        assert expected in actual, actual

    def test_about_stats(self):
        expected = "have joined Gittip"
        actual = self.get('/about/stats.html')
        assert expected in actual, actual

    def test_about_charts(self):
        expected = "Money transferred"
        actual = self.get('/about/charts.html')
        assert expected in actual, actual

    @patch('gittip.elsewhere.github.requests')
    def test_github_proxy(self, requests):
        requests.get().status_code = 200
        requests.get().text = GITHUB_USER_UNREGISTERED_LGTEST
        expected = "lgtest has not joined"
        actual = self.get('/on/github/lgtest/')
        assert expected in actual, actual

    # This hits the network. XXX add a knob to skip this
    def test_twitter_proxy(self):
        expected = "Twitter has not joined"
        actual = self.get('/on/twitter/twitter/')
        assert expected in actual, actual
예제 #53
0
class TestRecordAnExchange(Harness):

    # fixture
    # =======

    def setUp(self):
        super(Harness, self).setUp()
        self.client = TestClient()

    def get_csrf_token(self):
        response = self.client.get('/')
        return response.request.context['csrf_token']

    def record_an_exchange(self, amount, fee, note, make_participants=True):
        if make_participants:
            now = utcnow()
            self.make_participant('alice', claimed_time=now, is_admin=True)
            self.make_participant('bob', claimed_time=now)
        return self.client.post( '/bob/history/record-an-exchange'
                               , { 'amount': amount, 'fee': fee, 'note': note
                                 , 'csrf_token': self.get_csrf_token()
                                  }
                               , 'alice'
                                )

    # tests
    # =====

    def test_success_is_302(self):
        actual = self.record_an_exchange('10', '0', 'foo').code
        assert actual == 302, actual

    def test_non_admin_is_404(self):
        self.make_participant('alice', claimed_time=utcnow())
        self.make_participant('bob', claimed_time=utcnow())
        actual = self.record_an_exchange('10', '0', 'foo', False).code
        assert actual == 404, actual

    def test_non_post_is_405(self):
        self.make_participant('alice', claimed_time=utcnow(), is_admin=True)
        self.make_participant('bob', claimed_time=utcnow())
        actual = \
               self.client.get('/bob/history/record-an-exchange', 'alice').code
        assert actual == 405, actual

    def test_bad_amount_is_400(self):
        actual = self.record_an_exchange('cheese', '0', 'foo').code
        assert actual == 400, actual

    def test_bad_fee_is_400(self):
        actual = self.record_an_exchange('10', 'cheese', 'foo').code
        assert actual == 400, actual

    def test_no_note_is_400(self):
        actual = self.record_an_exchange('10', '0', '').code
        assert actual == 400, actual

    def test_whitespace_note_is_400(self):
        actual = self.record_an_exchange('10', '0', '    ').code
        assert actual == 400, actual

    def test_dropping_balance_below_zero_is_500(self):
        actual = self.record_an_exchange('-10', '0', 'noted').code
        assert actual == 500, actual

    def test_success_records_exchange(self):
        self.record_an_exchange('10', '0.50', 'noted')
        expected = { "amount": Decimal('10.00')
                   , "fee": Decimal('0.50')
                   , "participant": "bob"
                   , "recorder": "alice"
                   , "note": "noted"
                    }
        SQL = "SELECT amount, fee, participant, recorder, note " \
              "FROM exchanges"
        actual = self.db.one(SQL, back_as=dict)
        assert actual == expected, actual

    def test_success_updates_balance(self):
        self.record_an_exchange('10', '0', 'noted')
        expected = Decimal('10.00')
        SQL = "SELECT balance FROM participants WHERE username='******'"
        actual = self.db.one(SQL)
        assert actual == expected, actual

    def test_withdrawals_work(self):
        self.make_participant('alice', claimed_time=utcnow(), is_admin=True)
        self.make_participant('bob', claimed_time=utcnow(), balance=20)
        self.record_an_exchange('-7', '0', 'noted', False)
        expected = Decimal('13.00')
        SQL = "SELECT balance FROM participants WHERE username='******'"
        actual = self.db.one(SQL)
        assert actual == expected, actual
예제 #54
0
 def setUp(self):
     super(Harness, self).setUp()
     self.client = TestClient()
예제 #55
0
class Tests(Harness):

    def setUp(self):
        self.client = TestClient()
        Harness.setUp(self)

        self._blech = ( os.environ['CANONICAL_SCHEME']
                      , os.environ['CANONICAL_HOST']
                       )
        os.environ['CANONICAL_SCHEME'] = 'https'
        os.environ['CANONICAL_HOST'] = 'www.gittip.com'
        wireup.canonical()

    def tearDown(self):
        Harness.tearDown(self)
        os.environ['CANONICAL_SCHEME'] = self._blech[0]
        os.environ['CANONICAL_HOST'] = self._blech[1]
        wireup.canonical()


    def test_canonize_canonizes(self):
        response = self.client.get("/", HTTP_HOST='www.gittip.com', HTTP_X_FORWARDED_PROTO='http')
        assert response.code == 302
        assert response.headers['Location'] == 'https://www.gittip.com/'


    def test_session_cookie_set_in_auth_response(self):
        self.make_participant('alice')

        # Make a normal authenticated request.
        normal = self.client.get( "/"
                                , user='******'
                                , HTTP_X_FORWARDED_PROTO='https'
                                , HTTP_HOST='www.gittip.com'
                                 )
        alice = Participant.from_username('alice')
        assert normal.headers.cookie['session'].value == alice.session_token


    def test_session_cookie_is_sent_for_http_as_well(self):
        # https://github.com/gittip/www.gittip.com/issues/940

        self.make_participant('alice')

        # Now make a request that canonizer will redirect.
        redirect = self.client.get( "/"
                                  , user='******'
                                  , HTTP_X_FORWARDED_PROTO='http'
                                  , HTTP_HOST='www.gittip.com'
                                   )
        assert redirect.code == 302
        assert redirect.headers.cookie['session'].value == ""

        # This is bad, because it means that the user will be signed out of
        # https://www.gittip.com/ if they make a request for
        # http://www.gittip.com/. They might do this themselves accidentally,
        # but more likely a browser plugin (such as DoNotTrack) will do it for
        # them. The way we fix this is to set "secure" on the session cookie,
        # so that the browser won't send the session cookie to the server in
        # the case of http://www.gittipcom/. Without a session cookie in the
        # request, gittip.security.authentication.outbound won't set one on the
        # way out.


    def test_session_cookie_is_secure_if_it_should_be(self):
        # https://github.com/gittip/www.gittip.com/issues/940
        response = self.client.get( "/"
                                  , user=self.make_participant('alice').username
                                  , HTTP_X_FORWARDED_PROTO='https'
                                  , HTTP_HOST='www.gittip.com'
                                   )
        assert response.code == 200
        assert '; secure' in response.headers.cookie['session'].output()
예제 #56
0
    def test_anonymous_gets_null_goal_if_user_has_no_goal(self):
        alice = self.make_participant('alice', last_bill_result='')

        data = json.loads(TestClient().get('/alice/public.json').body)

        assert_equal(data['goal'], None)