from __future__ import absolute_import, division, print_function

from six.moves.urllib.parse import parse_qs, urlparse

import stripe


class TestOAuth(object):
    def test_authorize_url(self, request_mock):
        url = stripe.OAuth.authorize_url(
            scope="read_write",
            state="csrf_token",
            stripe_user={
                "email": "test@example.com",
                "url": "https://example.com/profile/test",
                "country": "US",
            },
        )

        o = urlparse(url)
        params = parse_qs(o.query)

        assert o.scheme == "https"
        assert o.netloc == "connect.stripe.com"
        assert o.path == "/oauth/authorize"

        assert params["client_id"] == ["ca_123"]
        assert params["scope"] == ["read_write"]
        assert params["stripe_user[email]"] == ["test@example.com"]
        assert params["stripe_user[url]"] == [
            "https://example.com/profile/test"
        ]
        assert params["stripe_user[country]"] == ["US"]

    def test_token(self, request_mock):
        request_mock.stub_request(
            "post",
            "/oauth/token",
            {
                "access_token": "sk_access_token",
                "scope": "read_only",
                "livemode": "false",
                "token_type": "bearer",
                "refresh_token": "sk_refresh_token",
                "stripe_user_id": "acct_test",
                "stripe_publishable_key": "pk_test",
            },
        )

        resp = stripe.OAuth.token(
            grant_type="authorization_code",
            code="this_is_an_authorization_code",
        )
        request_mock.assert_requested(
            "post",
            "/oauth/token",
            {
                "grant_type": "authorization_code",
                "code": "this_is_an_authorization_code",
            },
        )
        assert resp["access_token"] == "sk_access_token"

    def test_deauthorize(self, request_mock):
        request_mock.stub_request(
            "post",
            "/oauth/deauthorize",
            {"stripe_user_id": "acct_test_deauth"},
        )

        resp = stripe.OAuth.deauthorize(stripe_user_id="acct_test_deauth")
        request_mock.assert_requested(
            "post",
            "/oauth/deauthorize",
            {"client_id": "ca_123", "stripe_user_id": "acct_test_deauth"},
        )
        assert resp["stripe_user_id"] == "acct_test_deauth"
