diff --git a/.github/workflows/backend-sdk-testing.yml b/.github/workflows/backend-sdk-testing.yml new file mode 100644 index 000000000..08212eed2 --- /dev/null +++ b/.github/workflows/backend-sdk-testing.yml @@ -0,0 +1,91 @@ +name: "Backend SDK Tests" + +on: + pull_request: + types: + - opened + - reopened + - synchronize + push: + branches: + - master + - "v[0-9]+.[0-9]+" + tags: + - "(dev-)?v[0-9]+.[0-9]+.[0-9]+" + +jobs: + define-versions: + runs-on: ubuntu-latest + outputs: + fdiVersions: ${{ steps.versions.outputs.fdiVersions }} + cdiVersions: ${{ steps.versions.outputs.cdiVersions }} + pyVersions: '["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]' + nodeVersions: '["20"]' + steps: + - uses: actions/checkout@v4 + - uses: supertokens/get-supported-versions-action@main + id: versions + with: + has-fdi: true + has-cdi: true + + test: + runs-on: ubuntu-latest + needs: define-versions + + strategy: + fail-fast: false + matrix: + cdi-version: ${{ fromJSON(needs.define-versions.outputs.cdiVersions) }} + fdi-version: ${{ fromJSON(needs.define-versions.outputs.fdiVersions) }} + py-version: ${{ fromJson(needs.define-versions.outputs.pyVersions) }} + node-version: ${{ fromJson(needs.define-versions.outputs.nodeVersions) }} + + env: + API_PORT: 3030 + SUPERTOKENS_CORE_PORT: 3567 + SUPERTOKENS_CORE_HOST: localhost + + steps: + - uses: actions/checkout@v4 + with: + # Checking out to a custom path since the test repo will also be cloned + path: supertokens-python + + - uses: supertokens/get-versions-action@main + id: versions + with: + driver-name: python + cdi-version: ${{ matrix.cdi-version }} + fdi-version: ${{ matrix.fdi-version }} + env: + SUPERTOKENS_API_KEY: ${{ secrets.SUPERTOKENS_API_KEY }} + + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + - name: Create virtual environment and install dependencies + working-directory: supertokens-python + # Upgrade `pip` and `setuptools` to have the latest versions before further installs + run: | + python3 -m venv venv + source venv/bin/activate + python3 -m pip install pip setuptools --upgrade + make dev-install && rm -rf src + + - name: Start core and server + working-directory: supertokens-python + env: + SUPERTOKENS_ENV: testing + SUPERTOKENS_CORE_VERSION: ${{ steps.versions.outputs.coreVersionXy }} + run: | + source venv/bin/activate + docker compose up --build --wait + python3 tests/test-server/app.py & + + - uses: supertokens/backend-sdk-testing-action@main + with: + version: ${{ matrix.fdi-version }} + check-name-suffix: '[CDI=${{ matrix.cdi-version }}][Core=${{ steps.versions.outputs.coreVersionXy }}][FDI=${{ matrix.fdi-version }}][Py=${{ matrix.py-version }}][Node=${{ matrix.node-version }}]' + path: backend-sdk-testing diff --git a/CHANGELOG.md b/CHANGELOG.md index 9111dd1cd..aa3dfdead 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [unreleased] +- Sets up workflow to run backend-sdk-testing + - Updates test-servers to work with updated tests ## [0.29.1] - 2025-04-11 - Fixes an issue where `removeDevice` API allowed removing TOTP devices without the user completing MFA. diff --git a/compose.yml b/compose.yml index a06dd07e3..114e5e0e5 100644 --- a/compose.yml +++ b/compose.yml @@ -6,8 +6,18 @@ services: # Uses `$SUPERTOKENS_CORE_PORT` when available, else 3567 for local port - ${SUPERTOKENS_CORE_PORT:-3567}:3567 platform: linux/amd64 + depends_on: [oauth] + environment: + OAUTH_PROVIDER_PUBLIC_SERVICE_URL: http://oauth:4444 + OAUTH_PROVIDER_ADMIN_SERVICE_URL: http://oauth:4445 + OAUTH_PROVIDER_CONSENT_LOGIN_BASE_URL: http://localhost:3001/auth + OAUTH_CLIENT_SECRET_ENCRYPTION_KEY: asdfasdfasdfasdfasdf healthcheck: test: bash -c 'curl -s "http://127.0.0.1:3567/hello" | grep "Hello"' interval: 10s timeout: 5s retries: 5 + + oauth: + image: supertokens/oauth2-test:latest + platform: linux/amd64 diff --git a/tests/test-server/app.py b/tests/test-server/app.py index 71e74baeb..1cddc75e3 100644 --- a/tests/test-server/app.py +++ b/tests/test-server/app.py @@ -94,13 +94,17 @@ def origin_func( # pylint: disable=unused-argument, dangerous-default-value return origin return "http://localhost:8080" + core_host: str = os.environ.get("SUPERTOKENS_CORE_HOST", "localhost") + core_port: str = os.environ.get("SUPERTOKENS_CORE_PORT", "3567") + core_url = f"http://{core_host}:{core_port}" + init( app_info=InputAppInfo( app_name="SuperTokens", api_domain="http://api.supertokens.io", origin=origin_func, ), - supertokens_config=SupertokensConfig(connection_uri="http://localhost:3567"), + supertokens_config=SupertokensConfig(connection_uri=core_url), framework="flask", recipe_list=[emailpassword.init(), session.init()], ) @@ -739,6 +743,12 @@ def reset_override_params_api(): return jsonify({"ok": True}) +@app.route("/test/resetoverridelogs", methods=["GET"]) # type: ignore +def reset_override_logs(): + override_logging.reset_override_logs() + return jsonify({"ok": True}) + + @app.route("/test/getoverridelogs", methods=["GET"]) # type: ignore def get_override_logs(): return jsonify({"logs": override_logging.override_logs})