Skip to content

QA Settings Profile Test Cases — Proposal #550

@couimet

Description

@couimet

Background

PR #548 introduced settings fixture profiles for QA testing under
packages/rangelink-vscode-extension/qa/fixtures/settings/. These are
JSON files that set specific rangelink configuration values and are loaded
by integration tests via loadSettingsProfile().

Four profiles exist:

  • clipboard-never.json -- rangelink.clipboard.preserve = "never"
  • no-dirty-warning.json -- rangelink.warnOnDirtyBuffer = false
  • terminal-picker-low.json -- rangelink.terminalPicker.maxInline = 2
  • custom-delimiters.json -- rangelink.delimiterLine = "@l",
    rangelink.delimiterPosition = "@c"

The QA Gap Check bot (PR #548 review comment) flagged that these profiles
need corresponding QA YAML test cases.

Existing Coverage Snapshot

clipboard-never

  • Integration test clipboard-preservation-007 (NOT [assisted], fully
    automated) already calls loadSettingsProfile('clipboard-never', log).
  • YAML TC clipboard-preservation-006 tests never-mode R-L behavior
    (automated: true) but uses direct .update() in the test, not the
    fixture profile.
  • YAML TC clipboard-preservation-007 tests never-mode R-V behavior
    (automated: false).

no-dirty-warning

  • Integration test dirty-buffer-warning-004 tests
    warnOnDirtyBuffer=false via direct .update() (automated: true).
  • Integration test dirty-buffer-warning-008 (assisted) and
    dirty-buffer-warning-018 (assisted) also test warnOnDirtyBuffer=false
    via direct .update().
  • NO integration test currently uses loadSettingsProfile('no-dirty-warning').

terminal-picker-low

  • Integration test terminal-picker-011 (assisted) already calls
    loadSettingsProfile('terminal-picker-low', log).
  • YAML TCs terminal-picker-008 through terminal-picker-011 cover
    overflow and maxInline behavior.

custom-delimiters

  • No integration test uses loadSettingsProfile('custom-delimiters').
  • One unit-like test (clickable-file-paths-012 in
    filePathDetection.test.ts) verifies that the custom delimiter @l is
    not confused with a plain file path.
  • No QA YAML test cases exist for custom delimiter behavior at all.

Proposed Test Cases

All TCs would go in a new "Settings Profiles" section in the QA YAML file,
using the feature slug settings-profiles-*. Since no existing TCs use this
slug, numbering starts at -001.

1. settings-profiles-001 — clipboard-never profile loads and takes effect

Description: Load the clipboard-never fixture profile via
loadSettingsProfile() and verify the config value is set

Feature: Settings Profiles (cross-ref: Clipboard Preservation)

Preconditions:
- Extension installed
- Default settings active (clipboard.preserve undefined)

Steps:
1. Execute loadSettingsProfile('clipboard-never')
2. Read rangelink.clipboard.preserve via config API
3. Reset to default

Expected result: The value is "never". Verifies the fixture profile is
well-formed and the loadSettingsProfile helper works for
string-valued settings.

Automated: assisted
Reasoning: The integration test suite already exercises the
clipboard-never fixture in clipboard-preservation-007
(which is fully automated) and terminal-picker-011
(assisted). This TC is a safety net that explicitly
validates the profile file on its own terms, catching
corruption or schema regressions without depending on
the full clipboard send-receive flow.

2. settings-profiles-002 — no-dirty-warning profile loads and takes effect

Description: Load the no-dirty-warning fixture profile and verify the
config value is set

Feature: Settings Profiles (cross-ref: Dirty Buffer Warning)

Preconditions:
- Extension installed
- Default settings active (warnOnDirtyBuffer undefined)

Steps:
1. Execute loadSettingsProfile('no-dirty-warning')
2. Read rangelink.warnOnDirtyBuffer via config API
3. Reset to default

Expected result: The value is false. Verifies the fixture profile works
for boolean-valued settings.

Automated: assisted
Reasoning: Unlike clipboard-never and terminal-picker-low, no
integration test currently calls
loadSettingsProfile('no-dirty-warning'). The existing
dirty buffer tests set the value via direct
.update(). This TC ensures the fixture file itself
is valid.

3. settings-profiles-003 — terminal-picker-low profile loads and takes effect

Description: Load the terminal-picker-low fixture profile and verify
the config value is set

Feature: Settings Profiles (cross-ref: Terminal Picker)

Preconditions:
- Extension installed
- Default settings active (maxInline undefined, defaults to 5)

Steps:
1. Execute loadSettingsProfile('terminal-picker-low')
2. Read rangelink.terminalPicker.maxInline via config API
3. Reset to default

Expected result: The value is 2. Verifies the fixture profile works for
integer-valued settings.

Automated: assisted
Reasoning: Already exercised indirectly by terminal-picker-011.
This TC makes the fixture validation explicit and
documents it in the QA YAML.

4. settings-profiles-004 — custom-delimiters profile loads and takes effect

Description: Load the custom-delimiters fixture profile and verify
both delimiter settings are applied

Feature: Settings Profiles (cross-ref: Delimiters)

Preconditions:
- Extension installed
- Default delimiters active (line='L', position='C')

Steps:
1. Execute loadSettingsProfile('custom-delimiters')
2. Read rangelink.delimiterLine via config API
3. Read rangelink.delimiterPosition via config API
4. Reset to default

Expected result: delimiterLine = "@l", delimiterPosition = "@c"

Automated: assisted
Reasoning: No existing test loads this profile. The fixture
contains two interrelated settings, so this TC catches
partial-load bugs where one setting is applied but the
other is not.

5. settings-profiles-005 — Generate RangeLink using custom delimiters

Description: With custom-delimiters profile active, generate a link
for a selected file range and verify the output uses @l
and @c instead of default L and C

Feature: Settings Profiles (cross-ref: Delimiters)

Preconditions:
- custom-delimiters profile loaded
- Terminal bound as destination
- File with 5+ lines open, character-level selection made

Steps:
1. Load custom-delimiters profile
2. Select e.g. lines 3-4 in the file
3. Press Cmd+R Cmd+L
4. Observe the link sent to the terminal

Expected result: The generated link uses custom delimiters, e.g.
src/file.ts#@l3-@l4 (for line) or
src/file.ts#@l3@c5-@L4@c10 (with columns). The
default L and C do NOT appear.

Automated: assisted
Reasoning: This is the primary behavioral TC for the
custom-delimiters profile. It requires human
verification of the output format in the terminal
buffer (or could be automated via a log-based
assertion in an [assisted] integration test).

6. settings-profiles-006 — Navigate RangeLink with custom delimiters via R-G

Description: With custom-delimiters profile active, use R-G to
navigate to a RangeLink formatted with @l/@c delimiters

Feature: Settings Profiles (cross-ref: Delimiters, R-G Go to Link)

Preconditions:
- custom-delimiters profile loaded
- A file with content accessible (e.g., src/file.ts)

Steps:
1. Load custom-delimiters profile
2. Press Cmd+R Cmd+G
3. Type or paste: src/file.ts#@l3-@l5
4. Press Enter
5. Observe the editor

Expected result: VS Code navigates to src/file.ts and selects lines
3-5. The R-G parser correctly interprets @l as the
line delimiter.

Automated: false
Reasoning: Requires observing the editor tab switch and selection.
The navigation path with custom delimiters involves the
full R-G input flow, which is currently only exercised
manually.

7. settings-profiles-007 — Load default profile resets settings to baseline

Description: After loading a custom profile, load the default profile
and verify settings revert to their default values

Feature: Settings Profiles

Preconditions:
- Extension installed
- clipboard-never profile loaded (clipboard.preserve = "never")

Steps:
1. Verify clipboard.preserve = "never" (from previous profile)
2. Load the default settings profile
3. Read clipboard.preserve via config API

Expected result: clipboard.preserve is undefined (default). Verifies
that profiles can be overridden and reset cleanly.

Automated: assisted
Reasoning: Ensures the fixture mechanism properly overwrites
previous settings. Mitigates risk of stale profile
state leaking between test runs.

Summary Table

TC ID Profile Automated New infra needed
settings-profiles-001 clipboard-never assisted No
settings-profiles-002 no-dirty-warning assisted No
settings-profiles-003 terminal-picker-low assisted No
settings-profiles-004 custom-delimiters assisted No
settings-profiles-005 custom-delimiters assisted Yes (new test)
settings-profiles-006 custom-delimiters false No
settings-profiles-007 (cross-profile) assisted No (uses default profile)

Implementation Notes

a) Profile-loading TCs (001-004) follow the same pattern and could share
a single [assisted] integration test that iterates over all four
fixture files, reads each back, and asserts the value.

b) TCs 005-006 are the only ones that require new integration test code.
TC 005 could reuse the clipboard-preservation harness pattern (bind a
capturing terminal, execute R-L, dump captured buffer) but would need
a new test in a new suite file or in a new section of an existing
suite.

c) TC 007 requires a default.json fixture file. If one does not yet
exist in qa/fixtures/settings/, it needs to be created. Alternatively,
the test can use resetRangelinkSettings() from settingsHelpers.ts
instead of a default profile.

d) After the proposal is approved, the new TCs should be appended to the
latest QA YAML file following the copy-forward pattern (QA002, QA003,
QA004), not edited into the existing v1.1.0 file.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions