From 7ac5f8b79c3fd035358652d1ae5969fcb1d70705 Mon Sep 17 00:00:00 2001 From: Corwin Marsh Date: Fri, 24 Apr 2026 12:05:23 -0700 Subject: [PATCH 1/2] test: Update tests for ci reliability --- src/test/extension.test.ts | 74 ++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts index 9eabf11..5d34daa 100644 --- a/src/test/extension.test.ts +++ b/src/test/extension.test.ts @@ -49,6 +49,15 @@ async function setPreviewByDefault(enabled: boolean) { ); } +async function waitForActiveTextEditor(message = "No active editor") { + let activeEditor: vscode.TextEditor | undefined; + await waitFor(() => { + activeEditor = vscode.window.activeTextEditor; + assert.ok(activeEditor, message); + }); + return activeEditor!; +} + suite("oil.code", () => { // Setup and teardown for Sinon stubs let showWarningMessageStub: sinon.SinonStub; @@ -303,10 +312,9 @@ suite("oil.code", () => { editor.selection = new vscode.Selection(position, position); await vscode.commands.executeCommand("oil-code.select"); - await sleep(300); - + const fileEditor = await waitForActiveTextEditor(); const mockFileContent = `mock file content`; - await vscode.window.activeTextEditor?.edit((editBuilder) => { + await fileEditor.edit((editBuilder) => { editBuilder.insert(new vscode.Position(0, 0), mockFileContent); }); @@ -316,7 +324,8 @@ suite("oil.code", () => { await waitForDocumentText(["/000 ../", "/001 oil-file.md"]); - vscode.window.activeTextEditor?.edit((editBuilder) => { + const editor2 = await waitForActiveTextEditor("No active editor2"); + await editor2.edit((editBuilder) => { editBuilder.insert(new vscode.Position(1, 5), `new-`); }); @@ -354,17 +363,21 @@ suite("oil.code", () => { const filePosition = new vscode.Position(2, 0); editor.selection = new vscode.Selection(filePosition, filePosition); await vscode.commands.executeCommand("oil-code.select"); - await sleep(200); + const fileEditor = await waitForActiveTextEditor(); const mockFileContent = `mock file content`; - await vscode.window.activeTextEditor?.edit((editBuilder) => { + await fileEditor.edit((editBuilder) => { editBuilder.insert(new vscode.Position(0, 0), mockFileContent); }); await saveFile(); await vscode.commands.executeCommand("oil-code.open"); - await sleep(100); + await waitForDocumentText([ + "/000 ../", + "/001 sub-dir/", + "/002 oil-file.md", + ]); // Move cursor to the file name const position = new vscode.Position(2, 0); @@ -374,17 +387,17 @@ suite("oil.code", () => { // Cut selection await vscode.commands.executeCommand("editor.action.deleteLines"); + await waitForDocumentText(["/000 ../", "/001 sub-dir/"]); // Move cursor to the new directory const position3 = new vscode.Position(1, 0); - editor.selection = new vscode.Selection(position3, position3); + editor2.selection = new vscode.Selection(position3, position3); await vscode.commands.executeCommand("oil-code.select"); - await sleep(300); + await waitForDocumentText("/000 ../"); - const editor3 = vscode.window.activeTextEditor; - assert.ok(editor3, "No active editor3"); - editor3.edit((editBuilder) => { + const editor3 = await waitForActiveTextEditor("No active editor3"); + await editor3.edit((editBuilder) => { editBuilder.insert(new vscode.Position(0, 8), newline); editBuilder.insert(new vscode.Position(1, 0), `/002 oil-file.md`); }); @@ -425,17 +438,21 @@ suite("oil.code", () => { const filePosition = new vscode.Position(2, 0); editor.selection = new vscode.Selection(filePosition, filePosition); await vscode.commands.executeCommand("oil-code.select"); - await sleep(200); + const fileEditor = await waitForActiveTextEditor(); const mockFileContent = `mock file content`; - await vscode.window.activeTextEditor?.edit((editBuilder) => { + await fileEditor.edit((editBuilder) => { editBuilder.insert(new vscode.Position(0, 0), mockFileContent); }); await saveFile(); await vscode.commands.executeCommand("oil-code.open"); - await sleep(100); + await waitForDocumentText([ + "/000 ../", + "/001 sub-dir/", + "/002 oil-file.md", + ]); const editor2 = vscode.window.activeTextEditor; assert.ok(editor2, "No active editor2"); @@ -443,17 +460,16 @@ suite("oil.code", () => { editor2.selection = new vscode.Selection(2, 5, 2, 5); await vscode.commands.executeCommand("editor.action.deleteLines"); - await sleep(200); + await waitForDocumentText(["/000 ../", "/001 sub-dir/"]); // Move cursor to the new directory editor2.selection = new vscode.Selection(1, 5, 1, 5); await vscode.commands.executeCommand("oil-code.select"); - await sleep(300); + await waitForDocumentText("/000 ../"); - const editor3 = vscode.window.activeTextEditor; - assert.ok(editor3, "No active editor3"); - editor3.edit((editBuilder) => { + const editor3 = await waitForActiveTextEditor("No active editor3"); + await editor3.edit((editBuilder) => { editBuilder.insert(new vscode.Position(0, 8), newline); editBuilder.insert(new vscode.Position(1, 0), `/002 oil-file-rename.md`); }); @@ -489,14 +505,13 @@ suite("oil.code", () => { editor.selection = new vscode.Selection(1, 5, 1, 5); await vscode.commands.executeCommand("editor.action.deleteLines"); - await sleep(100); + await waitForDocumentText(["/000 ../", "/002 oil-dir-parent/"]); editor.selection = new vscode.Selection(1, 5, 1, 5); await vscode.commands.executeCommand("oil-code.select"); - await sleep(500); + await waitForDocumentText("/000 ../"); - const editor2 = vscode.window.activeTextEditor; - assert.ok(editor2, "No active editor"); - editor2.edit((editBuilder) => { + const editor2 = await waitForActiveTextEditor(); + await editor2.edit((editBuilder) => { editBuilder.insert( new vscode.Position(1, 0), ["", "/001 oil-dir-child/"].join(newline) @@ -537,14 +552,13 @@ suite("oil.code", () => { editor.selection = new vscode.Selection(1, 5, 1, 5); await vscode.commands.executeCommand("editor.action.deleteLines"); - await sleep(200); + await waitForDocumentText(["/000 ../", "/002 oil-dir-parent/"]); editor.selection = new vscode.Selection(1, 5, 1, 5); await vscode.commands.executeCommand("oil-code.select"); - await sleep(200); + await waitForDocumentText("/000 ../"); - const editor2 = vscode.window.activeTextEditor; - assert.ok(editor2, "No active editor"); - editor2.edit((editBuilder) => { + const editor2 = await waitForActiveTextEditor(); + await editor2.edit((editBuilder) => { editBuilder.insert( new vscode.Position(1, 0), ["", "/001 oil-dir-child-renamed/"].join(newline) From 5d7686db235593c9c0add9a9f15d7793f71792c8 Mon Sep 17 00:00:00 2001 From: Corwin Marsh Date: Fri, 24 Apr 2026 12:12:54 -0700 Subject: [PATCH 2/2] test: updates for ci failure --- src/test/extension.test.ts | 104 ++++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 41 deletions(-) diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts index 5d34daa..d95308e 100644 --- a/src/test/extension.test.ts +++ b/src/test/extension.test.ts @@ -58,6 +58,24 @@ async function waitForActiveTextEditor(message = "No active editor") { return activeEditor!; } +async function insertIntoDocument( + document: vscode.TextDocument, + inserts: { position: vscode.Position; text: string }[] +) { + const workspaceEdit = new vscode.WorkspaceEdit(); + for (const { position, text } of inserts) { + workspaceEdit.insert(document.uri, position, text); + } + const applied = await vscode.workspace.applyEdit(workspaceEdit); + assert.ok(applied, "Workspace edit was not applied"); +} + +async function saveDocument(document: vscode.TextDocument) { + await sleep(200); + await document.save(); + await sleep(400); +} + suite("oil.code", () => { // Setup and teardown for Sinon stubs let showWarningMessageStub: sinon.SinonStub; @@ -397,13 +415,13 @@ suite("oil.code", () => { await waitForDocumentText("/000 ../"); const editor3 = await waitForActiveTextEditor("No active editor3"); - await editor3.edit((editBuilder) => { - editBuilder.insert(new vscode.Position(0, 8), newline); - editBuilder.insert(new vscode.Position(1, 0), `/002 oil-file.md`); - }); + await insertIntoDocument(editor3.document, [ + { position: new vscode.Position(0, 8), text: newline }, + { position: new vscode.Position(1, 0), text: `/002 oil-file.md` }, + ]); await waitForDocumentText(["/000 ../", "/002 oil-file.md"]); - await saveFile(); + await saveDocument(editor3.document); await sleep(200); @@ -469,12 +487,12 @@ suite("oil.code", () => { await waitForDocumentText("/000 ../"); const editor3 = await waitForActiveTextEditor("No active editor3"); - await editor3.edit((editBuilder) => { - editBuilder.insert(new vscode.Position(0, 8), newline); - editBuilder.insert(new vscode.Position(1, 0), `/002 oil-file-rename.md`); - }); + await insertIntoDocument(editor3.document, [ + { position: new vscode.Position(0, 8), text: newline }, + { position: new vscode.Position(1, 0), text: `/002 oil-file-rename.md` }, + ]); - await saveFile(); + await saveDocument(editor3.document); await waitForDocumentText(["/000 ../", "/003 oil-file-rename.md"]); @@ -511,14 +529,14 @@ suite("oil.code", () => { await waitForDocumentText("/000 ../"); const editor2 = await waitForActiveTextEditor(); - await editor2.edit((editBuilder) => { - editBuilder.insert( - new vscode.Position(1, 0), - ["", "/001 oil-dir-child/"].join(newline) - ); - }); + await insertIntoDocument(editor2.document, [ + { + position: new vscode.Position(1, 0), + text: ["", "/001 oil-dir-child/"].join(newline), + }, + ]); - await saveFile(); + await saveDocument(editor2.document); await waitForDocumentText(["/000 ../", "/003 oil-dir-child/"]); await assertProjectFileStructure([ @@ -558,14 +576,14 @@ suite("oil.code", () => { await waitForDocumentText("/000 ../"); const editor2 = await waitForActiveTextEditor(); - await editor2.edit((editBuilder) => { - editBuilder.insert( - new vscode.Position(1, 0), - ["", "/001 oil-dir-child-renamed/"].join(newline) - ); - }); + await insertIntoDocument(editor2.document, [ + { + position: new vscode.Position(1, 0), + text: ["", "/001 oil-dir-child-renamed/"].join(newline), + }, + ]); - await saveFile(); + await saveDocument(editor2.document); await sleep(100); @@ -1006,10 +1024,10 @@ suite("oil.code", () => { const filePosition = new vscode.Position(2, 0); editor.selection = new vscode.Selection(filePosition, filePosition); await vscode.commands.executeCommand("oil-code.select"); - await sleep(200); const testContent = `# Test File${newline}This is test content for copy/move operation.`; - await vscode.window.activeTextEditor?.edit((editBuilder) => { + const fileEditor = await waitForActiveTextEditor(); + await fileEditor.edit((editBuilder) => { editBuilder.insert(new vscode.Position(0, 0), testContent); }); @@ -1017,7 +1035,11 @@ suite("oil.code", () => { // Return to oil view await vscode.commands.executeCommand("oil-code.open"); - await sleep(100); + await waitForDocumentText([ + "/000 ../", + "/001 target-dir/", + "/002 source-file.md", + ]); const editor2 = vscode.window.activeTextEditor; assert.ok(editor2, "No active editor2"); @@ -1029,28 +1051,28 @@ suite("oil.code", () => { new vscode.Range(new vscode.Position(2, 0), new vscode.Position(3, 0)) ); }); + await waitForDocumentText(`/000 ../${newline}/001 target-dir/${newline}`); // Select the target directory const targetPosition = new vscode.Position(1, 0); editor2.selection = new vscode.Selection(targetPosition, targetPosition); await vscode.commands.executeCommand("oil-code.select"); - await sleep(300); + await waitForDocumentText("/000 ../"); - const editor3 = vscode.window.activeTextEditor; - assert.ok(editor3, "No active editor3"); + const editor3 = await waitForActiveTextEditor("No active editor3"); // Insert the copied file line - await editor3.edit((editBuilder) => { - editBuilder.insert( - new vscode.Position(1, 0), - `${newline}/002 source-file-rename.md` - ); - editBuilder.insert( - new vscode.Position(2, 0), - `${newline}/002 source-file.md` - ); - }); + await insertIntoDocument(editor3.document, [ + { + position: new vscode.Position(1, 0), + text: `${newline}/002 source-file-rename.md`, + }, + { + position: new vscode.Position(2, 0), + text: `${newline}/002 source-file.md`, + }, + ]); - await saveFile(); + await saveDocument(editor3.document); await waitForDocumentText([ "/000 ../",