From 48f8a1788ba8fcfad7d388fde6dc788d36a39a9b Mon Sep 17 00:00:00 2001 From: Christian Bager Bach Houmann Date: Sat, 14 Mar 2026 19:57:58 +0100 Subject: [PATCH 1/3] test(e2e): add file collision behavior coverage --- .gitignore | 5 +- README.md | 27 +- bun.lockb | Bin 491739 -> 528893 bytes ...sue-1139-file-exists-collision-behavior.md | 302 +++++++++++++++ package.json | 4 +- tests/e2e/file-exists-behavior.test.ts | 352 ++++++++++++++++++ vitest.e2e.config.mts | 11 + 7 files changed, 692 insertions(+), 9 deletions(-) create mode 100644 docs/specs/issue-1139-file-exists-collision-behavior.md create mode 100644 tests/e2e/file-exists-behavior.test.ts create mode 100644 vitest.e2e.config.mts diff --git a/.gitignore b/.gitignore index 8c23bb27..f48f378e 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,7 @@ styles.css data.json **/*.map -src/**/*.js \ No newline at end of file +src/**/*.js + +# e2e test failure artifacts +.obsidian-e2e-artifacts \ No newline at end of file diff --git a/README.md b/README.md index 86f7c39e..6f05a86c 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,23 @@ Throughout your choices, you can use the [QuickAdd format syntax](https://quicka QuickAdd can be installed through the community plugin browser in Obsidian, or through manual installation. See the [installation documentation](https://quickadd.obsidian.guide/docs/#installation) for more information. -## Getting Started - -For detailed instructions and examples on using QuickAdd, see the [QuickAdd documentation](https://quickadd.obsidian.guide/). - -## Support - -If you have any questions or encounter any problems while using QuickAdd, you can use the [community discussions](https://github.com/chhoumann/quickadd/discussions) for support. +## Getting Started + +For detailed instructions and examples on using QuickAdd, see the [QuickAdd documentation](https://quickadd.obsidian.guide/). + +## Development + +QuickAdd uses `bun` for local development tasks: + +- `bun run test` runs the unit test suite. +- `bun run build` type-checks and bundles the plugin. +- `bun run test:e2e` runs Obsidian-backed end-to-end tests. + +The E2E suite is local-only today. It depends on a locally installed Obsidian +app, the `obsidian` CLI being available on `PATH`, and the `dev` vault being +open and reachable. Failed E2E runs may write artifacts to +`.obsidian-e2e-artifacts/`. + +## Support + +If you have any questions or encounter any problems while using QuickAdd, you can use the [community discussions](https://github.com/chhoumann/quickadd/discussions) for support. diff --git a/bun.lockb b/bun.lockb index 426558c432eee7eb09300a8b324e183267434985..af74b972e045f2152154fa75b7dc6e141a91b1e8 100755 GIT binary patch delta 120038 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 JVK_YF{{!r_$uR%` delta 97557 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

2@L=EB56To2#AT8?tPN5SYt<$#w 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%0Dn9)t6*94(Hn2^V;?!m7ag@_RAL@5uTq+?=#=Z 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 YM@Otv|K@SjWv5zNf7H0T`?(GO1;L)^ApigX diff --git a/docs/specs/issue-1139-file-exists-collision-behavior.md b/docs/specs/issue-1139-file-exists-collision-behavior.md new file mode 100644 index 00000000..3fd88341 --- /dev/null +++ b/docs/specs/issue-1139-file-exists-collision-behavior.md @@ -0,0 +1,302 @@ +# Issue 1139: File Exists Collision Behavior + +## Summary + +QuickAdd currently has a file collision mode called `Increment the file +name`. That behavior works for sequence-style names such as `Note1.md`, but +it is not safe for identifier-style names such as IMDb IDs like +`tt0780504.md`. + +Issue `#1139` surfaced two separate problems: + +1. A runtime bug: QuickAdd silently increments even when the UI implies it + should prompt. +2. A product gap: QuickAdd only offers a trailing-number increment strategy, + which is not appropriate for IDs, dates, invoice numbers, and similar + filename patterns. + +This spec proposes a compatibility-safe path that fixes the bug, preserves +existing workflows, and adds an identifier-safe collision strategy. + +## Problem Statement + +The report is based on an IMDb ID: + +- `tt0780504` maps to `https://www.imdb.com/title/tt0780504/` + +For this kind of filename, `tt0780505` is not a duplicate of the same note. +It is a different identifier entirely. That means the current increment +behavior is semantically wrong for that workflow, even if it is working as +designed for other users. + +At the same time, many existing QuickAdd users likely rely on the current +trailing-digit increment behavior: + +- `Note.md` -> `Note1.md` +- `Note1.md` -> `Note2.md` + +Changing that behavior globally would be a breaking product decision. + +## Goals + +- Fix the prompt behavior so the UI and runtime match. +- Preserve existing increment-based workflows. +- Add an identifier-safe collision strategy. +- Improve wording so users can understand the difference between collision + modes. +- Avoid heuristics that try to infer whether trailing digits are a counter or + an identifier. + +## Non-Goals + +- Do not silently change the semantics of the current increment behavior for + existing users. +- Do not attempt to detect IDs automatically based on filename shape. +- Do not introduce a breaking migration for existing saved choices. + +## Product Decision + +Keep the current behavior for compatibility, but make the collision modes more +explicit and add a new safe option. + +## Proposed UX + +### Setting Group + +Current wording: + +- `Set default behavior if file already exists` + +Proposed wording: + +- `If the target file already exists` + +Current toggle meaning: + +- Apply selected behavior automatically when enabled. +- Prompt when disabled. + +Proposed toggle wording: + +- `Use selected behavior automatically` + +Behavior: + +- `On`: apply the selected file-exists behavior without prompting. +- `Off`: prompt the user each time a matching file already exists. + +Helper text: + +- `When off, QuickAdd will ask what to do each time a matching file already exists.` + +### Collision Options + +Keep the current options: + +- `Append to top` +- `Append to bottom` +- `Overwrite file` +- `Do nothing` + +Rename the current option: + +- From: `Increment the file name` +- To: `Increment trailing number` + +Add a new option: + +- `Append duplicate suffix` + +## Proposed Behavior + +### Increment Trailing Number + +This preserves the existing semantics. + +Examples: + +- `Note.md` -> `Note1.md` +- `Note1.md` -> `Note2.md` +- `Note009.md` -> `Note010.md` +- `tt0780504.md` -> `tt0780505.md` + +Important detail: + +- If a numeric suffix already exists, preserve width with zero padding. + +This means: + +- `009` -> `010` +- `0780504` -> `0780505` + +This is still the wrong collision mode for identifier-style names, but it is +the correct implementation of this mode. + +### Append Duplicate Suffix + +This is the identifier-safe collision mode. + +Examples: + +- `Note.md` -> `Note (1).md` +- `Note (1).md` -> `Note (2).md` +- `Note1.md` -> `Note1 (1).md` +- `tt0780504.md` -> `tt0780504 (1).md` +- `tt0780504 (1).md` -> `tt0780504 (2).md` + +This mode preserves the full original base name and adds a duplicate suffix +before the extension. + +## Why This Direction + +### No Heuristics + +QuickAdd cannot reliably infer the meaning of trailing digits. They may +represent: + +- a sequence number +- an external identifier +- a date +- an invoice number +- an episode number +- a serial number + +The product should let the user choose the collision policy explicitly rather +than guessing intent from the filename. + +### No Breaking Change + +Existing users who expect: + +- `Note1.md` -> `Note2.md` + +keep that behavior. + +Users with identifier-based workflows gain a new, correct option: + +- `Append duplicate suffix` + +### Better Mental Model + +The collision strategies become visibly different: + +- `Increment trailing number`: mutate ending digits +- `Append duplicate suffix`: preserve the full filename and add `(1)`, `(2)`, + etc. + +## Required Bug Fixes + +### 1. Prompt Semantics + +When `Use selected behavior automatically` is off, QuickAdd must not +pre-apply increment behavior before checking for an existing file. + +Expected behavior: + +- resolve the original target path +- check whether it exists +- if it exists and auto behavior is off, prompt the user +- only perform the selected action after the prompt result is known + +This addresses the current mismatch where the code silently increments even +though the setting implies the user should be asked. + +### 2. Zero-Padding Preservation + +When `Increment trailing number` is used and a numeric suffix already exists, +QuickAdd should preserve the suffix width after incrementing. + +Expected examples: + +- `Note009.md` -> `Note010.md` +- `tt0780504.md` -> `tt0780505.md` + +## Migration Strategy + +No breaking migration. + +### Stored Values + +Existing saved choices that use the current increment mode should continue to +work exactly as they do today. + +Implementation options: + +- keep the internal stored value as-is for backward compatibility and only + rename the display label in the UI, or +- add compatibility mapping from the legacy value to the new displayed label + +Either approach is acceptable as long as existing settings continue to load +without user action. + +### Toggle Behavior + +Keep the existing boolean setting that controls whether the chosen action is +applied automatically. Only fix the runtime behavior so `false` actually +results in prompting. + +## Implementation Guidance + +### Step 1: Fix Prompt Behavior + +Update the template file creation flow so `Increment trailing number` is not +applied eagerly when auto behavior is disabled. + +If auto behavior is: + +- `true`: apply the selected file-exists behavior immediately +- `false`: check for existence first, then prompt + +### Step 2: Fix Numeric Increment + +Update the increment logic to: + +- detect the trailing numeric run before the extension +- increment the numeric value +- preserve the original width with `padStart` + +### Step 3: Add Duplicate Suffix Mode + +Add a new file-exists resolver that: + +- preserves the full base name +- inserts ` (n)` before the extension +- increments only the duplicate suffix it previously added + +Examples: + +- `foo.md` -> `foo (1).md` +- `foo (1).md` -> `foo (2).md` + +### Step 4: UI Wording and Compatibility + +- rename the displayed increment mode +- add the new duplicate suffix mode +- preserve compatibility with saved settings + +## Testing + +Add or update tests for: + +- `tt0780504.md` increments to `tt0780505.md` +- `tt009.canvas` increments to `tt010.canvas` +- `tt009.base` increments to `tt010.base` +- when auto behavior is off and the file exists, QuickAdd prompts instead of + silently incrementing +- when auto behavior is on and increment mode is selected, QuickAdd still + increments automatically +- duplicate suffix mode: + - `Note.md` -> `Note (1).md` + - `Note (1).md` -> `Note (2).md` + - `tt0780504.md` -> `tt0780504 (1).md` + +## Rollout Recommendation + +Ship this as: + +1. A bug fix for prompt behavior. +2. A compatibility fix for zero-padding preservation. +3. A small feature addition for identifier-safe duplicate handling. + +This resolves the reporter's IMDb use case without regressing users who depend +on the existing trailing-number increment workflow. diff --git a/package.json b/package.json index b523c0b0..4c7ca899 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "build-with-lint": "tsc -noEmit -skipLibCheck && bun lint && node esbuild.config.mjs production", "version": "node version-bump.mjs && git add manifest.json versions.json", "semantic-release": "semantic-release", - "test": "vitest run --config vitest.config.mts --passWithNoTests" + "test": "vitest run --config vitest.config.mts --passWithNoTests", + "test:e2e": "vitest run --config vitest.e2e.config.mts" }, "keywords": [], "author": "Christian B. B. Houmann", @@ -34,6 +35,7 @@ "jsdom": "^26.1.0", "obsidian": "1.11.4", "obsidian-dataview": "^0.5.68", + "obsidian-e2e": "0.4.0", "semantic-release": "^24.2.6", "svelte": "^4.2.19", "svelte-check": "^3.8.6", diff --git a/tests/e2e/file-exists-behavior.test.ts b/tests/e2e/file-exists-behavior.test.ts new file mode 100644 index 00000000..191c96a6 --- /dev/null +++ b/tests/e2e/file-exists-behavior.test.ts @@ -0,0 +1,352 @@ +import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { + acquireVaultRunLock, + captureFailureArtifacts, + clearVaultRunLockMarker, + createObsidianClient, + createSandboxApi, +} from "obsidian-e2e"; +import type { ObsidianClient, SandboxApi, PluginHandle, VaultRunLock } from "obsidian-e2e"; + +// --------------------------------------------------------------------------- +// Constants & types +// --------------------------------------------------------------------------- + +const VAULT = "dev"; +const PLUGIN_ID = "quickadd"; +const TPL_CONTENT = "QA_TEMPLATE_CONTENT"; +const WAIT_OPTS = { timeoutMs: 10_000, intervalMs: 200 }; + +let obsidian: ObsidianClient; +let sandbox: SandboxApi; +let qa: PluginHandle; +let lock: VaultRunLock | undefined; + +type QuickAddData = { + choices: Record[]; + migrations: Record; +}; + +const behavior = { + increment: { kind: "apply", mode: "increment" }, + duplicateSuffix: { kind: "apply", mode: "duplicateSuffix" }, + appendBottom: { kind: "apply", mode: "appendBottom" }, + appendTop: { kind: "apply", mode: "appendTop" }, + overwrite: { kind: "apply", mode: "overwrite" }, + doNothing: { kind: "apply", mode: "doNothing" }, + prompt: { kind: "prompt" }, +} as const; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +function templateChoice( + id: string, + format: string, + fileExistsBehavior?: Record, +) { + return { + id, + name: id, + type: "Template", + command: false, + templatePath: sandbox.path("tpl.md"), + fileNameFormat: { enabled: true, format }, + folder: { + enabled: false, + folders: [], + chooseWhenCreatingNote: false, + createInSameFolderAsActiveFile: false, + chooseFromSubfolders: false, + }, + appendLink: false, + openFile: false, + fileOpening: { + location: "tab", + direction: "vertical", + mode: "source", + focus: false, + }, + ...(fileExistsBehavior && { fileExistsBehavior }), + }; +} + +/** Write a file into the sandbox and wait for Obsidian to index it. */ +async function seedFile(name: string, content = "EXISTING") { + await sandbox.write(name, content, { waitForContent: true, waitOptions: WAIT_OPTS }); +} + +/** Run a QuickAdd choice. */ +async function runChoice(name: string) { + await obsidian.exec("quickadd:run", { choice: name }); +} + +/** Run a QuickAdd choice and wait for a new file to appear. */ +async function runChoiceAndWaitFor(name: string, expectedFile: string) { + await runChoice(name); + await sandbox.waitForExists(expectedFile, WAIT_OPTS); +} + +/** Run a QuickAdd choice and poll until the file contains the expected content. */ +async function runChoiceAndWaitForContent(name: string, file: string, expected: string): Promise { + await runChoice(name); + return sandbox.waitForContent(file, (c) => c.includes(expected), WAIT_OPTS); +} + +/** Remove any existing test choices from plugin data. */ +function clearTestChoices(data: QuickAddData) { + data.choices = data.choices.filter( + (c) => !String(c.id ?? "").startsWith("__qa-test-"), + ); +} + +/** Find a choice by ID in plugin data. */ +function findChoice(data: QuickAddData, id: string) { + return data.choices.find((c) => c.id === id) as Record | undefined; +} + +// --------------------------------------------------------------------------- +// Lifecycle +// --------------------------------------------------------------------------- + +beforeAll(async () => { + obsidian = createObsidianClient({ + vault: VAULT, + defaultExecOptions: { allowNonZeroExit: true }, + }); + await obsidian.verify(); + + lock = await acquireVaultRunLock({ + vaultName: VAULT, + vaultPath: await obsidian.vaultPath(), + }); + await lock.publishMarker(obsidian); + + qa = obsidian.plugin(PLUGIN_ID); + sandbox = await createSandboxApi({ + obsidian, + sandboxRoot: "__obsidian_e2e__", + testName: "file-exists", + }); + + await seedFile("tpl.md", TPL_CONTENT); +}, 30_000); + +afterAll(async () => { + await qa.restoreData(); + await qa.reload(); + await sandbox.cleanup(); + await clearVaultRunLockMarker(obsidian).catch(() => {}); + await lock?.release(); +}, 15_000); + +beforeEach((ctx) => { + ctx.onTestFailed(async () => { + await captureFailureArtifacts( + { id: ctx.task.id, name: ctx.task.name }, + obsidian, + { plugin: qa, captureOnFailure: true }, + ); + }); +}); + +// --------------------------------------------------------------------------- +// Phase 1: Functional tests +// --------------------------------------------------------------------------- + +describe("functional: file collision behaviors", () => { + beforeAll(async () => { + const root = sandbox.root; + + await qa.data().patch((data) => { + clearTestChoices(data); + + data.choices.push( + templateChoice("__qa-test-t01-create", `${root}/qa-t01-new`, behavior.increment), + templateChoice("__qa-test-t02-incr", `${root}/qa-t02-incr`, behavior.increment), + templateChoice("__qa-test-t03-chain", `${root}/qa-t03-chain`, behavior.increment), + templateChoice("__qa-test-t04-zeros", `${root}/tt0780504`, behavior.increment), + templateChoice("__qa-test-t05-pad", `${root}/qa-t05-note009`, behavior.increment), + templateChoice("__qa-test-t06-dup", `${root}/qa-t06-dup`, behavior.duplicateSuffix), + templateChoice("__qa-test-t07-chain", `${root}/qa-t07-chain`, behavior.duplicateSuffix), + templateChoice("__qa-test-t08-digits", `${root}/qa-t08-note1`, behavior.duplicateSuffix), + templateChoice("__qa-test-t09-abot", `${root}/qa-t09-append-bot`, behavior.appendBottom), + templateChoice("__qa-test-t10-atop", `${root}/qa-t10-append-top`, behavior.appendTop), + templateChoice("__qa-test-t11-over", `${root}/qa-t11-overwrite`, behavior.overwrite), + templateChoice("__qa-test-t12-noop", `${root}/qa-t12-nothing`, behavior.doNothing), + templateChoice("__qa-test-t13-alldigit", `${root}/0001`, behavior.increment), + templateChoice("__qa-test-t14-nodigit", `${root}/qa-t14-hello`, behavior.increment), + templateChoice("__qa-test-t15-dupid", `${root}/tt0780504`, behavior.duplicateSuffix), + ); + }); + + await qa.reload({ waitUntilReady: true }); + }, 15_000); + + it("T01: no collision - creates file normally", async () => { + await runChoiceAndWaitForContent("__qa-test-t01-create", "qa-t01-new.md", TPL_CONTENT); + }); + + it("T02: increment basic (Note -> Note1)", async () => { + await seedFile("qa-t02-incr.md"); + await runChoiceAndWaitFor("__qa-test-t02-incr", "qa-t02-incr1.md"); + expect(await sandbox.exists("qa-t02-incr.md")).toBe(true); + }); + + it("T03: increment chained (skips existing Note1)", async () => { + await seedFile("qa-t03-chain.md"); + await seedFile("qa-t03-chain1.md"); + await runChoiceAndWaitFor("__qa-test-t03-chain", "qa-t03-chain2.md"); + }); + + it("T04: increment preserves leading zeros (tt0780504 -> tt0780505)", async () => { + await seedFile("tt0780504.md"); + await runChoiceAndWaitFor("__qa-test-t04-zeros", "tt0780505.md"); + expect(await sandbox.exists("tt780505.md")).toBe(false); + }); + + it("T05: increment zero-padded (note009 -> note010)", async () => { + await seedFile("qa-t05-note009.md"); + await runChoiceAndWaitFor("__qa-test-t05-pad", "qa-t05-note010.md"); + expect(await sandbox.exists("qa-t05-note10.md")).toBe(false); + }); + + it("T06: duplicate suffix basic (Note -> Note (1))", async () => { + await seedFile("qa-t06-dup.md"); + await runChoiceAndWaitFor("__qa-test-t06-dup", "qa-t06-dup (1).md"); + expect(await sandbox.exists("qa-t06-dup.md")).toBe(true); + }); + + it("T07: duplicate suffix chained (skips existing (1))", async () => { + await seedFile("qa-t07-chain.md"); + await seedFile("qa-t07-chain (1).md"); + await runChoiceAndWaitFor("__qa-test-t07-chain", "qa-t07-chain (2).md"); + }); + + it("T08: duplicate suffix preserves trailing digits (note1 -> note1 (1))", async () => { + await seedFile("qa-t08-note1.md"); + await runChoiceAndWaitFor("__qa-test-t08-digits", "qa-t08-note1 (1).md"); + expect(await sandbox.exists("qa-t08-note2.md")).toBe(false); + }); + + it("T09: append to bottom", async () => { + await seedFile("qa-t09-append-bot.md", "ORIGINAL_BOTTOM_TEST"); + const content = await runChoiceAndWaitForContent("__qa-test-t09-abot", "qa-t09-append-bot.md", TPL_CONTENT); + expect(content).toContain("ORIGINAL_BOTTOM_TEST"); + }); + + it("T10: append to top", async () => { + await seedFile("qa-t10-append-top.md", "ORIGINAL_TOP_TEST"); + const content = await runChoiceAndWaitForContent("__qa-test-t10-atop", "qa-t10-append-top.md", TPL_CONTENT); + expect(content).toContain("ORIGINAL_TOP_TEST"); + }); + + it("T11: overwrite", async () => { + await seedFile("qa-t11-overwrite.md", "OLD_CONTENT_TO_REPLACE"); + const content = await runChoiceAndWaitForContent("__qa-test-t11-over", "qa-t11-overwrite.md", TPL_CONTENT); + expect(content).not.toContain("OLD_CONTENT_TO_REPLACE"); + }); + + it("T12: do nothing - keeps file unchanged", async () => { + await seedFile("qa-t12-nothing.md", "UNTOUCHED_CONTENT"); + await runChoice("__qa-test-t12-noop"); + await obsidian.sleep(600); + const content = await sandbox.read("qa-t12-nothing.md"); + expect(content).toContain("UNTOUCHED_CONTENT"); + expect(content).not.toContain(TPL_CONTENT); + }); + + it("T13: increment all-digit filename (0001 -> 0002)", async () => { + await seedFile("0001.md"); + await runChoiceAndWaitFor("__qa-test-t13-alldigit", "0002.md"); + expect(await sandbox.exists("2.md")).toBe(false); + }); + + it("T14: increment no trailing digits (hello -> hello1)", async () => { + await seedFile("qa-t14-hello.md"); + await runChoiceAndWaitFor("__qa-test-t14-nodigit", "qa-t14-hello1.md"); + }); + + it("T15: duplicate suffix on identifier-like name (tt0780504 -> tt0780504 (1))", async () => { + await seedFile("tt0780504.md"); + await runChoiceAndWaitFor("__qa-test-t15-dupid", "tt0780504 (1).md"); + expect(await sandbox.exists("tt0780505 (1).md")).toBe(false); + }); +}); + +// --------------------------------------------------------------------------- +// Phase 2: Migration tests +// --------------------------------------------------------------------------- + +describe("migration: consolidateFileExistsBehavior", () => { + beforeAll(async () => { + const root = sandbox.root; + const migrationChoice = (id: string) => templateChoice(id, `${root}/migration-test`); + + await qa.data().patch((data) => { + clearTestChoices(data); + + data.choices.push( + { ...migrationChoice("__qa-test-m1-incr-flag"), incrementFileName: true }, + { ...migrationChoice("__qa-test-m2-set-mode"), setFileExistsBehavior: true, fileExistsMode: "Overwrite the file" }, + { ...migrationChoice("__qa-test-m3-prompt"), setFileExistsBehavior: false, fileExistsMode: "Append to the bottom of the file" }, + { ...migrationChoice("__qa-test-m4-dup"), setFileExistsBehavior: true, fileExistsMode: "Append duplicate suffix" }, + { ...migrationChoice("__qa-test-m5-both"), incrementFileName: true, setFileExistsBehavior: true, fileExistsMode: "Append duplicate suffix" }, + { ...migrationChoice("__qa-test-m6-already"), fileExistsBehavior: { kind: "apply", mode: "overwrite" } }, + ); + + data.migrations.consolidateFileExistsBehavior = false; + data.migrations.incrementFileNameSettingMoveToDefaultBehavior = true; + }); + + await qa.reload(); + await qa.waitForData( + (data) => data.migrations.consolidateFileExistsBehavior === true, + { timeoutMs: 10_000, intervalMs: 300 }, + ); + }, 15_000); + + async function readChoice(id: string) { + const data = await qa.data().read(); + return findChoice(data, id); + } + + it("M1: legacy incrementFileName -> apply/increment", async () => { + const choice = await readChoice("__qa-test-m1-incr-flag"); + expect(choice?.fileExistsBehavior).toEqual(behavior.increment); + expect(choice).not.toHaveProperty("incrementFileName"); + }); + + it("M2: legacy setFileExistsBehavior + overwrite -> apply/overwrite", async () => { + const choice = await readChoice("__qa-test-m2-set-mode"); + expect(choice?.fileExistsBehavior).toEqual(behavior.overwrite); + expect(choice).not.toHaveProperty("setFileExistsBehavior"); + expect(choice).not.toHaveProperty("fileExistsMode"); + }); + + it("M3: legacy setFileExistsBehavior=false -> prompt", async () => { + const choice = await readChoice("__qa-test-m3-prompt"); + expect(choice?.fileExistsBehavior).toEqual(behavior.prompt); + }); + + it("M4: legacy duplicate suffix mode -> apply/duplicateSuffix", async () => { + const choice = await readChoice("__qa-test-m4-dup"); + expect(choice?.fileExistsBehavior).toEqual(behavior.duplicateSuffix); + }); + + it("M5: explicit legacy mode wins when both legacy settings are present", async () => { + const choice = await readChoice("__qa-test-m5-both"); + expect(choice?.fileExistsBehavior).toEqual(behavior.duplicateSuffix); + }); + + it("M6: already-migrated choice preserved", async () => { + const choice = await readChoice("__qa-test-m6-already"); + expect(choice?.fileExistsBehavior).toEqual(behavior.overwrite); + }); + + it("migration flag set to true", async () => { + const data = await qa.data().read(); + expect(data.migrations.consolidateFileExistsBehavior).toBe(true); + }); +}); diff --git a/vitest.e2e.config.mts b/vitest.e2e.config.mts new file mode 100644 index 00000000..8718a9d4 --- /dev/null +++ b/vitest.e2e.config.mts @@ -0,0 +1,11 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + include: ["tests/e2e/**/*.test.ts"], + testTimeout: 60_000, + hookTimeout: 30_000, + fileParallelism: false, + maxWorkers: 1, + }, +}); From 95aff614da376e94cf56a5e30ee3734327c2013f Mon Sep 17 00:00:00 2001 From: Christian Bager Bach Houmann Date: Sat, 14 Mar 2026 19:58:51 +0100 Subject: [PATCH 2/3] chore: drop file collision spec from pr --- ...sue-1139-file-exists-collision-behavior.md | 302 ------------------ 1 file changed, 302 deletions(-) delete mode 100644 docs/specs/issue-1139-file-exists-collision-behavior.md diff --git a/docs/specs/issue-1139-file-exists-collision-behavior.md b/docs/specs/issue-1139-file-exists-collision-behavior.md deleted file mode 100644 index 3fd88341..00000000 --- a/docs/specs/issue-1139-file-exists-collision-behavior.md +++ /dev/null @@ -1,302 +0,0 @@ -# Issue 1139: File Exists Collision Behavior - -## Summary - -QuickAdd currently has a file collision mode called `Increment the file -name`. That behavior works for sequence-style names such as `Note1.md`, but -it is not safe for identifier-style names such as IMDb IDs like -`tt0780504.md`. - -Issue `#1139` surfaced two separate problems: - -1. A runtime bug: QuickAdd silently increments even when the UI implies it - should prompt. -2. A product gap: QuickAdd only offers a trailing-number increment strategy, - which is not appropriate for IDs, dates, invoice numbers, and similar - filename patterns. - -This spec proposes a compatibility-safe path that fixes the bug, preserves -existing workflows, and adds an identifier-safe collision strategy. - -## Problem Statement - -The report is based on an IMDb ID: - -- `tt0780504` maps to `https://www.imdb.com/title/tt0780504/` - -For this kind of filename, `tt0780505` is not a duplicate of the same note. -It is a different identifier entirely. That means the current increment -behavior is semantically wrong for that workflow, even if it is working as -designed for other users. - -At the same time, many existing QuickAdd users likely rely on the current -trailing-digit increment behavior: - -- `Note.md` -> `Note1.md` -- `Note1.md` -> `Note2.md` - -Changing that behavior globally would be a breaking product decision. - -## Goals - -- Fix the prompt behavior so the UI and runtime match. -- Preserve existing increment-based workflows. -- Add an identifier-safe collision strategy. -- Improve wording so users can understand the difference between collision - modes. -- Avoid heuristics that try to infer whether trailing digits are a counter or - an identifier. - -## Non-Goals - -- Do not silently change the semantics of the current increment behavior for - existing users. -- Do not attempt to detect IDs automatically based on filename shape. -- Do not introduce a breaking migration for existing saved choices. - -## Product Decision - -Keep the current behavior for compatibility, but make the collision modes more -explicit and add a new safe option. - -## Proposed UX - -### Setting Group - -Current wording: - -- `Set default behavior if file already exists` - -Proposed wording: - -- `If the target file already exists` - -Current toggle meaning: - -- Apply selected behavior automatically when enabled. -- Prompt when disabled. - -Proposed toggle wording: - -- `Use selected behavior automatically` - -Behavior: - -- `On`: apply the selected file-exists behavior without prompting. -- `Off`: prompt the user each time a matching file already exists. - -Helper text: - -- `When off, QuickAdd will ask what to do each time a matching file already exists.` - -### Collision Options - -Keep the current options: - -- `Append to top` -- `Append to bottom` -- `Overwrite file` -- `Do nothing` - -Rename the current option: - -- From: `Increment the file name` -- To: `Increment trailing number` - -Add a new option: - -- `Append duplicate suffix` - -## Proposed Behavior - -### Increment Trailing Number - -This preserves the existing semantics. - -Examples: - -- `Note.md` -> `Note1.md` -- `Note1.md` -> `Note2.md` -- `Note009.md` -> `Note010.md` -- `tt0780504.md` -> `tt0780505.md` - -Important detail: - -- If a numeric suffix already exists, preserve width with zero padding. - -This means: - -- `009` -> `010` -- `0780504` -> `0780505` - -This is still the wrong collision mode for identifier-style names, but it is -the correct implementation of this mode. - -### Append Duplicate Suffix - -This is the identifier-safe collision mode. - -Examples: - -- `Note.md` -> `Note (1).md` -- `Note (1).md` -> `Note (2).md` -- `Note1.md` -> `Note1 (1).md` -- `tt0780504.md` -> `tt0780504 (1).md` -- `tt0780504 (1).md` -> `tt0780504 (2).md` - -This mode preserves the full original base name and adds a duplicate suffix -before the extension. - -## Why This Direction - -### No Heuristics - -QuickAdd cannot reliably infer the meaning of trailing digits. They may -represent: - -- a sequence number -- an external identifier -- a date -- an invoice number -- an episode number -- a serial number - -The product should let the user choose the collision policy explicitly rather -than guessing intent from the filename. - -### No Breaking Change - -Existing users who expect: - -- `Note1.md` -> `Note2.md` - -keep that behavior. - -Users with identifier-based workflows gain a new, correct option: - -- `Append duplicate suffix` - -### Better Mental Model - -The collision strategies become visibly different: - -- `Increment trailing number`: mutate ending digits -- `Append duplicate suffix`: preserve the full filename and add `(1)`, `(2)`, - etc. - -## Required Bug Fixes - -### 1. Prompt Semantics - -When `Use selected behavior automatically` is off, QuickAdd must not -pre-apply increment behavior before checking for an existing file. - -Expected behavior: - -- resolve the original target path -- check whether it exists -- if it exists and auto behavior is off, prompt the user -- only perform the selected action after the prompt result is known - -This addresses the current mismatch where the code silently increments even -though the setting implies the user should be asked. - -### 2. Zero-Padding Preservation - -When `Increment trailing number` is used and a numeric suffix already exists, -QuickAdd should preserve the suffix width after incrementing. - -Expected examples: - -- `Note009.md` -> `Note010.md` -- `tt0780504.md` -> `tt0780505.md` - -## Migration Strategy - -No breaking migration. - -### Stored Values - -Existing saved choices that use the current increment mode should continue to -work exactly as they do today. - -Implementation options: - -- keep the internal stored value as-is for backward compatibility and only - rename the display label in the UI, or -- add compatibility mapping from the legacy value to the new displayed label - -Either approach is acceptable as long as existing settings continue to load -without user action. - -### Toggle Behavior - -Keep the existing boolean setting that controls whether the chosen action is -applied automatically. Only fix the runtime behavior so `false` actually -results in prompting. - -## Implementation Guidance - -### Step 1: Fix Prompt Behavior - -Update the template file creation flow so `Increment trailing number` is not -applied eagerly when auto behavior is disabled. - -If auto behavior is: - -- `true`: apply the selected file-exists behavior immediately -- `false`: check for existence first, then prompt - -### Step 2: Fix Numeric Increment - -Update the increment logic to: - -- detect the trailing numeric run before the extension -- increment the numeric value -- preserve the original width with `padStart` - -### Step 3: Add Duplicate Suffix Mode - -Add a new file-exists resolver that: - -- preserves the full base name -- inserts ` (n)` before the extension -- increments only the duplicate suffix it previously added - -Examples: - -- `foo.md` -> `foo (1).md` -- `foo (1).md` -> `foo (2).md` - -### Step 4: UI Wording and Compatibility - -- rename the displayed increment mode -- add the new duplicate suffix mode -- preserve compatibility with saved settings - -## Testing - -Add or update tests for: - -- `tt0780504.md` increments to `tt0780505.md` -- `tt009.canvas` increments to `tt010.canvas` -- `tt009.base` increments to `tt010.base` -- when auto behavior is off and the file exists, QuickAdd prompts instead of - silently incrementing -- when auto behavior is on and increment mode is selected, QuickAdd still - increments automatically -- duplicate suffix mode: - - `Note.md` -> `Note (1).md` - - `Note (1).md` -> `Note (2).md` - - `tt0780504.md` -> `tt0780504 (1).md` - -## Rollout Recommendation - -Ship this as: - -1. A bug fix for prompt behavior. -2. A compatibility fix for zero-padding preservation. -3. A small feature addition for identifier-safe duplicate handling. - -This resolves the reporter's IMDb use case without regressing users who depend -on the existing trailing-number increment workflow. From e626b3bf3a92076b6b10c3220ba2a160dc430a0b Mon Sep 17 00:00:00 2001 From: Christian Bager Bach Houmann Date: Sat, 14 Mar 2026 20:03:34 +0100 Subject: [PATCH 3/3] codex: address PR review feedback (#1153) --- tests/e2e/file-exists-behavior.test.ts | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/tests/e2e/file-exists-behavior.test.ts b/tests/e2e/file-exists-behavior.test.ts index 191c96a6..f8480f4f 100644 --- a/tests/e2e/file-exists-behavior.test.ts +++ b/tests/e2e/file-exists-behavior.test.ts @@ -82,6 +82,19 @@ async function runChoice(name: string) { await obsidian.exec("quickadd:run", { choice: name }); } +function expectOrderedSubstrings( + content: string, + first: string, + second: string, +) { + const firstIndex = content.indexOf(first); + const secondIndex = content.indexOf(second); + + expect(firstIndex).toBeGreaterThanOrEqual(0); + expect(secondIndex).toBeGreaterThanOrEqual(0); + expect(firstIndex).toBeLessThan(secondIndex); +} + /** Run a QuickAdd choice and wait for a new file to appear. */ async function runChoiceAndWaitFor(name: string, expectedFile: string) { await runChoice(name); @@ -111,10 +124,7 @@ function findChoice(data: QuickAddData, id: string) { // --------------------------------------------------------------------------- beforeAll(async () => { - obsidian = createObsidianClient({ - vault: VAULT, - defaultExecOptions: { allowNonZeroExit: true }, - }); + obsidian = createObsidianClient({ vault: VAULT }); await obsidian.verify(); lock = await acquireVaultRunLock({ @@ -233,13 +243,17 @@ describe("functional: file collision behaviors", () => { it("T09: append to bottom", async () => { await seedFile("qa-t09-append-bot.md", "ORIGINAL_BOTTOM_TEST"); const content = await runChoiceAndWaitForContent("__qa-test-t09-abot", "qa-t09-append-bot.md", TPL_CONTENT); - expect(content).toContain("ORIGINAL_BOTTOM_TEST"); + expectOrderedSubstrings( + content, + "ORIGINAL_BOTTOM_TEST", + TPL_CONTENT, + ); }); it("T10: append to top", async () => { await seedFile("qa-t10-append-top.md", "ORIGINAL_TOP_TEST"); const content = await runChoiceAndWaitForContent("__qa-test-t10-atop", "qa-t10-append-top.md", TPL_CONTENT); - expect(content).toContain("ORIGINAL_TOP_TEST"); + expectOrderedSubstrings(content, TPL_CONTENT, "ORIGINAL_TOP_TEST"); }); it("T11: overwrite", async () => {