Skip to content

test: add Trezor emulator tests - #564

Merged
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests
May 29, 2026
Merged

test: add Trezor emulator tests#564
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests

Conversation

@ovitrif

@ovitrifovitrif commented May 21, 2026

Copy link
Copy Markdown
Collaborator

Description

Note

AI Dev Tests
This class of tests are intended to aid in development using AI agents, they should stay free of requirements to run them during QA gating. There shouldn't be any constraint wrt. time it takes to run these tests if ran together. Personally, I would be in favour of them covering all possible user-facing functionalities of the app in time.

This PR:

  1. Adds an AI-only Trezor emulator UI-test suite for the dev settings dashboard.
  2. Adds stable accessibility identifiers and a guarded TEST_TREZOR_EMU=1 dashboard launch path for device automation.
  3. Adds a manual ai-device-tests workflow that runs only on workflow_dispatch against bitkit-docker main.
  4. Documents the local command for running the emulator-backed suite.

The test workflow uses a dedicated BitkitAITests scheme so the AI/device lane builds the app and UI-test bundle without pulling unrelated unit-test targets into the run.

Context: current iOS releases do not expose WebUSB-style access for devices like Trezor in Safari/WebKit, and Trezor's current connected-device path on iOS is Bluetooth for models that support it. The emulator suite keeps using Bridge because that is the transport currently exposed by Trezor User Env; if User Env later exposes a BLE peripheral compatible with CoreBluetooth, this suite should move to that transport while preserving the same dashboard coverage.

Verification Status

The Trezor emulator UI suite has been run successfully locally against the bitkit-docker compose stack, using the compose-owned Trezor User Env service and local Regtest Electrum. The full BitkitUITests/TrezorBridgeDashboardUITests class passed with 3 passed, 0 failed, 0 skipped in TestResults/TrezorBridgeDashboardUITests-full1.xcresult.

After the run, Bridge enumeration returned the emulator with session: null, confirming the test teardown released the Bridge session.

Linked Issues/Tasks

Screenshot / Video

N/A

QA Notes

Manual Tests

  • 1.bitkit-docker main → docker compose up -d./scripts/trezor-emulator start → run the documented local xcodebuild test command: Trezor dashboard emulator scenarios pass on Regtest.
  • 2.regression: normal app launch without TEST_TREZOR_EMU=1: the app follows the existing splash/onboarding/wallet routing and does not deep-link into the Trezor dashboard.

Automated Checks

  • git diff --check
  • swiftformat on touched Swift files
  • Build-for-testing verifies the dedicated AI test scheme compiles the app and UI-test bundle:
    xcodebuild build-for-testing \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
  • Default skip behavior verifies the suite does not run without the emulator opt-in:
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: confirmed the suite skips by default when TEST_TREZOR_EMU=1 is absent.
  • Full emulator-backed dashboard suite against the bitkit-docker Trezor service and local Regtest Electrum:
    TREZOR_BRIDGE=true \
    TREZOR_BRIDGE_URL=http://127.0.0.1:21325 \
    TREZOR_ELECTRUM_URL=tcp://127.0.0.1:60001 \
    E2E=true \
    E2E_BACKEND=local \
    E2E_NETWORK=regtest \
    GEO=false \
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    -resultBundlePath TestResults/TrezorBridgeDashboardUITests-full1.xcresult \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD TEST_TREZOR_EMU' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: passed locally with 3 passed, 0 failed, 0 skipped.
  • curl -fsS -X POST http://127.0.0.1:21325/enumerate after the suite showed the emulator with session: null, confirming teardown released the Bridge session.
  • ai-device-tests.yml workflow visibility and behavior must be verified (after merge) from the Actions tab because new workflow files are only dispatchable once present on the default branch.

@ovitrifovitrif self-assigned this May 21, 2026
@ovitrifovitrif mentioned this pull request May 21, 2026
@ovitrif
ovitrif marked this pull request as ready for review May 21, 2026 23:54
@ovitrifovitrif mentioned this pull request May 21, 2026
3 tasks
chatgpt-codex-connector[bot]

This comment was marked as resolved.

@ovitrifovitrif added this to the 2.4.0 milestone May 22, 2026
coreyphillips
coreyphillips previously approved these changes May 28, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:514bbe9b88

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadBitkitUITests/TrezorBridgeDashboardUITests.swift
Base automatically changed from ovi/trezor-bridge-transport to masterMay 29, 2026 03:00
@ovitrif
ovitrif dismissed coreyphillips’s stale reviewMay 29, 2026 03:00

The base branch was changed.

@ovitrif
ovitrif merged commit 42c23d4 into masterMay 29, 2026
9 checks passed
@ovitrif
ovitrif deleted the ovi/trezor-ai-device-tests branch May 29, 2026 11:07
Sign up for freeto 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.

2 participants

@ovitrif@coreyphillips
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
test: add Trezor emulator tests by ovitrif · Pull Request #564 · synonymdev/bitkit-ios · GitHub
Skip to content

test: add Trezor emulator tests - #564

Merged
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests
May 29, 2026
Merged

test: add Trezor emulator tests#564
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests

Conversation

@ovitrif

@ovitrifovitrif commented May 21, 2026

Copy link
Copy Markdown
Collaborator

Description

Note

AI Dev Tests
This class of tests are intended to aid in development using AI agents, they should stay free of requirements to run them during QA gating. There shouldn't be any constraint wrt. time it takes to run these tests if ran together. Personally, I would be in favour of them covering all possible user-facing functionalities of the app in time.

This PR:

  1. Adds an AI-only Trezor emulator UI-test suite for the dev settings dashboard.
  2. Adds stable accessibility identifiers and a guarded TEST_TREZOR_EMU=1 dashboard launch path for device automation.
  3. Adds a manual ai-device-tests workflow that runs only on workflow_dispatch against bitkit-docker main.
  4. Documents the local command for running the emulator-backed suite.

The test workflow uses a dedicated BitkitAITests scheme so the AI/device lane builds the app and UI-test bundle without pulling unrelated unit-test targets into the run.

Context: current iOS releases do not expose WebUSB-style access for devices like Trezor in Safari/WebKit, and Trezor's current connected-device path on iOS is Bluetooth for models that support it. The emulator suite keeps using Bridge because that is the transport currently exposed by Trezor User Env; if User Env later exposes a BLE peripheral compatible with CoreBluetooth, this suite should move to that transport while preserving the same dashboard coverage.

Verification Status

The Trezor emulator UI suite has been run successfully locally against the bitkit-docker compose stack, using the compose-owned Trezor User Env service and local Regtest Electrum. The full BitkitUITests/TrezorBridgeDashboardUITests class passed with 3 passed, 0 failed, 0 skipped in TestResults/TrezorBridgeDashboardUITests-full1.xcresult.

After the run, Bridge enumeration returned the emulator with session: null, confirming the test teardown released the Bridge session.

Linked Issues/Tasks

Screenshot / Video

N/A

QA Notes

Manual Tests

  • 1.bitkit-docker main → docker compose up -d./scripts/trezor-emulator start → run the documented local xcodebuild test command: Trezor dashboard emulator scenarios pass on Regtest.
  • 2.regression: normal app launch without TEST_TREZOR_EMU=1: the app follows the existing splash/onboarding/wallet routing and does not deep-link into the Trezor dashboard.

Automated Checks

  • git diff --check
  • swiftformat on touched Swift files
  • Build-for-testing verifies the dedicated AI test scheme compiles the app and UI-test bundle:
    xcodebuild build-for-testing \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
  • Default skip behavior verifies the suite does not run without the emulator opt-in:
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: confirmed the suite skips by default when TEST_TREZOR_EMU=1 is absent.
  • Full emulator-backed dashboard suite against the bitkit-docker Trezor service and local Regtest Electrum:
    TREZOR_BRIDGE=true \
    TREZOR_BRIDGE_URL=http://127.0.0.1:21325 \
    TREZOR_ELECTRUM_URL=tcp://127.0.0.1:60001 \
    E2E=true \
    E2E_BACKEND=local \
    E2E_NETWORK=regtest \
    GEO=false \
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    -resultBundlePath TestResults/TrezorBridgeDashboardUITests-full1.xcresult \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD TEST_TREZOR_EMU' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: passed locally with 3 passed, 0 failed, 0 skipped.
  • curl -fsS -X POST http://127.0.0.1:21325/enumerate after the suite showed the emulator with session: null, confirming teardown released the Bridge session.
  • ai-device-tests.yml workflow visibility and behavior must be verified (after merge) from the Actions tab because new workflow files are only dispatchable once present on the default branch.

@ovitrifovitrif self-assigned this May 21, 2026
@ovitrifovitrif mentioned this pull request May 21, 2026
@ovitrif
ovitrif marked this pull request as ready for review May 21, 2026 23:54
@ovitrifovitrif mentioned this pull request May 21, 2026
3 tasks
chatgpt-codex-connector[bot]

This comment was marked as resolved.

@ovitrifovitrif added this to the 2.4.0 milestone May 22, 2026
coreyphillips
coreyphillips previously approved these changes May 28, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:514bbe9b88

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadBitkitUITests/TrezorBridgeDashboardUITests.swift
Base automatically changed from ovi/trezor-bridge-transport to masterMay 29, 2026 03:00
@ovitrif
ovitrif dismissed coreyphillips’s stale reviewMay 29, 2026 03:00

The base branch was changed.

@ovitrif
ovitrif merged commit 42c23d4 into masterMay 29, 2026
9 checks passed
@ovitrif
ovitrif deleted the ovi/trezor-ai-device-tests branch May 29, 2026 11:07
Sign up for freeto 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.

2 participants

@ovitrif@coreyphillips
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' test: add Trezor emulator tests by ovitrif · Pull Request #564 · synonymdev/bitkit-ios · GitHub
Skip to content

test: add Trezor emulator tests - #564

Merged
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests
May 29, 2026
Merged

test: add Trezor emulator tests#564
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests

Conversation

@ovitrif

@ovitrifovitrif commented May 21, 2026

Copy link
Copy Markdown
Collaborator

Description

Note

AI Dev Tests
This class of tests are intended to aid in development using AI agents, they should stay free of requirements to run them during QA gating. There shouldn't be any constraint wrt. time it takes to run these tests if ran together. Personally, I would be in favour of them covering all possible user-facing functionalities of the app in time.

This PR:

  1. Adds an AI-only Trezor emulator UI-test suite for the dev settings dashboard.
  2. Adds stable accessibility identifiers and a guarded TEST_TREZOR_EMU=1 dashboard launch path for device automation.
  3. Adds a manual ai-device-tests workflow that runs only on workflow_dispatch against bitkit-docker main.
  4. Documents the local command for running the emulator-backed suite.

The test workflow uses a dedicated BitkitAITests scheme so the AI/device lane builds the app and UI-test bundle without pulling unrelated unit-test targets into the run.

Context: current iOS releases do not expose WebUSB-style access for devices like Trezor in Safari/WebKit, and Trezor's current connected-device path on iOS is Bluetooth for models that support it. The emulator suite keeps using Bridge because that is the transport currently exposed by Trezor User Env; if User Env later exposes a BLE peripheral compatible with CoreBluetooth, this suite should move to that transport while preserving the same dashboard coverage.

Verification Status

The Trezor emulator UI suite has been run successfully locally against the bitkit-docker compose stack, using the compose-owned Trezor User Env service and local Regtest Electrum. The full BitkitUITests/TrezorBridgeDashboardUITests class passed with 3 passed, 0 failed, 0 skipped in TestResults/TrezorBridgeDashboardUITests-full1.xcresult.

After the run, Bridge enumeration returned the emulator with session: null, confirming the test teardown released the Bridge session.

Linked Issues/Tasks

Screenshot / Video

N/A

QA Notes

Manual Tests

  • 1.bitkit-docker main → docker compose up -d./scripts/trezor-emulator start → run the documented local xcodebuild test command: Trezor dashboard emulator scenarios pass on Regtest.
  • 2.regression: normal app launch without TEST_TREZOR_EMU=1: the app follows the existing splash/onboarding/wallet routing and does not deep-link into the Trezor dashboard.

Automated Checks

  • git diff --check
  • swiftformat on touched Swift files
  • Build-for-testing verifies the dedicated AI test scheme compiles the app and UI-test bundle:
    xcodebuild build-for-testing \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
  • Default skip behavior verifies the suite does not run without the emulator opt-in:
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: confirmed the suite skips by default when TEST_TREZOR_EMU=1 is absent.
  • Full emulator-backed dashboard suite against the bitkit-docker Trezor service and local Regtest Electrum:
    TREZOR_BRIDGE=true \
    TREZOR_BRIDGE_URL=http://127.0.0.1:21325 \
    TREZOR_ELECTRUM_URL=tcp://127.0.0.1:60001 \
    E2E=true \
    E2E_BACKEND=local \
    E2E_NETWORK=regtest \
    GEO=false \
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    -resultBundlePath TestResults/TrezorBridgeDashboardUITests-full1.xcresult \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD TEST_TREZOR_EMU' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: passed locally with 3 passed, 0 failed, 0 skipped.
  • curl -fsS -X POST http://127.0.0.1:21325/enumerate after the suite showed the emulator with session: null, confirming teardown released the Bridge session.
  • ai-device-tests.yml workflow visibility and behavior must be verified (after merge) from the Actions tab because new workflow files are only dispatchable once present on the default branch.

@ovitrifovitrif self-assigned this May 21, 2026
@ovitrifovitrif mentioned this pull request May 21, 2026
@ovitrif
ovitrif marked this pull request as ready for review May 21, 2026 23:54
@ovitrifovitrif mentioned this pull request May 21, 2026
3 tasks
chatgpt-codex-connector[bot]

This comment was marked as resolved.

@ovitrifovitrif added this to the 2.4.0 milestone May 22, 2026
coreyphillips
coreyphillips previously approved these changes May 28, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:514bbe9b88

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadBitkitUITests/TrezorBridgeDashboardUITests.swift
Base automatically changed from ovi/trezor-bridge-transport to masterMay 29, 2026 03:00
@ovitrif
ovitrif dismissed coreyphillips’s stale reviewMay 29, 2026 03:00

The base branch was changed.

@ovitrif
ovitrif merged commit 42c23d4 into masterMay 29, 2026
9 checks passed
@ovitrif
ovitrif deleted the ovi/trezor-ai-device-tests branch May 29, 2026 11:07
Sign up for freeto 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.

2 participants

@ovitrif@coreyphillips
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' test: add Trezor emulator tests by ovitrif · Pull Request #564 · synonymdev/bitkit-ios · GitHub
Skip to content

test: add Trezor emulator tests - #564

Merged
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests
May 29, 2026
Merged

test: add Trezor emulator tests#564
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests

Conversation

@ovitrif

@ovitrifovitrif commented May 21, 2026

Copy link
Copy Markdown
Collaborator

Description

Note

AI Dev Tests
This class of tests are intended to aid in development using AI agents, they should stay free of requirements to run them during QA gating. There shouldn't be any constraint wrt. time it takes to run these tests if ran together. Personally, I would be in favour of them covering all possible user-facing functionalities of the app in time.

This PR:

  1. Adds an AI-only Trezor emulator UI-test suite for the dev settings dashboard.
  2. Adds stable accessibility identifiers and a guarded TEST_TREZOR_EMU=1 dashboard launch path for device automation.
  3. Adds a manual ai-device-tests workflow that runs only on workflow_dispatch against bitkit-docker main.
  4. Documents the local command for running the emulator-backed suite.

The test workflow uses a dedicated BitkitAITests scheme so the AI/device lane builds the app and UI-test bundle without pulling unrelated unit-test targets into the run.

Context: current iOS releases do not expose WebUSB-style access for devices like Trezor in Safari/WebKit, and Trezor's current connected-device path on iOS is Bluetooth for models that support it. The emulator suite keeps using Bridge because that is the transport currently exposed by Trezor User Env; if User Env later exposes a BLE peripheral compatible with CoreBluetooth, this suite should move to that transport while preserving the same dashboard coverage.

Verification Status

The Trezor emulator UI suite has been run successfully locally against the bitkit-docker compose stack, using the compose-owned Trezor User Env service and local Regtest Electrum. The full BitkitUITests/TrezorBridgeDashboardUITests class passed with 3 passed, 0 failed, 0 skipped in TestResults/TrezorBridgeDashboardUITests-full1.xcresult.

After the run, Bridge enumeration returned the emulator with session: null, confirming the test teardown released the Bridge session.

Linked Issues/Tasks

Screenshot / Video

N/A

QA Notes

Manual Tests

  • 1.bitkit-docker main → docker compose up -d./scripts/trezor-emulator start → run the documented local xcodebuild test command: Trezor dashboard emulator scenarios pass on Regtest.
  • 2.regression: normal app launch without TEST_TREZOR_EMU=1: the app follows the existing splash/onboarding/wallet routing and does not deep-link into the Trezor dashboard.

Automated Checks

  • git diff --check
  • swiftformat on touched Swift files
  • Build-for-testing verifies the dedicated AI test scheme compiles the app and UI-test bundle:
    xcodebuild build-for-testing \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
  • Default skip behavior verifies the suite does not run without the emulator opt-in:
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: confirmed the suite skips by default when TEST_TREZOR_EMU=1 is absent.
  • Full emulator-backed dashboard suite against the bitkit-docker Trezor service and local Regtest Electrum:
    TREZOR_BRIDGE=true \
    TREZOR_BRIDGE_URL=http://127.0.0.1:21325 \
    TREZOR_ELECTRUM_URL=tcp://127.0.0.1:60001 \
    E2E=true \
    E2E_BACKEND=local \
    E2E_NETWORK=regtest \
    GEO=false \
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    -resultBundlePath TestResults/TrezorBridgeDashboardUITests-full1.xcresult \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD TEST_TREZOR_EMU' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: passed locally with 3 passed, 0 failed, 0 skipped.
  • curl -fsS -X POST http://127.0.0.1:21325/enumerate after the suite showed the emulator with session: null, confirming teardown released the Bridge session.
  • ai-device-tests.yml workflow visibility and behavior must be verified (after merge) from the Actions tab because new workflow files are only dispatchable once present on the default branch.

@ovitrifovitrif self-assigned this May 21, 2026
@ovitrifovitrif mentioned this pull request May 21, 2026
@ovitrif
ovitrif marked this pull request as ready for review May 21, 2026 23:54
@ovitrifovitrif mentioned this pull request May 21, 2026
3 tasks
chatgpt-codex-connector[bot]

This comment was marked as resolved.

@ovitrifovitrif added this to the 2.4.0 milestone May 22, 2026
coreyphillips
coreyphillips previously approved these changes May 28, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:514bbe9b88

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadBitkitUITests/TrezorBridgeDashboardUITests.swift
Base automatically changed from ovi/trezor-bridge-transport to masterMay 29, 2026 03:00
@ovitrif
ovitrif dismissed coreyphillips’s stale reviewMay 29, 2026 03:00

The base branch was changed.

@ovitrif
ovitrif merged commit 42c23d4 into masterMay 29, 2026
9 checks passed
@ovitrif
ovitrif deleted the ovi/trezor-ai-device-tests branch May 29, 2026 11:07
Sign up for freeto 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.

2 participants

@ovitrif@coreyphillips
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' test: add Trezor emulator tests by ovitrif · Pull Request #564 · synonymdev/bitkit-ios · GitHub
Skip to content

test: add Trezor emulator tests - #564

Merged
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests
May 29, 2026
Merged

test: add Trezor emulator tests#564
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests

Conversation

@ovitrif

@ovitrifovitrif commented May 21, 2026

Copy link
Copy Markdown
Collaborator

Description

Note

AI Dev Tests
This class of tests are intended to aid in development using AI agents, they should stay free of requirements to run them during QA gating. There shouldn't be any constraint wrt. time it takes to run these tests if ran together. Personally, I would be in favour of them covering all possible user-facing functionalities of the app in time.

This PR:

  1. Adds an AI-only Trezor emulator UI-test suite for the dev settings dashboard.
  2. Adds stable accessibility identifiers and a guarded TEST_TREZOR_EMU=1 dashboard launch path for device automation.
  3. Adds a manual ai-device-tests workflow that runs only on workflow_dispatch against bitkit-docker main.
  4. Documents the local command for running the emulator-backed suite.

The test workflow uses a dedicated BitkitAITests scheme so the AI/device lane builds the app and UI-test bundle without pulling unrelated unit-test targets into the run.

Context: current iOS releases do not expose WebUSB-style access for devices like Trezor in Safari/WebKit, and Trezor's current connected-device path on iOS is Bluetooth for models that support it. The emulator suite keeps using Bridge because that is the transport currently exposed by Trezor User Env; if User Env later exposes a BLE peripheral compatible with CoreBluetooth, this suite should move to that transport while preserving the same dashboard coverage.

Verification Status

The Trezor emulator UI suite has been run successfully locally against the bitkit-docker compose stack, using the compose-owned Trezor User Env service and local Regtest Electrum. The full BitkitUITests/TrezorBridgeDashboardUITests class passed with 3 passed, 0 failed, 0 skipped in TestResults/TrezorBridgeDashboardUITests-full1.xcresult.

After the run, Bridge enumeration returned the emulator with session: null, confirming the test teardown released the Bridge session.

Linked Issues/Tasks

Screenshot / Video

N/A

QA Notes

Manual Tests

  • 1.bitkit-docker main → docker compose up -d./scripts/trezor-emulator start → run the documented local xcodebuild test command: Trezor dashboard emulator scenarios pass on Regtest.
  • 2.regression: normal app launch without TEST_TREZOR_EMU=1: the app follows the existing splash/onboarding/wallet routing and does not deep-link into the Trezor dashboard.

Automated Checks

  • git diff --check
  • swiftformat on touched Swift files
  • Build-for-testing verifies the dedicated AI test scheme compiles the app and UI-test bundle:
    xcodebuild build-for-testing \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
  • Default skip behavior verifies the suite does not run without the emulator opt-in:
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: confirmed the suite skips by default when TEST_TREZOR_EMU=1 is absent.
  • Full emulator-backed dashboard suite against the bitkit-docker Trezor service and local Regtest Electrum:
    TREZOR_BRIDGE=true \
    TREZOR_BRIDGE_URL=http://127.0.0.1:21325 \
    TREZOR_ELECTRUM_URL=tcp://127.0.0.1:60001 \
    E2E=true \
    E2E_BACKEND=local \
    E2E_NETWORK=regtest \
    GEO=false \
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    -resultBundlePath TestResults/TrezorBridgeDashboardUITests-full1.xcresult \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD TEST_TREZOR_EMU' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: passed locally with 3 passed, 0 failed, 0 skipped.
  • curl -fsS -X POST http://127.0.0.1:21325/enumerate after the suite showed the emulator with session: null, confirming teardown released the Bridge session.
  • ai-device-tests.yml workflow visibility and behavior must be verified (after merge) from the Actions tab because new workflow files are only dispatchable once present on the default branch.

@ovitrifovitrif self-assigned this May 21, 2026
@ovitrifovitrif mentioned this pull request May 21, 2026
@ovitrif
ovitrif marked this pull request as ready for review May 21, 2026 23:54
@ovitrifovitrif mentioned this pull request May 21, 2026
3 tasks
chatgpt-codex-connector[bot]

This comment was marked as resolved.

@ovitrifovitrif added this to the 2.4.0 milestone May 22, 2026
coreyphillips
coreyphillips previously approved these changes May 28, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:514bbe9b88

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadBitkitUITests/TrezorBridgeDashboardUITests.swift
Base automatically changed from ovi/trezor-bridge-transport to masterMay 29, 2026 03:00
@ovitrif
ovitrif dismissed coreyphillips’s stale reviewMay 29, 2026 03:00

The base branch was changed.

@ovitrif
ovitrif merged commit 42c23d4 into masterMay 29, 2026
9 checks passed
@ovitrif
ovitrif deleted the ovi/trezor-ai-device-tests branch May 29, 2026 11:07
Sign up for freeto 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.

2 participants

@ovitrif@coreyphillips
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' test: add Trezor emulator tests by ovitrif · Pull Request #564 · synonymdev/bitkit-ios · GitHub
Skip to content

test: add Trezor emulator tests - #564

Merged
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests
May 29, 2026
Merged

test: add Trezor emulator tests#564
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests

Conversation

@ovitrif

@ovitrifovitrif commented May 21, 2026

Copy link
Copy Markdown
Collaborator

Description

Note

AI Dev Tests
This class of tests are intended to aid in development using AI agents, they should stay free of requirements to run them during QA gating. There shouldn't be any constraint wrt. time it takes to run these tests if ran together. Personally, I would be in favour of them covering all possible user-facing functionalities of the app in time.

This PR:

  1. Adds an AI-only Trezor emulator UI-test suite for the dev settings dashboard.
  2. Adds stable accessibility identifiers and a guarded TEST_TREZOR_EMU=1 dashboard launch path for device automation.
  3. Adds a manual ai-device-tests workflow that runs only on workflow_dispatch against bitkit-docker main.
  4. Documents the local command for running the emulator-backed suite.

The test workflow uses a dedicated BitkitAITests scheme so the AI/device lane builds the app and UI-test bundle without pulling unrelated unit-test targets into the run.

Context: current iOS releases do not expose WebUSB-style access for devices like Trezor in Safari/WebKit, and Trezor's current connected-device path on iOS is Bluetooth for models that support it. The emulator suite keeps using Bridge because that is the transport currently exposed by Trezor User Env; if User Env later exposes a BLE peripheral compatible with CoreBluetooth, this suite should move to that transport while preserving the same dashboard coverage.

Verification Status

The Trezor emulator UI suite has been run successfully locally against the bitkit-docker compose stack, using the compose-owned Trezor User Env service and local Regtest Electrum. The full BitkitUITests/TrezorBridgeDashboardUITests class passed with 3 passed, 0 failed, 0 skipped in TestResults/TrezorBridgeDashboardUITests-full1.xcresult.

After the run, Bridge enumeration returned the emulator with session: null, confirming the test teardown released the Bridge session.

Linked Issues/Tasks

Screenshot / Video

N/A

QA Notes

Manual Tests

  • 1.bitkit-docker main → docker compose up -d./scripts/trezor-emulator start → run the documented local xcodebuild test command: Trezor dashboard emulator scenarios pass on Regtest.
  • 2.regression: normal app launch without TEST_TREZOR_EMU=1: the app follows the existing splash/onboarding/wallet routing and does not deep-link into the Trezor dashboard.

Automated Checks

  • git diff --check
  • swiftformat on touched Swift files
  • Build-for-testing verifies the dedicated AI test scheme compiles the app and UI-test bundle:
    xcodebuild build-for-testing \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
  • Default skip behavior verifies the suite does not run without the emulator opt-in:
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: confirmed the suite skips by default when TEST_TREZOR_EMU=1 is absent.
  • Full emulator-backed dashboard suite against the bitkit-docker Trezor service and local Regtest Electrum:
    TREZOR_BRIDGE=true \
    TREZOR_BRIDGE_URL=http://127.0.0.1:21325 \
    TREZOR_ELECTRUM_URL=tcp://127.0.0.1:60001 \
    E2E=true \
    E2E_BACKEND=local \
    E2E_NETWORK=regtest \
    GEO=false \
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    -resultBundlePath TestResults/TrezorBridgeDashboardUITests-full1.xcresult \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD TEST_TREZOR_EMU' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: passed locally with 3 passed, 0 failed, 0 skipped.
  • curl -fsS -X POST http://127.0.0.1:21325/enumerate after the suite showed the emulator with session: null, confirming teardown released the Bridge session.
  • ai-device-tests.yml workflow visibility and behavior must be verified (after merge) from the Actions tab because new workflow files are only dispatchable once present on the default branch.

@ovitrifovitrif self-assigned this May 21, 2026
@ovitrifovitrif mentioned this pull request May 21, 2026
@ovitrif
ovitrif marked this pull request as ready for review May 21, 2026 23:54
@ovitrifovitrif mentioned this pull request May 21, 2026
3 tasks
chatgpt-codex-connector[bot]

This comment was marked as resolved.

@ovitrifovitrif added this to the 2.4.0 milestone May 22, 2026
coreyphillips
coreyphillips previously approved these changes May 28, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:514bbe9b88

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadBitkitUITests/TrezorBridgeDashboardUITests.swift
Base automatically changed from ovi/trezor-bridge-transport to masterMay 29, 2026 03:00
@ovitrif
ovitrif dismissed coreyphillips’s stale reviewMay 29, 2026 03:00

The base branch was changed.

@ovitrif
ovitrif merged commit 42c23d4 into masterMay 29, 2026
9 checks passed
@ovitrif
ovitrif deleted the ovi/trezor-ai-device-tests branch May 29, 2026 11:07
Sign up for freeto 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.

2 participants

@ovitrif@coreyphillips
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' test: add Trezor emulator tests by ovitrif · Pull Request #564 · synonymdev/bitkit-ios · GitHub
Skip to content

test: add Trezor emulator tests - #564

Merged
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests
May 29, 2026
Merged

test: add Trezor emulator tests#564
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests

Conversation

@ovitrif

@ovitrifovitrif commented May 21, 2026

Copy link
Copy Markdown
Collaborator

Description

Note

AI Dev Tests
This class of tests are intended to aid in development using AI agents, they should stay free of requirements to run them during QA gating. There shouldn't be any constraint wrt. time it takes to run these tests if ran together. Personally, I would be in favour of them covering all possible user-facing functionalities of the app in time.

This PR:

  1. Adds an AI-only Trezor emulator UI-test suite for the dev settings dashboard.
  2. Adds stable accessibility identifiers and a guarded TEST_TREZOR_EMU=1 dashboard launch path for device automation.
  3. Adds a manual ai-device-tests workflow that runs only on workflow_dispatch against bitkit-docker main.
  4. Documents the local command for running the emulator-backed suite.

The test workflow uses a dedicated BitkitAITests scheme so the AI/device lane builds the app and UI-test bundle without pulling unrelated unit-test targets into the run.

Context: current iOS releases do not expose WebUSB-style access for devices like Trezor in Safari/WebKit, and Trezor's current connected-device path on iOS is Bluetooth for models that support it. The emulator suite keeps using Bridge because that is the transport currently exposed by Trezor User Env; if User Env later exposes a BLE peripheral compatible with CoreBluetooth, this suite should move to that transport while preserving the same dashboard coverage.

Verification Status

The Trezor emulator UI suite has been run successfully locally against the bitkit-docker compose stack, using the compose-owned Trezor User Env service and local Regtest Electrum. The full BitkitUITests/TrezorBridgeDashboardUITests class passed with 3 passed, 0 failed, 0 skipped in TestResults/TrezorBridgeDashboardUITests-full1.xcresult.

After the run, Bridge enumeration returned the emulator with session: null, confirming the test teardown released the Bridge session.

Linked Issues/Tasks

Screenshot / Video

N/A

QA Notes

Manual Tests

  • 1.bitkit-docker main → docker compose up -d./scripts/trezor-emulator start → run the documented local xcodebuild test command: Trezor dashboard emulator scenarios pass on Regtest.
  • 2.regression: normal app launch without TEST_TREZOR_EMU=1: the app follows the existing splash/onboarding/wallet routing and does not deep-link into the Trezor dashboard.

Automated Checks

  • git diff --check
  • swiftformat on touched Swift files
  • Build-for-testing verifies the dedicated AI test scheme compiles the app and UI-test bundle:
    xcodebuild build-for-testing \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
  • Default skip behavior verifies the suite does not run without the emulator opt-in:
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: confirmed the suite skips by default when TEST_TREZOR_EMU=1 is absent.
  • Full emulator-backed dashboard suite against the bitkit-docker Trezor service and local Regtest Electrum:
    TREZOR_BRIDGE=true \
    TREZOR_BRIDGE_URL=http://127.0.0.1:21325 \
    TREZOR_ELECTRUM_URL=tcp://127.0.0.1:60001 \
    E2E=true \
    E2E_BACKEND=local \
    E2E_NETWORK=regtest \
    GEO=false \
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    -resultBundlePath TestResults/TrezorBridgeDashboardUITests-full1.xcresult \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD TEST_TREZOR_EMU' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: passed locally with 3 passed, 0 failed, 0 skipped.
  • curl -fsS -X POST http://127.0.0.1:21325/enumerate after the suite showed the emulator with session: null, confirming teardown released the Bridge session.
  • ai-device-tests.yml workflow visibility and behavior must be verified (after merge) from the Actions tab because new workflow files are only dispatchable once present on the default branch.

@ovitrifovitrif self-assigned this May 21, 2026
@ovitrifovitrif mentioned this pull request May 21, 2026
@ovitrif
ovitrif marked this pull request as ready for review May 21, 2026 23:54
@ovitrifovitrif mentioned this pull request May 21, 2026
3 tasks
chatgpt-codex-connector[bot]

This comment was marked as resolved.

@ovitrifovitrif added this to the 2.4.0 milestone May 22, 2026
coreyphillips
coreyphillips previously approved these changes May 28, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:514bbe9b88

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadBitkitUITests/TrezorBridgeDashboardUITests.swift
Base automatically changed from ovi/trezor-bridge-transport to masterMay 29, 2026 03:00
@ovitrif
ovitrif dismissed coreyphillips’s stale reviewMay 29, 2026 03:00

The base branch was changed.

@ovitrif
ovitrif merged commit 42c23d4 into masterMay 29, 2026
9 checks passed
@ovitrif
ovitrif deleted the ovi/trezor-ai-device-tests branch May 29, 2026 11:07
Sign up for freeto 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.

2 participants

@ovitrif@coreyphillips
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); test: add Trezor emulator tests by ovitrif · Pull Request #564 · synonymdev/bitkit-ios · GitHub
Skip to content

test: add Trezor emulator tests - #564

Merged
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests
May 29, 2026
Merged

test: add Trezor emulator tests#564
ovitrif merged 5 commits into
masterfrom
ovi/trezor-ai-device-tests

Conversation

@ovitrif

@ovitrifovitrif commented May 21, 2026

Copy link
Copy Markdown
Collaborator

Description

Note

AI Dev Tests
This class of tests are intended to aid in development using AI agents, they should stay free of requirements to run them during QA gating. There shouldn't be any constraint wrt. time it takes to run these tests if ran together. Personally, I would be in favour of them covering all possible user-facing functionalities of the app in time.

This PR:

  1. Adds an AI-only Trezor emulator UI-test suite for the dev settings dashboard.
  2. Adds stable accessibility identifiers and a guarded TEST_TREZOR_EMU=1 dashboard launch path for device automation.
  3. Adds a manual ai-device-tests workflow that runs only on workflow_dispatch against bitkit-docker main.
  4. Documents the local command for running the emulator-backed suite.

The test workflow uses a dedicated BitkitAITests scheme so the AI/device lane builds the app and UI-test bundle without pulling unrelated unit-test targets into the run.

Context: current iOS releases do not expose WebUSB-style access for devices like Trezor in Safari/WebKit, and Trezor's current connected-device path on iOS is Bluetooth for models that support it. The emulator suite keeps using Bridge because that is the transport currently exposed by Trezor User Env; if User Env later exposes a BLE peripheral compatible with CoreBluetooth, this suite should move to that transport while preserving the same dashboard coverage.

Verification Status

The Trezor emulator UI suite has been run successfully locally against the bitkit-docker compose stack, using the compose-owned Trezor User Env service and local Regtest Electrum. The full BitkitUITests/TrezorBridgeDashboardUITests class passed with 3 passed, 0 failed, 0 skipped in TestResults/TrezorBridgeDashboardUITests-full1.xcresult.

After the run, Bridge enumeration returned the emulator with session: null, confirming the test teardown released the Bridge session.

Linked Issues/Tasks

Screenshot / Video

N/A

QA Notes

Manual Tests

  • 1.bitkit-docker main → docker compose up -d./scripts/trezor-emulator start → run the documented local xcodebuild test command: Trezor dashboard emulator scenarios pass on Regtest.
  • 2.regression: normal app launch without TEST_TREZOR_EMU=1: the app follows the existing splash/onboarding/wallet routing and does not deep-link into the Trezor dashboard.

Automated Checks

  • git diff --check
  • swiftformat on touched Swift files
  • Build-for-testing verifies the dedicated AI test scheme compiles the app and UI-test bundle:
    xcodebuild build-for-testing \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
  • Default skip behavior verifies the suite does not run without the emulator opt-in:
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: confirmed the suite skips by default when TEST_TREZOR_EMU=1 is absent.
  • Full emulator-backed dashboard suite against the bitkit-docker Trezor service and local Regtest Electrum:
    TREZOR_BRIDGE=true \
    TREZOR_BRIDGE_URL=http://127.0.0.1:21325 \
    TREZOR_ELECTRUM_URL=tcp://127.0.0.1:60001 \
    E2E=true \
    E2E_BACKEND=local \
    E2E_NETWORK=regtest \
    GEO=false \
    xcodebuild test \
    -workspace Bitkit.xcodeproj/project.xcworkspace \
    -scheme BitkitAITests \
    -configuration Debug \
    -destination 'platform=iOS Simulator,id=90203221-2CC7-46AA-8370-759E31ED06FC' \
    -resultBundlePath TestResults/TrezorBridgeDashboardUITests-full1.xcresult \
    SWIFT_ACTIVE_COMPILATION_CONDITIONS='DEBUG E2E_BUILD TEST_TREZOR_EMU' \
    -only-testing:BitkitUITests/TrezorBridgeDashboardUITests \
    -parallel-testing-enabled NO
    Result: passed locally with 3 passed, 0 failed, 0 skipped.
  • curl -fsS -X POST http://127.0.0.1:21325/enumerate after the suite showed the emulator with session: null, confirming teardown released the Bridge session.
  • ai-device-tests.yml workflow visibility and behavior must be verified (after merge) from the Actions tab because new workflow files are only dispatchable once present on the default branch.

@ovitrifovitrif self-assigned this May 21, 2026
@ovitrifovitrif mentioned this pull request May 21, 2026
@ovitrif
ovitrif marked this pull request as ready for review May 21, 2026 23:54
@ovitrifovitrif mentioned this pull request May 21, 2026
3 tasks
chatgpt-codex-connector[bot]

This comment was marked as resolved.

@ovitrifovitrif added this to the 2.4.0 milestone May 22, 2026
coreyphillips
coreyphillips previously approved these changes May 28, 2026

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:514bbe9b88

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadBitkitUITests/TrezorBridgeDashboardUITests.swift
Base automatically changed from ovi/trezor-bridge-transport to masterMay 29, 2026 03:00
@ovitrif
ovitrif dismissed coreyphillips’s stale reviewMay 29, 2026 03:00

The base branch was changed.

@ovitrif
ovitrif merged commit 42c23d4 into masterMay 29, 2026
9 checks passed
@ovitrif
ovitrif deleted the ovi/trezor-ai-device-tests branch May 29, 2026 11:07
Sign up for freeto 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.

2 participants

@ovitrif@coreyphillips