Skip to content

Commit c5c3bd4

Browse files
authored
Fix and re-enable the local dependency tests (#1306)
More deterministic to see the result on the node, not just look at the build exit code
1 parent 9a4b2db commit c5c3bd4

File tree

8 files changed

+86
-120
lines changed

8 files changed

+86
-120
lines changed

.vscode/settings.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,9 @@
1313

1414
// Configure Prettier
1515
"editor.formatOnSave": true,
16-
"editor.defaultFormatter": "esbenp.prettier-vscode"
16+
"editor.defaultFormatter": "esbenp.prettier-vscode",
17+
18+
// Disable for when opening files in this workspace
19+
"swift.disableAutoResolve": true,
20+
"swift.autoGenerateLaunchConfigurations": false
1721
}

assets/test/Swift-Markdown/Package.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ let package = Package(
1212
products: [
1313
// Products define the executables and libraries a package produces, making them visible to other packages.
1414
.library(
15-
name: "PackageLib",
16-
targets: ["PackageLib"]),
15+
name: "MarkdownLib",
16+
targets: ["MarkdownLib"]),
1717
],
1818
targets: [
1919
.target(
20-
name: "PackageLib",
20+
name: "MarkdownLib",
2121
dependencies: []
2222
),
2323
]

assets/test/dependencies/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ let package = Package(
1212
targets: [
1313
.executableTarget(
1414
name: "dependencies",
15-
dependencies: [.product(name: "PackageLib", package: "Swift-Markdown")],
15+
dependencies: [.product(name: "MarkdownLib", package: "swift-markdown")],
1616
path: "Sources"),
1717
]
1818
)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import PackageLib
1+
import MarkdownLib
22

33
print("Test Asset:(dependencies)")
44
print(a)

src/commands.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,9 @@ export function register(ctx: WorkspaceContext): vscode.Disposable[] {
122122
vscode.commands.registerCommand("swift.insertFunctionComment", () =>
123123
insertFunctionComment(ctx)
124124
),
125-
vscode.commands.registerCommand(Commands.USE_LOCAL_DEPENDENCY, item => {
125+
vscode.commands.registerCommand(Commands.USE_LOCAL_DEPENDENCY, (item, dep) => {
126126
if (item instanceof PackageNode) {
127-
return useLocalDependency(item.name, ctx);
127+
return useLocalDependency(item.name, ctx, dep);
128128
}
129129
}),
130130
vscode.commands.registerCommand("swift.editDependency", item => {

src/commands/dependencies/useLocal.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,26 +26,29 @@ import { executeTaskWithUI } from "../utilities";
2626
*/
2727
export async function useLocalDependency(
2828
identifier: string,
29-
ctx: WorkspaceContext
29+
ctx: WorkspaceContext,
30+
dep: vscode.Uri | undefined
3031
): Promise<boolean> {
3132
const currentFolder = ctx.currentFolder;
3233
if (!currentFolder) {
3334
ctx.outputChannel.log("currentFolder is not set.");
3435
return false;
3536
}
36-
const folders = await vscode.window.showOpenDialog({
37-
canSelectFiles: false,
38-
canSelectFolders: true,
39-
canSelectMany: false,
40-
defaultUri: currentFolder.folder,
41-
openLabel: "Select",
42-
title: "Select folder",
43-
});
44-
45-
if (!folders) {
46-
return false;
37+
let folder = dep;
38+
if (!folder) {
39+
const folders = await vscode.window.showOpenDialog({
40+
canSelectFiles: false,
41+
canSelectFolders: true,
42+
canSelectMany: false,
43+
defaultUri: currentFolder.folder,
44+
openLabel: "Select",
45+
title: "Select folder",
46+
});
47+
if (!folders) {
48+
return false;
49+
}
50+
folder = folders[0];
4751
}
48-
const folder = folders[0];
4952
const task = createSwiftTask(
5053
["package", "edit", "--path", folder.fsPath, identifier],
5154
"Edit Package Dependency",

test/integration-tests/commands/dependency.test.ts

Lines changed: 58 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -18,146 +18,105 @@ import {
1818
PackageDependenciesProvider,
1919
PackageNode,
2020
} from "../../../src/ui/PackageDependencyProvider";
21-
import { executeTaskAndWaitForResult, waitForNoRunningTasks } from "../../utilities/tasks";
22-
import { getBuildAllTask, SwiftTask } from "../../../src/tasks/SwiftTaskProvider";
2321
import { testAssetUri } from "../../fixtures";
2422
import { FolderContext } from "../../../src/FolderContext";
2523
import { WorkspaceContext } from "../../../src/WorkspaceContext";
26-
import * as sinon from "sinon";
2724
import { Commands } from "../../../src/commands";
2825
import { activateExtensionForSuite, folderInRootWorkspace } from "../utilities/testutilities";
26+
import { executeTaskAndWaitForResult, waitForNoRunningTasks } from "../../utilities/tasks";
27+
import { getBuildAllTask, SwiftTask } from "../../../src/tasks/SwiftTaskProvider";
2928

3029
suite("Dependency Commmands Test Suite", function () {
3130
// full workflow's interaction with spm is longer than the default timeout
3231
// 60 seconds for each test should be more than enough
3332
this.timeout(60 * 1000);
3433

35-
suite("spm Update Contract Tests", function () {
36-
let folderContext: FolderContext;
37-
let workspaceContext: WorkspaceContext;
38-
39-
activateExtensionForSuite({
40-
async setup(ctx) {
41-
workspaceContext = ctx;
42-
await waitForNoRunningTasks();
43-
folderContext = await folderInRootWorkspace("defaultPackage", workspaceContext);
44-
await workspaceContext.focusFolder(folderContext);
45-
},
46-
});
47-
48-
test("Contract: spm update", async function () {
49-
// Contract: spm update
50-
const result = await vscode.commands.executeCommand(Commands.UPDATE_DEPENDENCIES);
51-
expect(result).to.be.true;
52-
});
34+
let defaultContext: FolderContext;
35+
let depsContext: FolderContext;
36+
let workspaceContext: WorkspaceContext;
37+
38+
activateExtensionForSuite({
39+
async setup(ctx) {
40+
workspaceContext = ctx;
41+
defaultContext = await folderInRootWorkspace("defaultPackage", workspaceContext);
42+
depsContext = await folderInRootWorkspace("dependencies", workspaceContext);
43+
await waitForNoRunningTasks();
44+
},
5345
});
5446

55-
suite("spm Resolve Contract Tests", function () {
56-
let folderContext: FolderContext;
57-
let workspaceContext: WorkspaceContext;
58-
59-
activateExtensionForSuite({
60-
async setup(ctx) {
61-
workspaceContext = ctx;
62-
await waitForNoRunningTasks();
63-
folderContext = await folderInRootWorkspace("dependencies", workspaceContext);
64-
await workspaceContext.focusFolder(folderContext);
65-
},
66-
});
47+
test("Swift: Update Package Dependencies", async function () {
48+
await workspaceContext.focusFolder(defaultContext);
49+
const result = await vscode.commands.executeCommand(Commands.UPDATE_DEPENDENCIES);
50+
expect(result).to.be.true;
51+
});
6752

68-
test("Contract: spm resolve", async () => {
69-
const result = await vscode.commands.executeCommand(Commands.RESOLVE_DEPENDENCIES);
70-
expect(result).to.be.true;
71-
});
53+
test("Swift: Resolve Package Dependencies", async function () {
54+
await workspaceContext.focusFolder(defaultContext);
55+
const result = await vscode.commands.executeCommand(Commands.RESOLVE_DEPENDENCIES);
56+
expect(result).to.be.true;
7257
});
7358

74-
suite("Full Work Flow Test Suite", function () {
75-
let folderContext: FolderContext;
76-
let workspaceContext: WorkspaceContext;
77-
let tasks: SwiftTask;
59+
suite("Swift: Use Local Dependency", function () {
7860
let treeProvider: PackageDependenciesProvider;
79-
let item: PackageNode;
80-
81-
activateExtensionForSuite({
82-
async setup(ctx) {
83-
// FIXME: Disable this test suite as this is dependent on external git dependency
84-
// and introduces flakinesss when run in the CI setting. The spm command only
85-
// runs if the dependency is remote, which make faking difficult.
86-
// For enabling the test in the future, we would need to set up the environment
87-
// into a pre-resolved state, so spm does not need to visit remote git url.
88-
this.skip();
89-
// Check before each test case start:
90-
// Expect to fail without setting up local version
91-
workspaceContext = ctx;
92-
await waitForNoRunningTasks();
93-
folderContext = await folderInRootWorkspace("dependencies", workspaceContext);
94-
await workspaceContext.focusFolder(folderContext);
95-
96-
tasks = (await getBuildAllTask(folderContext)) as SwiftTask;
97-
const { exitCode, output } = await executeTaskAndWaitForResult(tasks);
98-
expect(exitCode, `${output}`).to.not.equal(0);
99-
expect(output).to.include("PackageLib");
100-
expect(output).to.include("required");
101-
102-
treeProvider = new PackageDependenciesProvider(workspaceContext);
103-
104-
const items = await treeProvider.getChildren();
105-
item = items.find(n => n.name === "swift-markdown") as PackageNode;
106-
},
107-
async teardown() {
108-
treeProvider?.dispose();
109-
},
61+
62+
setup(async () => {
63+
await workspaceContext.focusFolder(depsContext);
64+
await executeTaskAndWaitForResult((await getBuildAllTask(depsContext)) as SwiftTask);
65+
treeProvider = new PackageDependenciesProvider(workspaceContext);
11066
});
11167

112-
async function useLocalDependencyTest() {
113-
// Contract: spm edit with user supplied local version of dependency
114-
const windowMock = sinon.stub(vscode.window, "showOpenDialog");
115-
windowMock.resolves([testAssetUri("Swift-Markdown")]);
116-
let result = await vscode.commands.executeCommand(Commands.USE_LOCAL_DEPENDENCY, item);
117-
expect(result).to.be.true;
118-
windowMock.restore();
68+
teardown(() => {
69+
treeProvider?.dispose();
70+
});
11971

120-
// Make sure new dependencies resolve before building
121-
result = await vscode.commands.executeCommand(Commands.RESOLVE_DEPENDENCIES);
72+
async function getDependency() {
73+
const items = await treeProvider.getChildren();
74+
return items.find(n => n.name === "swift-markdown") as PackageNode;
75+
}
76+
77+
async function useLocalDependencyTest() {
78+
// spm edit with user supplied local version of dependency
79+
const item = await getDependency();
80+
const localDep = testAssetUri("swift-markdown");
81+
const result = await vscode.commands.executeCommand(
82+
Commands.USE_LOCAL_DEPENDENCY,
83+
item,
84+
localDep
85+
);
12286
expect(result).to.be.true;
12387

124-
// This will now pass as we have the required library
125-
const { exitCode, output } = await executeTaskAndWaitForResult(tasks);
126-
expect(exitCode, `${output}`).to.equal(0);
127-
expect(output).to.include("defaultpackage");
128-
expect(output).to.include("not used by any target");
88+
// Make sure using local
89+
expect((await getDependency()).type).to.equal("editing");
12990
}
13091

131-
async function assertDependencyNoLongerExists() {
132-
// Expect to fail again now dependency is missing
133-
const { exitCode, output } = await executeTaskAndWaitForResult(tasks);
134-
expect(exitCode, `${output}`).to.not.equal(0);
135-
expect(output).to.include("PackageLib");
136-
expect(output).to.include("required");
92+
async function assertUsingRemote() {
93+
expect((await getDependency()).type).to.equal("remote");
13794
}
13895

139-
test("Use local dependency - Reset", async function () {
96+
test("Swift: Reset Package Dependencies", async function () {
14097
// spm reset after using local dependency is broken on windows
14198
if (process.platform === "win32") {
14299
this.skip();
143100
}
144101
await useLocalDependencyTest();
145102

146-
// Contract: spm reset
103+
// spm reset
147104
const result = await vscode.commands.executeCommand(Commands.RESET_PACKAGE);
148105
expect(result).to.be.true;
149106

150-
await assertDependencyNoLongerExists();
107+
await assertUsingRemote();
151108
});
152109

153-
test("Use local dependency - Add to workspace - Unedit", async () => {
110+
test("Swift: Revert To Original Version", async () => {
154111
await useLocalDependencyTest();
155112

156-
// Contract: spm unedit
157-
const result = await vscode.commands.executeCommand(Commands.UNEDIT_DEPENDENCY, item);
113+
const result = await vscode.commands.executeCommand(
114+
Commands.UNEDIT_DEPENDENCY,
115+
await getDependency()
116+
);
158117
expect(result).to.be.true;
159118

160-
await assertDependencyNoLongerExists();
119+
await assertUsingRemote();
161120
});
162121
});
163122
});

0 commit comments

Comments
 (0)