Skip to content

[claude-proposal] Add default dev OAuth credentials for Google#2544

Open
stopachka wants to merge 2 commits intomainfrom
stopa/default-oauth-credentials
Open

[claude-proposal] Add default dev OAuth credentials for Google#2544
stopachka wants to merge 2 commits intomainfrom
stopa/default-oauth-credentials

Conversation

@stopachka
Copy link
Copy Markdown
Contributor

Summary

This PR adds support for default development OAuth credentials for Google, similar to how Clerk provides shared OAuth credentials for development. Developers can now enable Google OAuth with a single click, no Google Cloud project setup needed.

Motivation

Currently, adding Google OAuth to an Instant app requires:

  1. Creating a Google Cloud project
  2. Setting up the OAuth consent screen
  3. Creating OAuth credentials
  4. Copying the client ID and secret into the Instant dashboard

This is a significant DX barrier, especially for developers who just want to try OAuth during development. Clerk solves this by providing shared development credentials that work immediately.

How it works

The flow

  1. Developer goes to Dashboard > Auth > Add client > Google
  2. They see two options: Quick setup (recommended for dev) and Custom credentials
  3. Clicking "Quick setup" creates a client that uses Instant's shared Google OAuth app
  4. The OAuth redirect flow works immediately. The Google consent screen shows "InstantDB" branding (since it's Instant's OAuth app)
  5. For production, the developer deletes the default client and creates one with their own Google credentials for proper branding

Opt-in, not automatic

Default credentials are not enabled by default. The developer must explicitly click "Quick setup" in the dashboard. This prevents unauthorized OAuth flows against apps that never intended to support Google sign-in.

Architecture

Config layer (config_edn.clj, config.clj, dev.edn):

  • New config key default-app-oauth-clients maps provider names to {:client-id, :client-secret} pairs
  • Credentials are stored in overlay.edn (gitignored) to keep secrets out of the repo
  • For production/staging, these would be encrypted in the environment config

Model layer (app_oauth_client.clj):

  • ->OAuthClient checks for meta.useDefaultCredentials on the client record
  • When true, it pulls client-id and client-secret from config instead of decrypting stored credentials
  • Non-default clients are completely unaffected (existing path unchanged)

Dashboard routes (dash/routes.clj):

  • oauth-clients-post accepts a new use_default_credentials flag
  • When set, it looks up the default client ID from config and stores it in the DB record, sets the discovery endpoint automatically, and marks the client meta with useDefaultCredentials: true
  • No encrypted client secret is stored (it's in config)

Dashboard UI (Google.tsx, shared.tsx):

  • The "Add Google client" form now shows a choice screen first
  • "Quick setup" creates a default client with one click (no form fields)
  • "Custom credentials" shows the existing form for entering your own client ID/secret
  • Default clients display a "Dev credentials" badge in the client list
  • Setup instructions are simplified for default clients (no Google Console steps)

Security considerations

  • Default credentials are shared across all Instant apps using them. This is acceptable for development but should be clearly marked as dev-only.
  • The consent screen shows "InstantDB" branding, not the developer's app. This is the same tradeoff Clerk makes.
  • The id_token flow (for Google One Tap) works: the client ID is stored in the DB record so it can be used in code examples, and ->OAuthClient provides the secret from config for audience validation.
  • Origin validation is skipped for default credential clients in the id_token path (since client_secret is not in the DB record). The id_token itself is still fully validated (signature, issuer, audience, nonce).

Files changed

File What changed
server/src/instant/config_edn.clj Added ::default-app-oauth-clients spec
server/src/instant/config.clj Added get-default-app-oauth-client accessor
server/resources/config/dev.edn Added comment pointing to overlay.edn for credentials
server/src/instant/model/app_oauth_client.clj Added default-credentials helper, updated ->OAuthClient
server/src/instant/dash/routes.clj Updated oauth-clients-post to handle use_default_credentials
client/www/components/dash/auth/Google.tsx Added quick setup UI, dev credentials badge
client/www/components/dash/auth/shared.tsx Added useDefaultCredentials param to addClient
server/test/instant/runtime/routes_test.clj Added default-credentials-oauth-client-test

Test plan

  • default-credentials-oauth-client-test passes (13 assertions)
    • Creates default credentials client, verifies meta flags
    • Verifies ->OAuthClient uses config credentials (not DB)
    • Verifies non-default clients still use stored credentials
    • Verifies upsert-oauth-link! creates users correctly
    • Verifies sign-in with same sub returns same user
  • All existing OAuth tests pass (4 tests, 23 assertions, 0 failures)
  • Manual test: create default Google client in dashboard, complete OAuth flow
  • Manual test: verify id_token flow works with default client

Future work

  • Add default credentials for GitHub (backend already supports it, just needs config + UI)
  • Add per-app user cap for default credentials (e.g. 100 users)
  • Consider Apple support (more complex due to Apple Developer account requirements)
  • Add production/staging encrypted credentials

🤖 Generated with Claude Code

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Apr 12, 2026

📝 Walkthrough

Walkthrough

Adds a "use default credentials" flow: frontend chooser and submit flag; API accepts use_default_credentials and uses config-supplied OAuth client info; config/spec additions and accessor; model resolves credentials from config when meta requests defaults; tests cover end-to-end and unit cases.

Changes

Cohort / File(s) Summary
Frontend UI
client/www/components/dash/auth/Google.tsx
Adds chooser UI state (`choosing
API Client Layer
client/www/components/dash/auth/shared.tsx
Extends addClient signature with useDefaultCredentials?: boolean and includes use_default_credentials in the POST body.
Configuration & Spec
server/resources/config/dev.edn, server/src/instant/config.clj, server/src/instant/config_edn.clj
Adds :default-app-oauth-clients to dev config, introduces get-default-app-oauth-client accessor, and updates config spec to permit optional ::default-app-oauth-clients.
Route Handling
server/src/instant/dash/routes.clj
oauth-clients-post reads use_default_credentials: when true, it looks up provider and default creds via config, derives discovery endpoint (with Google fallback), validates presence, sets stored client-secret to nil, sets client-id from defaults, and annotates meta with useDefaultCredentials/defaultProvider; added default-discovery-endpoints.
OAuth Client Model
server/src/instant/model/app_oauth_client.clj
Adds internal default-credentials helper and updates ->OAuthClient to prefer config-provided client-id/secret when meta.useDefaultCredentials is truthy, keeping existing provider branching.
Tests
server/test/instant/runtime/routes_test.clj
Adds mock-google-discovery and tests (default-credentials-oauth-client-test, default-credentials-oauth-e2e-test) that override config/discovery, assert credential resolution, auth URL generation, sign-in/up behavior, and idempotency.

Sequence Diagram

sequenceDiagram
    participant User
    participant UI as Frontend UI
    participant API as API Handler
    participant Config as Config Manager
    participant Model as OAuth Client Model

    User->>UI: Choose "Use dev credentials"
    UI->>API: POST /dash/apps/{appId}/oauth_clients { use_default_credentials: true, meta: {appType: "web"} }
    API->>Config: get-default-app-oauth-client(provider)
    Config-->>API: return default client-id & encrypted secret
    API->>Model: create app-oauth-client with meta.useDefaultCredentials=true, defaultProvider=provider
    Model->>Config: get-default-app-oauth-client(defaultProvider)
    Config-->>Model: return default credentials
    Model-->>API: resolved OAuth client (client-id from config, decrypted secret)
    API-->>UI: respond created with meta indicating default credentials
    UI-->>User: show "Dev credentials" badge and usage info
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • fix dark mode auth css #2498 — Modifies the same frontend component (client/www/components/dash/auth/Google.tsx) and may conflict with UI changes.

Suggested reviewers

  • dwwoelfel
  • nezaj
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title '[claude-proposal] Add default dev OAuth credentials for Google' clearly describes the main change: introducing default development OAuth credentials for Google sign-in.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, covering motivation, implementation details, security considerations, and test results for the default OAuth credentials feature.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch stopa/default-oauth-credentials

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@server/src/instant/dash/routes.clj`:
- Around line 626-646: The code currently reads provider-name from
client-supplied meta and uses it in the use-default-credentials branch; instead,
resolve the provider name server-side from the authoritative provider_id and
ignore/override meta.providerName for credential/discovery selection. Replace
uses of the local provider-name in the block that calls
config/get-default-app-oauth-client, default-discovery-endpoints, and the github
check with a server-resolved value (e.g., resolved-provider-name obtained via
the provider_id lookup function you already have), merge that resolved name into
meta when setting "defaultProvider", and ensure discovery-endpoint and the
github conditional use resolved-provider-name rather than the client-supplied
provider-name.
- Around line 629-641: The use-default-credentials branch returns a potentially
nil discovery endpoint (from default-discovery-endpoints) causing delayed
failures; update the branch that binds default-creds in the function handling
use-default-credentials to check that the discovery endpoint (lookup of
default-discovery-endpoints with (or provider-name "google")) is present and if
missing call ex/throw-validation-err! (similar to the existing default-creds
check) with an appropriate :use_default_credentials / provider-name context and
message, so client creation is rejected immediately instead of returning nil
discovery info.

In `@server/src/instant/model/app_oauth_client.clj`:
- Around line 123-130: The function default-credentials currently returns nil
when useDefaultCredentials is set but config/get-default-app-oauth-client
returns no defaults; change default-credentials to fail fast: after detecting
(get (:meta oauth-client) "useDefaultCredentials") call
config/get-default-app-oauth-client with the resolved provider and if that call
returns nil throw an explicit exception (or use ex-info) with a clear message
including the provider and client id/context, instead of silently falling back
to stored credentials; update callers accordingly if they expect nil.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 7f263dac-9a9f-4749-850a-b1a3d835437e

📥 Commits

Reviewing files that changed from the base of the PR and between 9d6d1cf and bdc38ce.

📒 Files selected for processing (8)
  • client/www/components/dash/auth/Google.tsx
  • client/www/components/dash/auth/shared.tsx
  • server/resources/config/dev.edn
  • server/src/instant/config.clj
  • server/src/instant/config_edn.clj
  • server/src/instant/dash/routes.clj
  • server/src/instant/model/app_oauth_client.clj
  • server/test/instant/runtime/routes_test.clj

Comment thread server/src/instant/dash/routes.clj
Comment thread server/src/instant/dash/routes.clj Outdated
Comment thread server/src/instant/model/app_oauth_client.clj
@github-actions
Copy link
Copy Markdown
Contributor

Apps can now enable Google OAuth with zero configuration by using
Instant's shared development credentials. This mirrors what Clerk
does: developers toggle on Google in the dashboard and it works
immediately without needing to set up a Google Cloud project.

The flow:
1. Developer goes to Dashboard > Auth > Add client > Google
2. Clicks "Quick setup (recommended for development)"
3. Done. OAuth works with Instant's shared Google credentials.

Backend changes:
- New config key `default-app-oauth-clients` for shared credentials
- `app_oauth_client/->OAuthClient` checks meta.useDefaultCredentials
  and pulls credentials from config instead of the DB
- `dash/routes/oauth-clients-post` accepts `use_default_credentials`
  flag and auto-populates client_id/discovery from config

Frontend changes:
- Google OAuth setup now shows a choice: Quick setup vs Custom
- Quick setup creates a default-credentials client with one click
- Default clients display a "Dev credentials" badge
- Setup instructions are simplified (no Google Console steps)

The consent screen shows "InstantDB" branding in dev. For production,
developers delete the default client and create one with their own
Google credentials.
- Resolve provider name server-side from provider_id, not client meta
- Fail fast when default discovery endpoint is missing
- Fail fast in ->OAuthClient when useDefaultCredentials is set but
  config credentials are missing
- Rewrite e2e test: verify ->OAuthClient builds correct auth URL with
  default credentials, test full sign-in flow, verify custom clients
  still use stored credentials
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (1)
server/src/instant/dash/routes.clj (1)

626-655: ⚠️ Potential issue | 🟠 Major

The custom-client branch still trusts meta.providerName.

Lines 653-654 still use request-supplied meta.providerName to decide whether discovery_endpoint is required. A caller can send "providerName": "github" for any provider_id and skip discovery validation/create the wrong client shape later. Resolve the provider name once from provider_id and use that authoritative value in both branches, then merge it back into meta if downstream code still needs it.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/src/instant/dash/routes.clj` around lines 626 - 655, The code still
trusts request-supplied meta.providerName when deciding whether
discovery_endpoint is required; resolve the authoritative provider name from the
provider record (like how resolved-provider is computed when
use-default-credentials is true) before the branch and use that resolved value
instead of provider-name in both branches (including the coerce-optional-param!
/ ex/get-param! call that checks for "github"), then merge that resolved
provider name back into meta so downstream code sees the authoritative provider
(update references to provider-name, the discovery_endpoint validation, and the
meta merge accordingly).
🧹 Nitpick comments (1)
server/test/instant/runtime/routes_test.clj (1)

885-895: Assert the image-write behavior this test name promises.

This block says the sign-in flow "creates user with image", but it only checks :created and :email. As written, the image update can regress while the test stays green. Please assert the stored/returned image field here, or rename the test to match what it actually verifies.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/test/instant/runtime/routes_test.clj` around lines 885 - 895, The test
name promises the created user has an image but the assertions only check
:created and :email; update the assertions after calling
route/upsert-oauth-link! and app-user-model/get-by-id to verify the image was
persisted (e.g., assert the stored image field on user matches
"https://example.com/photo.jpg" — check the actual field name used in your
model, such as :image, :image_url, or :avatar_url) or, if you don't want to
assert image behavior, rename the test to reflect that it only verifies
creation/email rather than image storage; locate this change around
route/upsert-oauth-link! and app-user-model/get-by-id in the test block.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@server/src/instant/dash/routes.clj`:
- Around line 631-633: The code currently defaults resolved-provider to "google"
when app-oauth-service-provider-model/get-by-id returns nil; instead, check the
retrieved provider (the provider binding from
app-oauth-service-provider-model/get-by-id using provider-id) and if it's nil
immediately return/reject with an appropriate client error (e.g., 404/400)
referencing the missing provider_id, before computing resolved-provider, so you
do not synthesize a valid-looking client for a nonexistent provider.

In `@server/src/instant/model/app_oauth_client.clj`:
- Around line 123-142: The code treats "useDefaultCredentials"/"defaultProvider"
as client-controlled metadata which allows later updates to flip a client into
default-credentials mode; change default-credentials and ->OAuthClient to read
these flags only from a server-controlled source (not (:meta oauth-client))—for
example consult a server-only field on the oauth-client record or a
config/db-backed map (i.e., replace reading (get (:meta oauth-client)
"useDefaultCredentials"/"defaultProvider") in default-credentials with a call to
the server-owned accessor), and make update! stop deep-merging those keys from
incoming :meta by filtering out "useDefaultCredentials" and "defaultProvider"
(or rejecting them) when merging client metadata so they remain immutable and
only set via the validated create path.

In `@server/test/instant/runtime/routes_test.clj`:
- Around line 872-883: The test references clojure.string/includes? but the
namespace does not require clojure.string; add a require entry like
[clojure.string :as string] to the ns require list and update the two calls in
the test to use string/includes? instead of clojure.string/includes? (affects
the testing block that constructs oauth-client via
app-oauth-client-model/->OAuthClient and calls oauth/create-authorization-url).

---

Duplicate comments:
In `@server/src/instant/dash/routes.clj`:
- Around line 626-655: The code still trusts request-supplied meta.providerName
when deciding whether discovery_endpoint is required; resolve the authoritative
provider name from the provider record (like how resolved-provider is computed
when use-default-credentials is true) before the branch and use that resolved
value instead of provider-name in both branches (including the
coerce-optional-param! / ex/get-param! call that checks for "github"), then
merge that resolved provider name back into meta so downstream code sees the
authoritative provider (update references to provider-name, the
discovery_endpoint validation, and the meta merge accordingly).

---

Nitpick comments:
In `@server/test/instant/runtime/routes_test.clj`:
- Around line 885-895: The test name promises the created user has an image but
the assertions only check :created and :email; update the assertions after
calling route/upsert-oauth-link! and app-user-model/get-by-id to verify the
image was persisted (e.g., assert the stored image field on user matches
"https://example.com/photo.jpg" — check the actual field name used in your
model, such as :image, :image_url, or :avatar_url) or, if you don't want to
assert image behavior, rename the test to reflect that it only verifies
creation/email rather than image storage; locate this change around
route/upsert-oauth-link! and app-user-model/get-by-id in the test block.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 2e8e88c7-9d81-4b2b-b23f-48dcf40295cb

📥 Commits

Reviewing files that changed from the base of the PR and between 3684924 and 3475cbe.

📒 Files selected for processing (3)
  • server/src/instant/dash/routes.clj
  • server/src/instant/model/app_oauth_client.clj
  • server/test/instant/runtime/routes_test.clj

Comment on lines +631 to +633
(let [provider (app-oauth-service-provider-model/get-by-id
{:app-id app-id :id provider-id})
resolved-provider (or (:provider_name provider) "google")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Reject unknown provider_id instead of defaulting it to Google.

If app-oauth-service-provider-model/get-by-id returns nil, resolved-provider becomes "google" and the request can create a valid-looking default client tied to a nonexistent provider record. Please assert that the provider exists before deriving resolved-provider.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/src/instant/dash/routes.clj` around lines 631 - 633, The code
currently defaults resolved-provider to "google" when
app-oauth-service-provider-model/get-by-id returns nil; instead, check the
retrieved provider (the provider binding from
app-oauth-service-provider-model/get-by-id using provider-id) and if it's nil
immediately return/reject with an appropriate client error (e.g., 404/400)
referencing the missing provider_id, before computing resolved-provider, so you
do not synthesize a valid-looking client for a nonexistent provider.

Comment on lines +123 to +142
(defn- default-credentials
"Returns {:client-id ... :client-secret ...} from config for a default
credentials client, or nil if the client doesn't use defaults."
[oauth-client]
(when (get (:meta oauth-client) "useDefaultCredentials")
(let [provider (get (:meta oauth-client) "defaultProvider" "google")]
(or (config/get-default-app-oauth-client provider)
(throw (ex-info "Missing default OAuth credentials in config"
{:provider provider
:oauth-client-id (:id oauth-client)}))))))

(defn ->OAuthClient [oauth-client]
(cond
(:discovery_endpoint oauth-client)
(oauth/generic-oauth-client-from-discovery-url
{:app-id (:app_id oauth-client)
:provider-id (:provider_id oauth-client)
:client-id (:client_id oauth-client)
:client-secret (when (:client_secret oauth-client)
(decrypted-client-secret oauth-client))
:discovery-endpoint (:discovery_endpoint oauth-client)
:meta (:meta oauth-client)})
(let [defaults (default-credentials oauth-client)
client-id (if defaults
(:client-id defaults)
(:client_id oauth-client))
client-secret (if defaults
(:client-secret defaults)
(when (:client_secret oauth-client)
(decrypted-client-secret oauth-client)))]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Treat useDefaultCredentials as server-owned, not mutable client metadata.

->OAuthClient now switches to shared config credentials purely from (:meta oauth-client), but update! in this namespace still deep-merges arbitrary :meta. That means a later metadata update can flip an existing custom client into default-credentials mode, or change defaultProvider, without going through the validated create path. Please make these flags immutable/server-controlled instead of trusting mutable metadata here.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/src/instant/model/app_oauth_client.clj` around lines 123 - 142, The
code treats "useDefaultCredentials"/"defaultProvider" as client-controlled
metadata which allows later updates to flip a client into default-credentials
mode; change default-credentials and ->OAuthClient to read these flags only from
a server-controlled source (not (:meta oauth-client))—for example consult a
server-only field on the oauth-client record or a config/db-backed map (i.e.,
replace reading (get (:meta oauth-client)
"useDefaultCredentials"/"defaultProvider") in default-credentials with a call to
the server-owned accessor), and make update! stop deep-merging those keys from
incoming :meta by filtering out "useDefaultCredentials" and "defaultProvider"
(or rejecting them) when merging client metadata so they remain immutable and
only set via the validated create path.

Comment on lines +872 to +883
(testing "->OAuthClient resolves default credentials and builds valid auth URL"
(let [oauth-client (app-oauth-client-model/->OAuthClient client)
auth-url (oauth/create-authorization-url
oauth-client
"test-state"
"http://localhost:8888/runtime/oauth/callback"
{})]
(is (= "test-default-client-id" (:client-id oauth-client)))
(is (= "test-default-secret"
(crypt-util/secret-value (:client-secret oauth-client))))
(is (clojure.string/includes? auth-url "accounts.google.com"))
(is (clojure.string/includes? auth-url "test-default-client-id"))))
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '1,20p' server/test/instant/runtime/routes_test.clj
echo
rg -n 'clojure\.string/includes\?' server/test/instant/runtime/routes_test.clj

Repository: instantdb/instant

Length of output: 1137


🏁 Script executed:

sed -n '1,35p' server/test/instant/runtime/routes_test.clj

Repository: instantdb/instant

Length of output: 1381


Add the missing clojure.string require.

The test uses clojure.string/includes? on lines 882 and 883 without requiring clojure.string in the ns form. Add [clojure.string :as string] to the require block and update the calls to use string/includes? instead so the namespace has explicit dependencies.

🧰 Tools
🪛 GitHub Check: lint

[warning] 882-882:
Unresolved namespace clojure.string. Are you missing a require?

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/test/instant/runtime/routes_test.clj` around lines 872 - 883, The test
references clojure.string/includes? but the namespace does not require
clojure.string; add a require entry like [clojure.string :as string] to the ns
require list and update the two calls in the test to use string/includes?
instead of clojure.string/includes? (affects the testing block that constructs
oauth-client via app-oauth-client-model/->OAuthClient and calls
oauth/create-authorization-url).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant