Skip to content

test: expand and stabilize settings e2e coverage#2024

Merged
senamakel merged 8 commits into
tinyhumansai:mainfrom
senamakel:codex/e2e-settings-flow-coverage
May 17, 2026
Merged

test: expand and stabilize settings e2e coverage#2024
senamakel merged 8 commits into
tinyhumansai:mainfrom
senamakel:codex/e2e-settings-flow-coverage

Conversation

@senamakel
Copy link
Copy Markdown
Member

@senamakel senamakel commented May 17, 2026

Summary

  • Add Linux Docker E2E coverage for the major settings subpages: account, feature, and advanced settings flows.
  • Assert that settings interactions do more than change UI by verifying RPC effects, persisted config state, Redux state, and localStorage writes.
  • Stabilize the Linux E2E harness for fresh containers by hardening Appium bootstrap and vendored cargo-tauri installation.
  • Fix Composio routing mode row clicks so mode changes are reliably applied in the browser/E2E path.
  • Stabilize Rust tests that were failing in full-suite execution due to global workspace/memory state leakage and stack limits.

Problem

  • The settings area had shallow E2E coverage even though it contains many subpages with nested configuration flows and side effects outside the UI.
  • The Linux Docker harness was not consistently repeatable in fresh environments, which made E2E iteration and CI-style validation expensive.
  • Full Rust test runs exposed a few real isolation issues where tests were sharing process-global state and intermittently failing when run in the larger workspace suite.

Solution

  • Add targeted E2E specs for settings account/preferences, feature/preferences, and advanced/config routes using the existing WDIO infrastructure, mock server, and deep-link-safe navigation helpers.
  • Verify side effects directly through core RPC, Redux snapshots, and persisted local storage rather than stopping at visible UI assertions.
  • Update the local Linux harness scripts so Appium and vendored cargo-tauri install reliably inside Docker.
  • Fix the Composio routing panel so clicking a mode row explicitly sets the correct mode.
  • Scope test-only Composio memory access to the active workspace, serialize wallet tests on the shared env lock, relax an over-tight dispatch timing assertion, and raise the mock-backed Rust stack floor.

Submission Checklist

  • Tests added or updated (happy path + at least one failure / edge case) per Testing Strategy
  • Diff coverage ≥ 80% — changed lines (Vitest + cargo-llvm-cov merged via diff-cover) meet the gate enforced by .github/workflows/coverage.yml. Run pnpm test:coverage and pnpm test:rust locally; PRs below 80% on changed lines will not merge.
  • N/A: Coverage matrix updated — added/removed/renamed feature rows in docs/TEST-COVERAGE-MATRIX.md reflect this change. This PR adds tests and harness fixes but does not add or rename matrix feature rows.
  • N/A: All affected feature IDs from the matrix are listed in the PR description under ## Related. No matrix row changes or new feature IDs were introduced here.
  • No new external network dependencies introduced (mock backend used per Testing Strategy)
  • N/A: Manual smoke checklist updated if this touches release-cut surfaces (docs/RELEASE-MANUAL-SMOKE.md). This change is coverage/harness oriented and does not add a release-cut manual smoke path.
  • N/A: Linked issue closed via Closes #NNN in the ## Related section. No upstream tracking issue was linked for this work.

Impact

  • Improves desktop settings regression coverage in the Linux E2E lane.
  • Makes fresh-container E2E runs more reliable for local and CI-style execution.
  • Fixes a real settings interaction bug in the Composio routing panel.
  • Tightens Rust test isolation without changing production behavior.

Related

  • Closes: N/A
  • Follow-up PR(s)/TODOs:
    • Validate merged diff coverage output from CI and update the coverage matrix if reviewers want explicit feature-row additions for the new settings coverage.

AI Authored PR Metadata (required for Codex/Linear PRs)

Keep this section for AI-authored PRs. For human-only PRs, mark each field N/A.

Linear Issue

  • Key: N/A
  • URL: N/A

Commit & Branch

  • Branch: codex/e2e-settings-flow-coverage
  • Commit SHA: dd66a134

Validation Run

  • pnpm --filter openhuman-app format:check
  • pnpm typecheck
  • Focused tests:
    • pnpm debug unit
    • pnpm debug rust
    • Linux Docker E2E:
      • app/test/e2e/specs/settings-account-preferences.spec.ts
      • app/test/e2e/specs/settings-feature-preferences.spec.ts
      • app/test/e2e/specs/settings-advanced-config.spec.ts
  • Rust fmt/check (if changed): pre-push cargo fmt --check and cargo check gates passed
  • Tauri fmt/check (if changed): pre-push cargo fmt --manifest-path app/src-tauri/Cargo.toml --check and cargo check --manifest-path app/src-tauri/Cargo.toml gates passed

Validation Blocked

  • command: pnpm test:coverage
  • error: Not run in this shipping pass; I validated targeted/new flows plus full unit and Rust suites instead.
  • impact: Diff coverage is still enforced in CI and remains part of the babysit loop.

Behavior Changes

  • Intended behavior change: settings flows now have deep E2E verification, and Composio routing mode row clicks reliably apply the selected mode.
  • User-visible effect: settings interactions are better covered against regression, and Composio direct/backend mode switching is less brittle.

Parity Contract

  • Legacy behavior preserved: existing settings panels and core RPC contracts are unchanged except for the Composio click-path bug fix.
  • Guard/fallback/dispatch parity checks: Linux Docker E2E uses the existing mock server, deep-link-safe route navigation, and direct RPC verification of persisted settings.

Duplicate / Superseded PR Handling

  • Duplicate PR(s): N/A
  • Canonical PR: this PR
  • Resolution (closed/superseded/updated): updated

Summary by CodeRabbit

Release Notes

  • Bug Fixes

    • Improved routing mode selection in settings—option labels are now directly clickable for better interaction.
  • Tests & Infrastructure

    • Added comprehensive end-to-end test coverage for account preferences, advanced configuration, and feature settings.
    • Enhanced test environment setup and stability across platforms.

Review Change Stack

@senamakel senamakel requested a review from a team May 17, 2026 21:03
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 17, 2026

📝 Walkthrough

Walkthrough

The PR adds broad settings E2E coverage and element helpers, fixes Composio routing label interactions, adds test-isolation guards and timing adjustments, and updates build/test tooling (configurable cargo install cache, Appium resolution, Rust test stack sizing).

Changes

Settings UI & E2E Test Coverage

Layer / File(s) Summary
Composio routing mode label click handlers
app/src/components/settings/panels/ComposioPanel.tsx
Backend and direct routing mode labels now include explicit onClick handlers to set the corresponding mode state.
E2E element interaction helpers
app/test/e2e/helpers/element-helpers.ts
Adds clickSelector, clickLabelContaining, and setSelectValueByTestId to normalize clicks and select interactions across backends.
AI skills e2e update (LLM)
app/test/e2e/specs/settings-ai-skills.spec.ts
Refactors the test to validate the LLM panel/provider routing controls at /settings/llm.
Account preferences e2e tests
app/test/e2e/specs/settings-account-preferences.spec.ts
New suite covering account section rendering, recovery-phrase save flow and wallet status, privacy toggle persistence with RPC checks, connections, and billing navigation.
Advanced config e2e tests
app/test/e2e/specs/settings-advanced-config.spec.ts
New suite for developer options, notification routing persistence, composio trigger triage, composio routing/API-key flow, agent chat draft persistence, and related routes.
Feature preferences e2e tests
app/test/e2e/specs/settings-feature-preferences.spec.ts
New suite validating messaging channel persistence, tools prefs diffs, notification toggles across reloads, mascot color persistence, and custom voice persistence.
Privacy toggle test attribute
app/src/components/settings/panels/PrivacyPanel.tsx
Adds data-testid="privacy-analytics-toggle" to analytics toggle for tests.

Build System & Test Infrastructure

Layer / File(s) Summary
Cargo install cache & tauri CLI install root
.gitignore, scripts/ensure-tauri-cli.sh
Adds configurable INSTALL_ROOT (via OPENHUMAN_CARGO_INSTALL_ROOT, default .cache/cargo-install), prepends its bin to PATH, updates install detection and cargo install --root usage, and ignores the cache in git.
Appium binary resolution helper
e2e/docker-local-bootstrap.sh
Adds resolve_appium_bin() and ensures the Appium binary is resolved/usable after optional installation.
Rust test thread stack sizing
scripts/test-rust-with-mock.sh
Exports RUST_MIN_STACK with a default (16MB) and includes it in test-run logs.
Test isolation: cache, memory client, env locks
src/openhuman/composio/ops_test.rs, src/openhuman/composio/providers/types.rs, src/openhuman/wallet/execution.rs
Serializes integrations cache access in tests, returns test-local MemoryClient under #[cfg(test)], and acquires TEST_ENV_LOCK in wallet tests to avoid environment races.
Message dispatch timing assertion change
src/openhuman/channels/tests/runtime_dispatch.rs
Reframes parallel-vs-sequential timing assertions to be baseline-relative instead of fixed thresholds.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested labels

working

"I nibble tests and plant a seed,
New helpers sprout and labels lead,
Cache and Appium find their way,
Tests sleep soundly through the day,
A rabbit hops — the build’s OK!"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 65.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title "test: expand and stabilize settings e2e coverage" accurately summarizes the main changes: adding new E2E test specs for settings flows and hardening existing tests for stability.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


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

@coderabbitai coderabbitai Bot added the working A PR that is being worked on by the team. label May 17, 2026
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: 6

🧹 Nitpick comments (2)
app/test/e2e/specs/settings-advanced-config.spec.ts (1)

156-168: ⚡ Quick win

Remove fixed sleep before persistence assertion.

browser.pause(1000) is brittle under load variance. Prefer relying only on waitUntil with the persistence predicate.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/test/e2e/specs/settings-advanced-config.spec.ts` around lines 156 - 168,
Remove the brittle fixed sleep by deleting the browser.pause(1000) call and rely
solely on the existing browser.waitUntil predicate that reads local storage via
readLocalStorageJson; keep or adjust the timeout/interval passed to
browser.waitUntil if needed to account for slower environments so the predicate
checking payload?.modelOverride === 'gpt-4.1-mini' && payload?.temperature ===
'0.2' is the only synchronization mechanism.
app/test/e2e/specs/settings-feature-preferences.spec.ts (1)

35-40: ⚡ Quick win

Replace fixed reload delay with readiness-based wait.

The 3s hard pause can still race on slow CI and adds unnecessary latency on fast runs. Wait for a deterministic app-ready marker/hash condition instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/test/e2e/specs/settings-feature-preferences.spec.ts` around lines 35 -
40, In reloadAndReturnTo, replace the fixed browser.pause(3000) after
window.location.reload() with a deterministic readiness wait: after calling
window.location.reload(), wait for a concrete app-ready condition (e.g., a
specific DOM marker or URL/hash change) instead of sleeping, then call
navigateViaHash(route) and waitForText(markerText, 15_000) as before; update the
function (reloadAndReturnTo) to use the existing wait helper(s) or implement a
short waitFor existence of the readiness selector or for location.hash to change
rather than using browser.pause.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@app/test/e2e/specs/settings-account-preferences.spec.ts`:
- Around line 20-29: The test helper clickFirstSwitch is fragile because it
clicks switches[0]; change it to target the analytics toggle via a stable
selector (e.g., data-testid or aria-label) instead of index-based selection:
update the clickFirstSwitch function (or add a new clickSwitchBySelector) to
accept and query a selector string and click the matched element (use
'[data-testid="analytics-toggle"]' or the specific aria-label), and replace the
other call sites (including the occurrences referenced around the other switch
usage) to pass that stable selector so the test targets the correct toggle
deterministically.
- Around line 20-51: The two custom DOM helpers clickFirstSwitch and
clickBySelector directly use browser.execute and must be replaced to use the
shared E2E helpers from element-helpers.ts (the toggle/button click helpers) for
cross-platform stability; import the appropriate helper functions from
element-helpers.ts (e.g., the toggle click helper for switches and the
button/click helper for generic selectors), update clickFirstSwitch to call the
toggle helper for the first switch and update clickBySelector to call the shared
click helper (ensuring both await the helper and return a boolean), and remove
the direct browser.execute logic so specs use the centralized helpers.

In `@app/test/e2e/specs/settings-advanced-config.spec.ts`:
- Around line 13-30: The inline page-execution helpers clickSelector and
clickLabelContaining should be removed and replaced with the shared E2E
interaction helpers from element-helpers.ts; import and call the appropriate
exported functions (the project's cross-platform click primitives) instead of
using browser.execute in the test, update usages in
settings-advanced-config.spec.ts to call those helpers, and delete clickSelector
and clickLabelContaining so tests rely on the centralized element-helpers API
for resilient, consistent interactions.

In `@app/test/e2e/specs/settings-feature-preferences.spec.ts`:
- Around line 146-158: The test toggles both 'Toggle Do Not Disturb' and 'Toggle
Messages notifications' but only asserts the Messages state after reload; update
the spec to also assert the Do Not Disturb control persists by calling
switchState('Toggle Do Not Disturb') after
reloadAndReturnTo('/settings/notifications', 'Do Not Disturb') and checking it
equals the expected value (matching the toggle done earlier). Locate this logic
around the existing clickSelector and switchState calls in
settings-feature-preferences.spec.ts and add the additional post-reload expect
for 'Toggle Do Not Disturb'.
- Around line 13-33: The spec defines bespoke UI helpers setSelectValue and
clickSelector; remove these local functions and replace their usage with the
shared helpers from element-helpers.ts to keep cross-platform behavior
consistent — import the appropriate helpers (e.g., the shared setSelectValue and
click/clickElement helper names used in element-helpers.ts) at the top of
settings-feature-preferences.spec.ts, update all calls to use those helper
functions instead of setSelectValue/clickSelector, and delete the local function
declarations (setSelectValue and clickSelector) so the spec relies exclusively
on the centralized element-helpers API.

In `@src/openhuman/channels/tests/runtime_dispatch.rs`:
- Around line 89-90: The test's assertion "elapsed < Duration::from_millis(700)"
no longer guarantees parallelism because 700ms can be reached by near-sequential
runs; update the test in runtime_dispatch.rs (the runtime_dispatch test) to use
a stricter threshold or, better, measure a single-message baseline inside the
test (call the same dispatch path once to get baseline_elapsed) and then assert
elapsed < baseline_elapsed * 1.3 (or a similarly tight multiplier) to prove
concurrency; adjust the Duration comparison or implement the baseline
measurement around the same dispatch functions used in the test to make the
assertion robust.

---

Nitpick comments:
In `@app/test/e2e/specs/settings-advanced-config.spec.ts`:
- Around line 156-168: Remove the brittle fixed sleep by deleting the
browser.pause(1000) call and rely solely on the existing browser.waitUntil
predicate that reads local storage via readLocalStorageJson; keep or adjust the
timeout/interval passed to browser.waitUntil if needed to account for slower
environments so the predicate checking payload?.modelOverride === 'gpt-4.1-mini'
&& payload?.temperature === '0.2' is the only synchronization mechanism.

In `@app/test/e2e/specs/settings-feature-preferences.spec.ts`:
- Around line 35-40: In reloadAndReturnTo, replace the fixed browser.pause(3000)
after window.location.reload() with a deterministic readiness wait: after
calling window.location.reload(), wait for a concrete app-ready condition (e.g.,
a specific DOM marker or URL/hash change) instead of sleeping, then call
navigateViaHash(route) and waitForText(markerText, 15_000) as before; update the
function (reloadAndReturnTo) to use the existing wait helper(s) or implement a
short waitFor existence of the readiness selector or for location.hash to change
rather than using browser.pause.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e563314e-0a32-4c9d-9404-5dfffbf74449

📥 Commits

Reviewing files that changed from the base of the PR and between f9de38d and dd66a13.

📒 Files selected for processing (13)
  • .gitignore
  • app/src/components/settings/panels/ComposioPanel.tsx
  • app/test/e2e/specs/settings-account-preferences.spec.ts
  • app/test/e2e/specs/settings-advanced-config.spec.ts
  • app/test/e2e/specs/settings-ai-skills.spec.ts
  • app/test/e2e/specs/settings-feature-preferences.spec.ts
  • e2e/docker-local-bootstrap.sh
  • scripts/ensure-tauri-cli.sh
  • scripts/test-rust-with-mock.sh
  • src/openhuman/channels/tests/runtime_dispatch.rs
  • src/openhuman/composio/ops_test.rs
  • src/openhuman/composio/providers/types.rs
  • src/openhuman/wallet/execution.rs

Comment thread app/test/e2e/specs/settings-account-preferences.spec.ts Outdated
Comment thread app/test/e2e/specs/settings-account-preferences.spec.ts Outdated
Comment thread app/test/e2e/specs/settings-advanced-config.spec.ts Outdated
Comment thread app/test/e2e/specs/settings-feature-preferences.spec.ts Outdated
Comment thread app/test/e2e/specs/settings-feature-preferences.spec.ts
Comment thread src/openhuman/channels/tests/runtime_dispatch.rs Outdated
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: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@app/test/e2e/helpers/element-helpers.ts`:
- Around line 387-395: The helper setSelectValueByTestId can return true even
when assigning an invalid option value leaves the select unchanged; update the
browser.execute payload (the anonymous function) to verify the assignment
actually took effect by comparing el.value to the requested next value (and if
it doesn't match, try to find an option with value === next and set its selected
property before dispatching the change), then return true only when the select's
value equals next and false otherwise; reference the existing anonymous function
that queries `[data-testid="${id}"]` and the passed parameters ({ id, next }) to
locate where to add this verification and conditional dispatch logic.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 7bcf2aac-6081-46ea-ba43-d84f65439f31

📥 Commits

Reviewing files that changed from the base of the PR and between dd66a13 and a8e86f7.

📒 Files selected for processing (6)
  • app/src/components/settings/panels/PrivacyPanel.tsx
  • app/test/e2e/helpers/element-helpers.ts
  • app/test/e2e/specs/settings-account-preferences.spec.ts
  • app/test/e2e/specs/settings-advanced-config.spec.ts
  • app/test/e2e/specs/settings-feature-preferences.spec.ts
  • src/openhuman/channels/tests/runtime_dispatch.rs
✅ Files skipped from review due to trivial changes (1)
  • app/src/components/settings/panels/PrivacyPanel.tsx
🚧 Files skipped from review as they are similar to previous changes (3)
  • app/test/e2e/specs/settings-advanced-config.spec.ts
  • app/test/e2e/specs/settings-account-preferences.spec.ts
  • app/test/e2e/specs/settings-feature-preferences.spec.ts

Comment on lines +387 to +395
return await browser.execute(
({ id, next }) => {
const el = document.querySelector<HTMLSelectElement>(`[data-testid="${id}"]`);
if (!el) return false;
el.value = next;
el.dispatchEvent(new Event('change', { bubbles: true }));
return true;
},
{ id: testId, next: value }
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 | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

cat -n app/test/e2e/helpers/element-helpers.ts | sed -n '380,400p'

Repository: tinyhumansai/openhuman

Length of output: 870


🏁 Script executed:

rg -n "setSelectValueByTestId" app/test/e2e --type ts

Repository: tinyhumansai/openhuman

Length of output: 576


🏁 Script executed:

cat -n app/test/e2e/specs/settings-feature-preferences.spec.ts | sed -n '150,170p'

Repository: tinyhumansai/openhuman

Length of output: 1218


setSelectValueByTestId can return success when no value was actually applied.

The function always returns true after setting el.value = next and dispatching a change event, even if next is not a valid option value. HTML select elements don't throw errors when assigned invalid values; the assignment appears to succeed syntactically but the element's actual value may not change, creating false-positive E2E test results that mask broken test flows.

Suggested fix
   return await browser.execute(
     ({ id, next }) => {
-      const el = document.querySelector<HTMLSelectElement>(`[data-testid="${id}"]`);
+      const el = Array.from(
+        document.querySelectorAll<HTMLSelectElement>('select[data-testid]')
+      ).find((node) => node.getAttribute('data-testid') === id);
       if (!el) return false;
+      if (!Array.from(el.options).some((opt) => opt.value === next)) return false;
       el.value = next;
+      if (el.value !== next) return false;
       el.dispatchEvent(new Event('change', { bubbles: true }));
       return true;
     },
     { id: testId, next: value }
   );
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
return await browser.execute(
({ id, next }) => {
const el = document.querySelector<HTMLSelectElement>(`[data-testid="${id}"]`);
if (!el) return false;
el.value = next;
el.dispatchEvent(new Event('change', { bubbles: true }));
return true;
},
{ id: testId, next: value }
return await browser.execute(
({ id, next }) => {
const el = Array.from(
document.querySelectorAll<HTMLSelectElement>('select[data-testid]')
).find((node) => node.getAttribute('data-testid') === id);
if (!el) return false;
if (!Array.from(el.options).some((opt) => opt.value === next)) return false;
el.value = next;
if (el.value !== next) return false;
el.dispatchEvent(new Event('change', { bubbles: true }));
return true;
},
{ id: testId, next: value }
);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/test/e2e/helpers/element-helpers.ts` around lines 387 - 395, The helper
setSelectValueByTestId can return true even when assigning an invalid option
value leaves the select unchanged; update the browser.execute payload (the
anonymous function) to verify the assignment actually took effect by comparing
el.value to the requested next value (and if it doesn't match, try to find an
option with value === next and set its selected property before dispatching the
change), then return true only when the select's value equals next and false
otherwise; reference the existing anonymous function that queries
`[data-testid="${id}"]` and the passed parameters ({ id, next }) to locate where
to add this verification and conditional dispatch logic.

@senamakel
Copy link
Copy Markdown
Member Author

I really want to learn this knowledge! Can someone teach me? I'm willing to pay a reward....

learn what knowledge? :D now you can just claude or codex max the crap out of things

@senamakel senamakel merged commit b43bba7 into tinyhumansai:main May 17, 2026
25 checks passed
AusAgentSmith pushed a commit to AusAgentSmith/openhuman that referenced this pull request May 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

working A PR that is being worked on by the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant