File support-oauthlib-3.3.0.patch of Package python-requests-oauthlib
From 8cd1503783a72b596ea932c017375399c82ac5cc Mon Sep 17 00:00:00 2001
From: Jonathan Huot <jonathan.huot@gmail.com>
Date: Tue, 9 Apr 2024 22:21:08 +0200
Subject: [PATCH 1/3] Initial doc for writing samples
---
docs/contributing_examples.rst | 89 ++++++++++++++++++++
docs/index.rst | 1 +
tests/examples/__init__.py | 2 +
tests/examples/base.py | 32 +++++++
tests/examples/test_native_spa_pkce_auth0.py | 5 +-
tox.ini | 1 +
6 files changed, 128 insertions(+), 2 deletions(-)
create mode 100644 docs/contributing_examples.rst
Index: requests-oauthlib-2.0.0/docs/contributing_examples.rst
===================================================================
--- /dev/null
+++ requests-oauthlib-2.0.0/docs/contributing_examples.rst
@@ -0,0 +1,89 @@
+======================
+Documentation examples
+======================
+
+Examples found in documentation must be tested to be sure we have the appropriate
+coverage and be sure new releases are tested against regressions.
+
+Also, it helps testing any changes in public Identity Providers.
+
+Currently few tests are covered, and ``selenium`` package is used to interact with browser. Feel free to have a look at the base class in ``tests/examples/base.py`` to reuse utility specially crafted for testing samples in documentation.
+
+Identity Providers available for tests
+======================================
+
+Currently only an Auth0 test provider is available but new can be created on request. Following are the environment variables :
+
+- Auth0 https://auth0.com/ :
+
+ - ``AUTH0_USERNAME``
+ - ``AUTH0_PASSWORD``
+ - ``AUTH0_DOMAIN``
+ - ``AUTH0_PKCE_CLIENT_ID``
+
+Guidelines to write samples
+===========================
+
+Documentation
+^^^^^^^^^^^^^
+
+In order to write a testable sample, like an easy copy/paste, it is recommended to separate the python code from the documentation as below :
+
+.. code-block::
+
+ .. literalinclude:: xyz_foobar.py
+ :language: python
+
+Verify if formatting is correct by checking :
+
+.. code-block:: bash
+
+ tox -e docs
+ # output located in docs/_build/html/index.html
+
+
+Python example
+^^^^^^^^^^^^^^
+
+It's recommended to write a python example with either predefined placeholder variables for environment setup properties (like identity provider tenants identifiers/secrets), and use ``input()`` when user interaction is required. Feel free to reuse an existing example like ``docs/examples/native_spa_pkce_auth0.py`` and its associated test.
+
+Python tests
+^^^^^^^^^^^^
+
+You can write new tests in ``tests/examples/test_*py`` and inherit of base classes found in ``tests/examples/base.py`` based on your needs.
+
+Don't forget to skip python tests if you require an environment variables, also don't store any secrets or leak tenant informations in git.
+
+Skip tests example as below:
+
+.. code-block:: python
+
+ self.client_id = os.environ.get("AUTH0_PKCE_CLIENT_ID")
+ self.idp_domain = os.environ.get("AUTH0_DOMAIN")
+
+ if not self.client_id or not self.idp_domain:
+ self.skipTest("native auth0 is not configured properly")
+
+
+Then the sample can be copy paste into a python console
+
+Environment variables
+^^^^^^^^^^^^^^^^^^^^^
+
+Once referencing environment variables, you have to set them in the Github Actions. Any maintainers can do it, and it's the role of the maintainer to create a test tenant with test clients.
+
+Example on how to set new env secrets with `GitHub CLI <https://cli.github.com/>`_:
+
+.. code-block:: bash
+
+ gh secret set AUTH0_PASSWORD --body "secret"
+
+
+Helper Interfaces
+=================
+
+.. autoclass:: tests.examples.Sample
+ :members:
+
+.. autoclass:: tests.examples.Browser
+ :members:
Index: requests-oauthlib-2.0.0/docs/index.rst
===================================================================
--- requests-oauthlib-2.0.0.orig/docs/index.rst
+++ requests-oauthlib-2.0.0/docs/index.rst
@@ -77,6 +77,7 @@ Getting Started:
api
contributing
+ contributing_examples
Index: requests-oauthlib-2.0.0/tests/examples/__init__.py
===================================================================
--- /dev/null
+++ requests-oauthlib-2.0.0/tests/examples/__init__.py
@@ -0,0 +1,2 @@
+from .base import Sample
+from .base import Browser
Index: requests-oauthlib-2.0.0/tests/examples/base.py
===================================================================
--- requests-oauthlib-2.0.0.orig/tests/examples/base.py
+++ requests-oauthlib-2.0.0/tests/examples/base.py
@@ -35,6 +35,14 @@ class Sample():
fout.write(line)
def run_sample(self, filepath, variables):
+ """
+ Execute python sample as a background process.
+
+ :param filepath: Name of the python sample present in docs examples folder.
+ :type filepath: string
+ :param variables: Key Names/Values to replace in the python script before being run
+ :type variables: dict
+ """
inpath = os.path.join(cwd, "..", "..", "docs", "examples", filepath)
outpath = os.path.join(cwd, "tmp_{}".format(filepath))
self.replaceVariables(inpath, outpath, variables)
@@ -48,10 +56,21 @@ class Sample():
)
def write(self, string):
+ """
+ Write string into standard input. Useful to fill an answer to ``input()``
+
+ :param string: string to write
+ """
self.proc.stdin.write(string)
self.proc.stdin.flush()
def wait_for_pattern(self, pattern):
+ """
+ Wait until the background process is writing ``pattern`` in standard output.
+
+ :param pattern: search for this string before returning.
+ :type pattern: string
+ """
try:
while True:
line = self.proc.stdout.readline()
@@ -62,6 +81,9 @@ class Sample():
self.assertTrue(False, "timeout when looking for output")
def wait_for_end(self):
+ """
+ Wait until the background process ends. Timeout after 10sec.
+ """
try:
outs, err = self.proc.communicate(timeout=10)
self.outputs += filter(lambda x: x != '', outs.split('\n'))
@@ -88,6 +110,16 @@ class Browser():
self.driver.quit()
def authorize_auth0(self, authorize_url, expected_redirect_uri):
+ """
+ Start browser based on an Auth0 authorize url, and log user with user and password.
+ Returns once login journey ends with a redirection to ``expected_redirect_uri``.
+ Note this is for Auth0 login dialog specifically.
+
+ :param authorize_url: Full Authorize URL of Identity Provider
+ :type authorize_url: string
+ :param expected_redirect_uri: Expected ``redirect_uri``. Used only to check end of the authorize journey.
+ :type expected_redirect_uri: string
+ """
self.driver.get(authorize_url)
username = self.driver.find_element(By.ID, "username")
password = self.driver.find_element(By.ID, "password")
Index: requests-oauthlib-2.0.0/tests/examples/test_native_spa_pkce_auth0.py
===================================================================
--- requests-oauthlib-2.0.0.orig/tests/examples/test_native_spa_pkce_auth0.py
+++ requests-oauthlib-2.0.0/tests/examples/test_native_spa_pkce_auth0.py
@@ -1,9 +1,10 @@
import os
import unittest
-from . import base
+from . import Sample
+from . import Browser
-class TestNativeAuth0Test(base.Sample, base.Browser, unittest.TestCase):
+class TestNativeAuth0Test(Sample, Browser, unittest.TestCase):
def setUp(self):
super().setUp()
self.client_id = os.environ.get("AUTH0_PKCE_CLIENT_ID")
Index: requests-oauthlib-2.0.0/tests/test_compliance_fixes.py
===================================================================
--- requests-oauthlib-2.0.0.orig/tests/test_compliance_fixes.py
+++ requests-oauthlib-2.0.0/tests/test_compliance_fixes.py
@@ -115,7 +115,7 @@ class MailChimpComplianceFixTest(TestCas
authorization_response="https://i.b/?code=hello",
)
# Times should be close
- approx_expires_at = time.time() + 3600
+ approx_expires_at = round(time.time()) + 3600
actual_expires_at = token.pop("expires_at")
self.assertAlmostEqual(actual_expires_at, approx_expires_at, places=2)
@@ -289,7 +289,7 @@ class PlentymarketsComplianceFixTest(Tes
authorization_response="https://i.b/?code=hello",
)
- approx_expires_at = time.time() + 86400
+ approx_expires_at = round(time.time()) + 86400
actual_expires_at = token.pop("expires_at")
self.assertAlmostEqual(actual_expires_at, approx_expires_at, places=2)
Index: requests-oauthlib-2.0.0/requirements.txt
===================================================================
--- requests-oauthlib-2.0.0.orig/requirements.txt
+++ requests-oauthlib-2.0.0/requirements.txt
@@ -1,2 +1,2 @@
requests==2.31.0
-oauthlib[signedtoken]==3.2.2
+oauthlib[signedtoken]==3.3.0