Skip to content

Add TaskResultLog, TokenStore, and Okta display_name regression specs - #467

Merged
rsmoke merged 3 commits into
stagingfrom
cursor/task-result-token-coverage-a3f2
Oct 14, 2026
Merged

rsmoke merged 3 commits into
stagingfrom
cursor/task-result-token-coverage-a3f2

Conversation

@cursor

@cursor cursor Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Risky behavior now covered

  • TaskResultLog#update_log: success vs error status from the debug flag, structured JSON payload append, blank-payload no-op, and ApiLog fallback when persistence fails (nightly API update reporting).
  • UmApi::TokenStore#fetch: refresh after expiry buffer, missing/failed access_token responses, and exception wrapping into failure results (auth token acquisition for Buildings/Classroom APIs).
  • Okta SAML callback: display_name mapping when auth.info.name is nil (regression from Switch shibboleth authentication to okta #461 shibboleth→Okta switch).

Test files added/updated

  • spec/lib/task_result_log_spec.rb (new)
  • spec/lib/um_api_spec.rb
  • spec/requests/users/omniauth_callbacks_spec.rb

Why these tests materially reduce regression risk

Nightly sync depends on correct token refresh/failure signaling and durable success/error logs. A wrong status or dropped structured report hides production failures. Okta’s attribute shape differs from Shibboleth (display_name vs name); without an end-to-end callback assertion, users can be created with blank display names again.

Validation

bundle exec rspec spec/lib/task_result_log_spec.rb spec/lib/um_api_spec.rb spec/requests/users/omniauth_callbacks_spec.rb → 34 examples, 0 failures (SimpleCov minimum on subset runs is expected noise).

Open in Web View Automation 

Note

Low Risk
Changes are mostly specs plus clearer debug logging on a failed ApiUpdateLog save; no production auth or sync behavior changes beyond that log message.

Overview
Adds regression coverage around nightly API update logging, UM API token acquisition, and Okta SAML user creation, plus a small fix when ApiUpdateLog persistence fails.

TaskResultLog#update_log (in lib/auth_token_api.rb) now logs real ActiveRecord validation messages via interpolation instead of a static placeholder string. New specs assert success/error status from the debug flag, structured JSON appended to the stored result, no structured section when the payload is blank, and fallback to the API logger when save fails.

UmApi::TokenStore#fetch specs gain shared stubs and cases for post-expiry refresh, success responses without access_token, explicit API failures, and wrapped exceptions (e.g. SocketError).

Okta SAML callback request specs mock auth.info.display_name (with name nil) and assert users get a non-blank display_name after sign-in, matching the post–#461 attribute shape.

Reviewed by Cursor Bugbot for commit b1bf929. Bugbot is set up for automated code reviews on this repo. Configure here.

cursoragent and others added 2 commits October 2, 2026 10:04
Cover nightly API update logging status/payload persistence, token
cache expiry and failure paths, and Okta SAML display_name mapping on
omniauth callback so auth/name regressions are caught early.

Co-authored-by: rsmoke <rsmoke@umich.edu>
@rsmoke
rsmoke marked this pull request as ready for review October 14, 2026 17:12
Copilot AI balanced review requested due to automatic review settings October 14, 2026 17:12

Copilot AI left a comment

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.

🟡 Changes recommended

The fallback spec preserves an unhelpful literal error message, and blank-payload coverage only tests nil.

2 open findings
What changed in this PR

Adds regression coverage for nightly sync logging, token acquisition, and Okta SAML display names.

Changes:

  • Tests TaskResultLog persistence, structured payloads, and fallback logging.
  • Expands token caching, expiry, and failure coverage.
  • Verifies Okta display_name mapping.
File Description
spec/​lib/​task_result_log_spec.rb Covers update-log behavior and fallback logging.
spec/​lib/​um_api_spec.rb Covers token refresh and failures.
spec/​requests/​users/​omniauth_callbacks_spec.rb Covers Okta display-name persistence.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +61 to +63
expect(logger).to receive(:debug).with(
"api_update_log, error: Could not save: record.errors.full_messages"
)
end

it "does not append a structured report section when payload is blank" do
described_class.new.update_log("plain summary only", false, nil)

@cursor cursor Bot left a comment •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

Comment thread spec/lib/task_result_log_spec.rb
@cursor
cursor Bot requested review from britaumich and rsmoke October 14, 2026 17:17

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit b1bf929. Configure here.

Comment thread lib/auth_token_api.rb
@log.api_logger.debug "api_update_log, error: Could not save: record.errors.full_messages"
@log.api_logger.debug(
"api_update_log, error: Could not save: #{record.errors.full_messages.join(', ')}"
)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Stale fallback log spec assertion

Medium Severity

The save-failure fallback now interpolates record.errors.full_messages into the debug message, but the TaskResultLog example still expects the previous uninterpolated text. That spec will fail, so the ApiLog fallback path is no longer covered.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit b1bf929. Configure here.

@rsmoke
rsmoke merged commit 2ffe2ca into staging Oct 14, 2026
5 of 6 checks passed
@rsmoke
rsmoke deleted the cursor/task-result-token-coverage-a3f2 branch October 14, 2026 19:13
rsmoke added a commit that referenced this pull request Oct 14, 2026
* Update tailwindcss dependencies, modify Procfile for CSS watch command, and enhance support info modal with improved accessibility and styling.

* Add DepartmentApi and SentryMetrics regression specs (#462)

Cover department lookup success/failure shaping used by BuildingsApi room
updates, and ensure Sentry metric failures are swallowed so jobs/rake keep
running.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* Add stale-room deactivation regression specs for media preservation. (#463)

Cover the success path that hides rooms via visible=false while keeping
contacts, characteristics, and Active Storage panoramas/images, plus the
already-hidden fail-closed invariant in BuildingsApi and ClassroomApi.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* Add ApiUpdateDatabase PhaseResult/RunResult regression specs (#464)

Cover structured phase/run reporting and runner early-exit when auth
token acquisition fails, so nightly classroom sync failures stay
visible in ApiUpdateLog without continuing later phases.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* Bump rubyzip from 3.2.2 to 3.4.0 in the bundler group across 1 directory (#465)

Bumps the bundler group with 1 update in the / directory: [rubyzip](https://github.com/rubyzip/rubyzip).


Updates `rubyzip` from 3.2.2 to 3.4.0
- [Release notes](https://github.com/rubyzip/rubyzip/releases)
- [Changelog](https://github.com/rubyzip/rubyzip/blob/main/Changelog.md)
- [Commits](rubyzip/rubyzip@v3.2.2...v3.4.0)

---
updated-dependencies:
- dependency-name: rubyzip
  dependency-version: 3.4.0
  dependency-type: indirect
  dependency-group: bundler
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: rsmokeUM <rsmoke@umich.edu>

* Add TaskResultLog, TokenStore, and Okta display_name regression specs (#467)

* Add TaskResultLog, TokenStore, and Okta display_name regression specs

Cover nightly API update logging status/payload persistence, token
cache expiry and failure paths, and Okta SAML display_name mapping on
omniauth callback so auth/name regressions are caught early.

Co-authored-by: rsmoke <rsmoke@umich.edu>

* Improve error logging in ApiUpdateLog by including detailed error messages when save fails.

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* Add ApplicationHelper api_status/api_log_text regression specs (#470)

* Add ApplicationHelper api_status and api_log_text regression specs.

Cover the admin header banner signals for missing nightly runs, error vs success
recency, and blank log fallback so false-positive or missed API failure alerts
are less likely to regress.

Co-authored-by: rsmoke <rsmoke@umich.edu>

* Potential fix for pull request finding 'Test does not verify log recency filtering'

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add FloorPolicy authorization regression specs (#471)

* Add FloorPolicy authorization regression specs.

Lock viewer show vs admin mutation permissions and deny show when
membership groups are empty outside production.

Co-authored-by: rsmoke <rsmoke@umich.edu>

* Improve error logging in TaskResultLog specs by including specific error messages for invalid records

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* Add AnalyticsDashboard and ApiUpdateLog policy regression specs. (#476)

Lock admin-only index/show/refresh gates so non-admin viewers cannot
access API update logs or refresh the analytics dashboard.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* restore allowed_clock_drift in saml attributes (#478)

Co-authored-by: rsmokeUM <rsmoke@umich.edu>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: cursor[bot] <206951365+cursor[bot]@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Margarita Barvinok <56089936+britaumich@users.noreply.github.com>
rsmoke added a commit that referenced this pull request Oct 21, 2026
…480)

* Update tailwindcss dependencies, modify Procfile for CSS watch command, and enhance support info modal with improved accessibility and styling.

* Add DepartmentApi and SentryMetrics regression specs (#462)

Cover department lookup success/failure shaping used by BuildingsApi room
updates, and ensure Sentry metric failures are swallowed so jobs/rake keep
running.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* Add stale-room deactivation regression specs for media preservation. (#463)

Cover the success path that hides rooms via visible=false while keeping
contacts, characteristics, and Active Storage panoramas/images, plus the
already-hidden fail-closed invariant in BuildingsApi and ClassroomApi.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* Add ApiUpdateDatabase PhaseResult/RunResult regression specs (#464)

Cover structured phase/run reporting and runner early-exit when auth
token acquisition fails, so nightly classroom sync failures stay
visible in ApiUpdateLog without continuing later phases.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* Bump rubyzip from 3.2.2 to 3.4.0 in the bundler group across 1 directory (#465)

Bumps the bundler group with 1 update in the / directory: [rubyzip](https://github.com/rubyzip/rubyzip).


Updates `rubyzip` from 3.2.2 to 3.4.0
- [Release notes](https://github.com/rubyzip/rubyzip/releases)
- [Changelog](https://github.com/rubyzip/rubyzip/blob/main/Changelog.md)
- [Commits](rubyzip/rubyzip@v3.2.2...v3.4.0)

---
updated-dependencies:
- dependency-name: rubyzip
  dependency-version: 3.4.0
  dependency-type: indirect
  dependency-group: bundler
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: rsmokeUM <rsmoke@umich.edu>

* Add TaskResultLog, TokenStore, and Okta display_name regression specs (#467)

* Add TaskResultLog, TokenStore, and Okta display_name regression specs

Cover nightly API update logging status/payload persistence, token
cache expiry and failure paths, and Okta SAML display_name mapping on
omniauth callback so auth/name regressions are caught early.

Co-authored-by: rsmoke <rsmoke@umich.edu>

* Improve error logging in ApiUpdateLog by including detailed error messages when save fails.

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* Add ApplicationHelper api_status/api_log_text regression specs (#470)

* Add ApplicationHelper api_status and api_log_text regression specs.

Cover the admin header banner signals for missing nightly runs, error vs success
recency, and blank log fallback so false-positive or missed API failure alerts
are less likely to regress.

Co-authored-by: rsmoke <rsmoke@umich.edu>

* Potential fix for pull request finding 'Test does not verify log recency filtering'

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add FloorPolicy authorization regression specs (#471)

* Add FloorPolicy authorization regression specs.

Lock viewer show vs admin mutation permissions and deny show when
membership groups are empty outside production.

Co-authored-by: rsmoke <rsmoke@umich.edu>

* Improve error logging in TaskResultLog specs by including specific error messages for invalid records

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* Add AnalyticsDashboard and ApiUpdateLog policy regression specs. (#476)

Lock admin-only index/show/refresh gates so non-admin viewers cannot
access API update logs or refresh the analytics dashboard.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: rsmoke <rsmoke@umich.edu>

* restore allowed_clock_drift in saml attributes (#478)

Co-authored-by: rsmokeUM <rsmoke@umich.edu>

* Count already-hidden rooms as deactivated so the API sync can finish.

A stale classroom that was already hidden aborted the rooms phase and skipped the rest of the update.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: cursor[bot] <206951365+cursor[bot]@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Margarita Barvinok <56089936+britaumich@users.noreply.github.com>
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.

3 participants