Skip to content

LW-481 [MISC] Accept masked webhook auth_token in GET assertions - #41

Merged
johnyrahul merged 2 commits into
mainfrom
LW-481-mask-webhook-auth-token
Nov 4, 2026
Merged

johnyrahul merged 2 commits into
mainfrom
LW-481-mask-webhook-auth-token

Conversation

@johnyrahul

@johnyrahul johnyrahul commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

What

Integration test test_webhook accepts the masked auth_token returned by get_webhook_details.

Why

GET /api/v2/whisper-manage-callback used to echo a webhook's stored auth_token. API Hub registers its in-cluster receiver under customers' own LLMWhisperer keys, so those customers could read API Hub's bearer token back. Zipstack/unstract-llm-whisperer#822 (LW-481) masks it on read: a token longer than 4 characters reads back as "********" plus its last 4 characters (dummy-token → "********oken"), a token of 4 characters or fewer as "********", and an empty one stays "". POST/PUT with any auth_token starting with "********" returns 400 (auth_token is the masked value returned by GET; send the actual token).

Dependencies

  • Related: https://github.com/Zipstack/unstract-llm-whisperer/pull/822
  • Merge this before Zipstack/unstract-llm-whisperer#822 reaches staging. Without it, the exact GET assertions here go red as soon as masking is deployed. This change passes both before and after the deploy, so it is safe to merge first.

How

New helpers in tests/integration/client_v2_test.py: masked_webhook_auth_token(token) mirrors the service's rule, and assert_webhook_auth_token(returned, sent) accepts either the raw token or exactly that masked form (so an empty token must read back as ""). Used at both GETs in test_webhook.

Notes on Testing

  • ruff check and ruff format --check clean; the masking helper was checked offline against "", abcd, abcde, new_token and dummy-token-updated; the integration module collects (19 tests); unit suite: 293 passed.
  • Not run live against a deployed environment.
  • Follow-up once masking is live everywhere: drop raw-token acceptance.

🤖 Generated with Claude Code

johnyrahul and others added 2 commits November 4, 2026 12:19
GET /whisper-manage-callback now returns a stored, non-empty auth_token as
"********" (an empty one stays ""). Accept either the raw token or the mask
until the change is deployed everywhere; an empty token must still read
back as "".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-481)

The service now shows a token longer than 4 characters as "********" plus
its last 4 characters, a shorter one as "********", and an empty one as "".
Compute that exact masked form and accept it or the raw token.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@johnyrahul
johnyrahul marked this pull request as ready for review November 4, 2026 08:49
@greptile-apps

greptile-apps Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

via Greptile

RetriggerView in GreptileConfidence Score: 5/5

[Low impact] This change appears safe to merge before the service rollout.

Summary

Updates test_webhook to accept either the original auth_token or its exact masked form.

  • Webhook GET checks accept the raw token or its masked form.

johnyrahul explicitly describes raw-token acceptance as intentional during rollout, with removal deferred until masking is live everywhere.

Reviews (1) · Last reviewed commit: "test: expect the last 4 characters in a ..." · Reviewed by Greptile

@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor
filepath function $$\textcolor{#23d18b}{\tt{passed}}$$ SUBTOTAL
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_usage\_info}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_v2}}$$ $$\textcolor{#23d18b}{\tt{9}}$$ $$\textcolor{#23d18b}{\tt{9}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_highlight}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_v2\_url\_in\_post}}$$ $$\textcolor{#23d18b}{\tt{4}}$$ $$\textcolor{#23d18b}{\tt{4}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_webhook}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_detail}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_detail\_not\_found}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/integration/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_line\_splitter\_strategy\_reaches\_service}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_register\_webhook}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_webhook\_details}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_detail\_success}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_detail\_not\_found}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_json\_string\_response\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_json\_string\_response\_202}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_invalid\_json\_response\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_invalid\_json\_response\_202}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_default\_word\_confidence\_threshold}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_custom\_word\_confidence\_threshold}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_sends\_corrected\_param\_names}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_sends\_page\_separator\_under\_both\_spellings}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_defaults\_when\_no\_param\_passed}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_deprecated\_page\_seperator\_is\_forwarded}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_deprecated\_filename\_is\_forwarded}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_deprecated\_line\_spitter\_strategy\_is\_ignored}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_rejects\_both\_spellings}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_omits\_include\_cell\_borders\_by\_default}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_sends\_include\_cell\_borders\_when\_set}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_on\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_on\_timeout}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_on\_429}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_on\_500}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_no\_retry\_on\_400}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_no\_retry\_on\_401}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retries\_exhausted\_raises}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retries\_exhausted\_500\_returns\_response}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_disabled}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_post\_uses\_min\_of\_api\_timeout\_and\_wait\_timeout}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_post\_uses\_wait\_timeout\_when\_smaller}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_send\_request\_deadline\_caps\_timeout}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/client\_v2\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_send\_request\_deadline\_stops\_retries}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_request\_matches\_the\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{14}}$$ $$\textcolor{#23d18b}{\tt{14}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_auth\_header\_is\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_wire\_headers\_match\_the\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_custom\_headers\_override\_the\_transport\_defaults}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_case\_variant\_custom\_header\_overrides\_rather\_than\_duplicates}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_case\_variant\_key\_override\_does\_not\_also\_send\_the\_real\_key}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_custom\_headers\_still\_reach\_the\_request}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_headers\_changed\_after\_the\_first\_call\_reach\_the\_next\_one}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_transport\_can\_be\_released\_and\_reused}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_closing\_an\_unused\_client\_is\_not\_an\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_url\_mode\_does\_not\_put\_the\_url\_on\_the\_query\_string}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_upload\_mode\_does\_not\_send\_url\_in\_post}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_booleans\_are\_sent\_the\_way\_the\_previous\_transport\_sent\_them}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_send\_only\_covers\_every\_parameter\_whisper\_builds}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_an\_unrequested\_parameter\_is\_not\_sent}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_requested\_parameter\_is\_sent}}$$ $$\textcolor{#23d18b}{\tt{6}}$$ $$\textcolor{#23d18b}{\tt{6}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_undeclared\_parameters\_are\_refused}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_no\_operation\_sends\_a\_spec\_default\_the\_client\_never\_set}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_return\_value\_matches\_the\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{84}}$$ $$\textcolor{#23d18b}{\tt{84}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_error\_handling\_matches\_the\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{70}}$$ $$\textcolor{#23d18b}{\tt{70}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_whisper\_poll\_loop\_matches\_the\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_transport\_errors\_are\_translated}}$$ $$\textcolor{#23d18b}{\tt{13}}$$ $$\textcolor{#23d18b}{\tt{13}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_no\_httpx\_failure\_escapes\_untranslated}}$$ $$\textcolor{#23d18b}{\tt{19}}$$ $$\textcolor{#23d18b}{\tt{19}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_translation\_decides\_what\_gets\_retried}}$$ $$\textcolor{#23d18b}{\tt{6}}$$ $$\textcolor{#23d18b}{\tt{6}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_connect\_timeout\_is\_still\_a\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_translated\_errors\_keep\_the\_original\_cause}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_transport\_failures\_are\_still\_retried}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_retried\_upload\_replays\_the\_whole\_body}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_redirects\_are\_followed}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_request\_timeout\_reaches\_the\_transport}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_deadline\_still\_caps\_each\_attempt}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_deadline\_still\_stops\_retries}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_malformed\_api\_key\_is\_not\_reported\_as\_a\_network\_failure}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_malformed\_base\_url\_is\_translated}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_call\_on\_a\_closed\_transport\_raises\_the\_documented\_exception}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_transport\_is\_built\_once\_under\_concurrent\_first\_calls}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_acquiring\_the\_transport\_never\_returns\_a\_cleared\_handle}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_stream\_upload\_is\_sent\_streaming\_and\_read\_back}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_a\_body\_with\_no\_declared\_charset\_is\_read\_as\_utf\_8}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_encoding\_is\_applied\_to\_a\_real\_response}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_constructor\_is\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_public\_methods\_are\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_deprecated\_parameter\_resolver\_is\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_highlight\_rect\_is\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_class\_attributes\_are\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_retry\_policy\_attributes\_are\_unchanged}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_defaults\_match\_a\_default\_constructed\_published\_client}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_every\_wrapped\_operation\_is\_covered}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_every\_operation\_declares\_the\_failures\_callers\_actually\_hit}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/unit/compat\_test.py}}$$ $$\textcolor{#23d18b}{\tt{test\_the\_baseline\_is\_the\_released\_client\_unmodified}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{TOTAL}}$$ $$\textcolor{#23d18b}{\tt{312}}$$ $$\textcolor{#23d18b}{\tt{312}}$$

@johnyrahul
johnyrahul merged commit d4596b0 into main Nov 4, 2026
7 checks passed
@johnyrahul
johnyrahul deleted the LW-481-mask-webhook-auth-token branch November 4, 2026 08:55
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