diff --git a/frappe/integrations/doctype/oauth_client/test_records.json b/frappe/integrations/doctype/oauth_client/test_records.json new file mode 100644 index 0000000000..904d959625 --- /dev/null +++ b/frappe/integrations/doctype/oauth_client/test_records.json @@ -0,0 +1,16 @@ +[ + { + "app_name": "_Test OAuth Client", + "client_id": "test_client_id", + "client_secret": "test_client_secret", + "default_redirect_uri": "http://localhost", + "docstatus": 0, + "doctype": "OAuth Client", + "grant_type": "Authorization Code", + "name": "test_client_id", + "redirect_uris": "http://localhost", + "response_type": "Code", + "scopes": "all openid", + "skip_authorization": 0 + } +] diff --git a/frappe/tests/ui/test_oauth20.py b/frappe/tests/ui/test_oauth20.py new file mode 100644 index 0000000000..54d3223f8c --- /dev/null +++ b/frappe/tests/ui/test_oauth20.py @@ -0,0 +1,76 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# MIT License. See license.txt +from __future__ import unicode_literals + +import unittest, frappe, requests, time +from frappe.test_runner import make_test_records +from frappe.utils.selenium_testdriver import TestDriver + +try: + from urllib.parse import urlparse +except ImportError: + from urlparse import urlparse + +class TestOAuth20(unittest.TestCase): + def setUp(self): + self.driver = TestDriver() + make_test_records("OAuth Client") + make_test_records("User") + self.client_id = frappe.get_all("OAuth Client", fields=["*"])[0].get("client_id") + + # Set Frappe server URL reqired for id_token generation + frappe.db.set_value("Social Login Keys", None, "frappe_server_url", "http://localhost:8000") + frappe.db.commit() + + def test_login_to_authorize_url(self): + + # Go to Authorize url + self.driver.get( + "api/method/frappe.integrations.oauth2.authorize?client_id=" + + self.client_id + + "&scope=all%20openid&response_type=code&redirect_uri=http%3A%2F%2Flocalhost" + ) + + time.sleep(2) + + # Login + username = self.driver.find("#login_email")[0] + username.send_keys("test@example.com") + + password = self.driver.find("#login_password")[0] + password.send_keys("Eastern_43A1W") + + sign_in = self.driver.find(".btn-login")[0] + sign_in.submit() + + time.sleep(2) + + # Allow access to resource + allow = self.driver.find("#allow")[0] + allow.click() + + time.sleep(2) + + # Get authorization code from redirected URL + auth_code = urlparse(self.driver.driver.current_url).query.split("=")[1] + + payload = "grant_type=authorization_code&code=" + payload += auth_code + payload += "&redirect_uri=http%3A%2F%2Flocalhost&client_id=" + payload += self.client_id + + headers = {'content-type':'application/x-www-form-urlencoded'} + + # Request for bearer token + token_response = requests.post( frappe.get_site_config().host_name + + "/api/method/frappe.integrations.oauth2.get_token", data=payload, headers=headers) + + # Parse bearer token json + bearer_token = token_response.json() + + self.assertTrue(bearer_token.get("access_token")) + self.assertTrue(bearer_token.get("expires_in")) + self.assertTrue(bearer_token.get("id_token")) + self.assertTrue(bearer_token.get("refresh_token")) + self.assertTrue(bearer_token.get("scope")) + self.assertTrue(bearer_token.get("token_type") == "Bearer")