fix project tree tests failing on windows (#14759)

* fix project tree tests failing on windows

* add back test

* Addressing comments

* change to doc comment

* remove unnecessary change

* undo other change
This commit is contained in:
Kim Santiago
2021-03-18 17:14:00 -07:00
committed by GitHub
parent c65c856d2f
commit 8068de5938
7 changed files with 47 additions and 49 deletions

View File

@@ -374,7 +374,7 @@ export class ProjectsController {
await project.exclude(fileEntry); await project.exclude(fileEntry);
} else { } else {
TelemetryReporter.sendErrorEvent(TelemetryViews.ProjectTree, TelemetryActions.excludeFromProject); TelemetryReporter.sendErrorEvent(TelemetryViews.ProjectTree, TelemetryActions.excludeFromProject);
vscode.window.showErrorMessage(constants.unableToPerformAction(constants.excludeAction, node.uri.path)); vscode.window.showErrorMessage(constants.unableToPerformAction(constants.excludeAction, node.projectUri.path));
} }
this.refreshProjectsTree(context); this.refreshProjectsTree(context);
@@ -428,7 +428,7 @@ export class ProjectsController {
.withAdditionalProperties({ objectType: node.constructor.name }) .withAdditionalProperties({ objectType: node.constructor.name })
.send(); .send();
vscode.window.showErrorMessage(constants.unableToPerformAction(constants.deleteAction, node.uri.path)); vscode.window.showErrorMessage(constants.unableToPerformAction(constants.deleteAction, node.projectUri.path));
} }
} }
@@ -441,7 +441,7 @@ export class ProjectsController {
const allFileEntries = project.files.concat(project.preDeployScripts).concat(project.postDeployScripts).concat(project.noneDeployScripts); const allFileEntries = project.files.concat(project.preDeployScripts).concat(project.postDeployScripts).concat(project.noneDeployScripts);
return allFileEntries.find(x => utils.getPlatformSafeFileEntryPath(x.relativePath) === utils.getPlatformSafeFileEntryPath(utils.trimUri(root.fileSystemUri, fileOrFolder.fileSystemUri))); return allFileEntries.find(x => utils.getPlatformSafeFileEntryPath(x.relativePath) === utils.getPlatformSafeFileEntryPath(utils.trimUri(root.fileSystemUri, fileOrFolder.fileSystemUri)));
} }
return project.files.find(x => utils.getPlatformSafeFileEntryPath(x.relativePath) === utils.getPlatformSafeFileEntryPath(utils.trimUri(context.root.uri, context.uri))); return project.files.find(x => utils.getPlatformSafeFileEntryPath(x.relativePath) === utils.getPlatformSafeFileEntryPath(utils.trimUri(context.root.projectUri, context.projectUri)));
} }
private getDatabaseReference(project: Project, context: BaseProjectTreeItem): IDatabaseReferenceProjectEntry | undefined { private getDatabaseReference(project: Project, context: BaseProjectTreeItem): IDatabaseReferenceProjectEntry | undefined {
@@ -696,7 +696,7 @@ export class ProjectsController {
if (context.root instanceof ProjectRootTreeItem) { if (context.root instanceof ProjectRootTreeItem) {
return (<ProjectRootTreeItem>context.root).project; return (<ProjectRootTreeItem>context.root).project;
} else { } else {
throw new Error(constants.unexpectedProjectContext(context.uri.path)); throw new Error(constants.unexpectedProjectContext(context.projectUri.path));
} }
} }
@@ -728,7 +728,7 @@ export class ProjectsController {
} }
private getRelativePath(treeNode: BaseProjectTreeItem): string { private getRelativePath(treeNode: BaseProjectTreeItem): string {
return treeNode instanceof FolderNode ? utils.trimUri(treeNode.root.uri, treeNode.uri) : ''; return treeNode instanceof FolderNode ? utils.trimUri(treeNode.root.projectUri, treeNode.projectUri) : '';
} }
/** /**

View File

@@ -10,11 +10,12 @@ import * as path from 'path';
* Base class for an item that appears in the ADS project tree * Base class for an item that appears in the ADS project tree
*/ */
export abstract class BaseProjectTreeItem { export abstract class BaseProjectTreeItem {
uri: vscode.Uri; /** Project-relative URI that's compatible with the project tree */
projectUri: vscode.Uri;
parent?: BaseProjectTreeItem; parent?: BaseProjectTreeItem;
constructor(uri: vscode.Uri, parent?: BaseProjectTreeItem) { constructor(uri: vscode.Uri, parent?: BaseProjectTreeItem) {
this.uri = uri; this.projectUri = uri;
this.parent = parent; this.parent = parent;
} }
@@ -23,7 +24,7 @@ export abstract class BaseProjectTreeItem {
abstract get treeItem(): vscode.TreeItem; abstract get treeItem(): vscode.TreeItem;
public get friendlyName(): string { public get friendlyName(): string {
return path.parse(this.uri.path).base; return path.parse(this.projectUri.path).base;
} }
public get root() { public get root() {
@@ -44,7 +45,7 @@ export class MessageTreeItem extends BaseProjectTreeItem {
private message: string; private message: string;
constructor(message: string, parent?: BaseProjectTreeItem) { constructor(message: string, parent?: BaseProjectTreeItem) {
super(vscode.Uri.file(path.join(parent?.uri.path ?? 'Message', message)), parent); super(vscode.Uri.file(path.join(parent?.projectUri.path ?? 'Message', message)), parent);
this.message = message; this.message = message;
} }

View File

@@ -19,7 +19,7 @@ export class DataSourcesTreeItem extends BaseProjectTreeItem {
private dataSources: DataSourceTreeItem[] = []; private dataSources: DataSourceTreeItem[] = [];
constructor(project: ProjectRootTreeItem) { constructor(project: ProjectRootTreeItem) {
super(vscode.Uri.file(path.join(project.uri.path, constants.dataSourcesNodeName)), project); super(vscode.Uri.file(path.join(project.projectUri.path, constants.dataSourcesNodeName)), project);
this.construct(); this.construct();
} }
@@ -35,7 +35,7 @@ export class DataSourcesTreeItem extends BaseProjectTreeItem {
} }
public get treeItem(): vscode.TreeItem { public get treeItem(): vscode.TreeItem {
const dataSources = new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Collapsed); const dataSources = new vscode.TreeItem(this.projectUri, vscode.TreeItemCollapsibleState.Collapsed);
dataSources.contextValue = constants.DatabaseProjectItemType.dataSourceRoot; dataSources.contextValue = constants.DatabaseProjectItemType.dataSourceRoot;
dataSources.iconPath = IconPathHelper.dataSourceGroup; dataSources.iconPath = IconPathHelper.dataSourceGroup;
@@ -50,11 +50,11 @@ abstract class DataSourceTreeItem extends BaseProjectTreeItem { }
*/ */
export class SqlConnectionDataSourceTreeItem extends DataSourceTreeItem { export class SqlConnectionDataSourceTreeItem extends DataSourceTreeItem {
constructor(private dataSource: SqlConnectionDataSource, dataSourcesNode: DataSourcesTreeItem) { constructor(private dataSource: SqlConnectionDataSource, dataSourcesNode: DataSourcesTreeItem) {
super(vscode.Uri.file(path.join(dataSourcesNode.uri.path, dataSource.name)), dataSourcesNode); super(vscode.Uri.file(path.join(dataSourcesNode.projectUri.path, dataSource.name)), dataSourcesNode);
} }
public get treeItem(): vscode.TreeItem { public get treeItem(): vscode.TreeItem {
let item = new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Collapsed); let item = new vscode.TreeItem(this.projectUri, vscode.TreeItemCollapsibleState.Collapsed);
item.label = `${this.dataSource.name} (${this.dataSource.typeFriendlyName})`; item.label = `${this.dataSource.name} (${this.dataSource.typeFriendlyName})`;
item.iconPath = IconPathHelper.dataSourceSql; item.iconPath = IconPathHelper.dataSourceSql;

View File

@@ -19,7 +19,7 @@ export class DatabaseReferencesTreeItem extends BaseProjectTreeItem {
private references: DatabaseReferenceTreeItem[] = []; private references: DatabaseReferenceTreeItem[] = [];
constructor(project: ProjectRootTreeItem) { constructor(project: ProjectRootTreeItem) {
super(vscode.Uri.file(path.join(project.uri.path, constants.databaseReferencesNodeName)), project); super(vscode.Uri.file(path.join(project.projectUri.fsPath, constants.databaseReferencesNodeName)), project);
this.construct(); this.construct();
} }
@@ -35,7 +35,7 @@ export class DatabaseReferencesTreeItem extends BaseProjectTreeItem {
} }
public get treeItem(): vscode.TreeItem { public get treeItem(): vscode.TreeItem {
const refFolderItem = new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Collapsed); const refFolderItem = new vscode.TreeItem(this.projectUri, vscode.TreeItemCollapsibleState.Collapsed);
refFolderItem.contextValue = constants.DatabaseProjectItemType.referencesRoot; refFolderItem.contextValue = constants.DatabaseProjectItemType.referencesRoot;
refFolderItem.iconPath = IconPathHelper.referenceGroup; refFolderItem.iconPath = IconPathHelper.referenceGroup;
@@ -45,7 +45,7 @@ export class DatabaseReferencesTreeItem extends BaseProjectTreeItem {
export class DatabaseReferenceTreeItem extends BaseProjectTreeItem { export class DatabaseReferenceTreeItem extends BaseProjectTreeItem {
constructor(private reference: IDatabaseReferenceProjectEntry, referencesTreeItem: DatabaseReferencesTreeItem) { constructor(private reference: IDatabaseReferenceProjectEntry, referencesTreeItem: DatabaseReferencesTreeItem) {
super(vscode.Uri.file(path.join(referencesTreeItem.uri.path, reference.databaseName)), referencesTreeItem); super(vscode.Uri.file(path.join(referencesTreeItem.projectUri.fsPath, reference.databaseName)), referencesTreeItem);
} }
public get children(): BaseProjectTreeItem[] { public get children(): BaseProjectTreeItem[] {
@@ -53,7 +53,7 @@ export class DatabaseReferenceTreeItem extends BaseProjectTreeItem {
} }
public get treeItem(): vscode.TreeItem { public get treeItem(): vscode.TreeItem {
const refItem = new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.None); const refItem = new vscode.TreeItem(this.projectUri, vscode.TreeItemCollapsibleState.None);
refItem.label = this.reference.databaseName; refItem.label = this.reference.databaseName;
refItem.contextValue = constants.DatabaseProjectItemType.reference; refItem.contextValue = constants.DatabaseProjectItemType.reference;
refItem.iconPath = IconPathHelper.referenceDatabase; refItem.iconPath = IconPathHelper.referenceDatabase;

View File

@@ -88,12 +88,10 @@ export class ExternalStreamingJobFileNode extends FileNode {
export function sortFileFolderNodes(a: (FolderNode | FileNode), b: (FolderNode | FileNode)): number { export function sortFileFolderNodes(a: (FolderNode | FileNode), b: (FolderNode | FileNode)): number {
if (a instanceof FolderNode && !(b instanceof FolderNode)) { if (a instanceof FolderNode && !(b instanceof FolderNode)) {
return -1; return -1;
} } else if (!(a instanceof FolderNode) && b instanceof FolderNode) {
else if (!(a instanceof FolderNode) && b instanceof FolderNode) {
return 1; return 1;
} } else {
else { return a.projectUri.fsPath.localeCompare(b.projectUri.fsPath);
return a.uri.fsPath.localeCompare(b.uri.fsPath);
} }
} }
@@ -106,13 +104,12 @@ function fsPathToProjectUri(fileSystemUri: vscode.Uri, projectNode: ProjectRootT
if (fileSystemUri.fsPath.startsWith(projBaseDir)) { if (fileSystemUri.fsPath.startsWith(projBaseDir)) {
localUri = fileSystemUri.fsPath.substring(projBaseDir.length); localUri = fileSystemUri.fsPath.substring(projBaseDir.length);
} } else if (isFile) {
else if (isFile) {
// if file is outside the folder add add at top level in tree // if file is outside the folder add add at top level in tree
// this is not true for folders otherwise the outside files will not be directly inside the top level // this is not true for folders otherwise the outside files will not be directly inside the top level
let parts = utils.getPlatformSafeFileEntryPath(fileSystemUri.fsPath).split('/'); const parts = utils.getPlatformSafeFileEntryPath(fileSystemUri.fsPath).split('/');
localUri = parts[parts.length - 1]; localUri = parts[parts.length - 1];
} }
return vscode.Uri.file(path.join(projectNode.uri.path, localUri)); return vscode.Uri.file(path.join(projectNode.projectUri.fsPath, localUri));
} }

View File

@@ -25,7 +25,7 @@ export class ProjectRootTreeItem extends BaseProjectTreeItem {
fileSystemUri: vscode.Uri; fileSystemUri: vscode.Uri;
constructor(project: Project) { constructor(project: Project) {
super(vscode.Uri.file(project.projectFilePath), undefined); super(vscode.Uri.parse(path.basename(project.projectFilePath, sqlprojExtension)), undefined);
this.project = project; this.project = project;
this.fileSystemUri = vscode.Uri.file(project.projectFilePath); this.fileSystemUri = vscode.Uri.file(project.projectFilePath);
@@ -45,10 +45,10 @@ export class ProjectRootTreeItem extends BaseProjectTreeItem {
} }
public get treeItem(): vscode.TreeItem { public get treeItem(): vscode.TreeItem {
const projectItem = new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Expanded); const projectItem = new vscode.TreeItem(this.fileSystemUri, vscode.TreeItemCollapsibleState.Expanded);
projectItem.contextValue = DatabaseProjectItemType.project; projectItem.contextValue = DatabaseProjectItemType.project;
projectItem.iconPath = IconPathHelper.databaseProject; projectItem.iconPath = IconPathHelper.databaseProject;
projectItem.label = path.basename(this.uri.fsPath, sqlprojExtension); projectItem.label = path.basename(this.projectUri.fsPath, sqlprojExtension);
return projectItem; return projectItem;
} }

View File

@@ -43,7 +43,7 @@ describe('Project Tree tests', function (): void {
new FileNode(vscode.Uri.file(`${root}D`), parent) new FileNode(vscode.Uri.file(`${root}D`), parent)
]; ];
should(inputNodes.map(n => n.uri.path)).deepEqual(expectedNodes.map(n => n.uri.path)); should(inputNodes.map(n => n.projectUri.path)).deepEqual(expectedNodes.map(n => n.projectUri.path));
}); });
it('Should build tree from Project file correctly', function (): void { it('Should build tree from Project file correctly', function (): void {
@@ -67,17 +67,17 @@ describe('Project Tree tests', function (): void {
proj.files.push(proj.createFileProjectEntry('duplicateFolder', EntryType.Folder)); proj.files.push(proj.createFileProjectEntry('duplicateFolder', EntryType.Folder));
const tree = new ProjectRootTreeItem(proj); const tree = new ProjectRootTreeItem(proj);
should(tree.children.map(x => x.uri.path)).deepEqual([ should(tree.children.map(x => x.projectUri.path)).deepEqual([
'/TestProj.sqlproj/Database References', '/TestProj/Database References',
'/TestProj.sqlproj/duplicateFolder', '/TestProj/duplicateFolder',
'/TestProj.sqlproj/someFolder', '/TestProj/someFolder',
'/TestProj.sqlproj/duplicate.sql']); '/TestProj/duplicate.sql']);
should(tree.children.find(x => x.uri.path === '/TestProj.sqlproj/someFolder')?.children.map(y => y.uri.path)).deepEqual([ should(tree.children.find(x => x.projectUri.path === '/TestProj/someFolder')?.children.map(y => y.projectUri.path)).deepEqual([
'/TestProj.sqlproj/someFolder/aNestedFolder', '/TestProj/someFolder/aNestedFolder',
'/TestProj.sqlproj/someFolder/bNestedFolder', '/TestProj/someFolder/bNestedFolder',
'/TestProj.sqlproj/someFolder/aNestedTest.sql', '/TestProj/someFolder/aNestedTest.sql',
'/TestProj.sqlproj/someFolder/bNestedTest.sql']); '/TestProj/someFolder/bNestedTest.sql']);
should(tree.children.map(x => x.treeItem.contextValue)).deepEqual([ should(tree.children.map(x => x.treeItem.contextValue)).deepEqual([
DatabaseProjectItemType.referencesRoot, DatabaseProjectItemType.referencesRoot,
@@ -85,7 +85,7 @@ describe('Project Tree tests', function (): void {
DatabaseProjectItemType.folder, DatabaseProjectItemType.folder,
DatabaseProjectItemType.file]); DatabaseProjectItemType.file]);
should(tree.children.find(x => x.uri.path === '/TestProj.sqlproj/someFolder')?.children.map(y => y.treeItem.contextValue)).deepEqual([ should(tree.children.find(x => x.projectUri.path === '/TestProj/someFolder')?.children.map(y => y.treeItem.contextValue)).deepEqual([
DatabaseProjectItemType.folder, DatabaseProjectItemType.folder,
DatabaseProjectItemType.folder, DatabaseProjectItemType.folder,
DatabaseProjectItemType.file, DatabaseProjectItemType.file,
@@ -103,12 +103,12 @@ describe('Project Tree tests', function (): void {
proj.files.push(proj.createFileProjectEntry('someFolder1\\MyFile2.sql', EntryType.File)); proj.files.push(proj.createFileProjectEntry('someFolder1\\MyFile2.sql', EntryType.File));
const tree = new ProjectRootTreeItem(proj); const tree = new ProjectRootTreeItem(proj);
should(tree.children.map(x => x.uri.path)).deepEqual([ should(tree.children.map(x => x.projectUri.path)).deepEqual([
'/TestProj.sqlproj/Database References', '/TestProj/Database References',
'/TestProj.sqlproj/someFolder1']); '/TestProj/someFolder1']);
// Why are we only matching names - https://github.com/microsoft/azuredatastudio/issues/11026 // Why are we only matching names - https://github.com/microsoft/azuredatastudio/issues/11026
should(tree.children.find(x => x.uri.path === '/TestProj.sqlproj/someFolder1')?.children.map(y => path.basename(y.uri.path))).deepEqual([ should(tree.children.find(x => x.projectUri.path === '/TestProj/someFolder1')?.children.map(y => path.basename(y.projectUri.path))).deepEqual([
'MyNestedFolder1', 'MyNestedFolder1',
'MyNestedFolder2', 'MyNestedFolder2',
'MyFile2.sql']); 'MyFile2.sql']);
@@ -125,9 +125,9 @@ describe('Project Tree tests', function (): void {
proj.files.push(proj.createFileProjectEntry('..\\..\\someFolder3', EntryType.Folder)); // folder should not be counted (same as SSDT) proj.files.push(proj.createFileProjectEntry('..\\..\\someFolder3', EntryType.Folder)); // folder should not be counted (same as SSDT)
const tree = new ProjectRootTreeItem(proj); const tree = new ProjectRootTreeItem(proj);
should(tree.children.map(x => x.uri.path)).deepEqual([ should(tree.children.map(x => x.projectUri.path)).deepEqual([
'/Root/Level1/Level2/TestProj.sqlproj/Database References', '/TestProj/Database References',
'/Root/Level1/Level2/TestProj.sqlproj/MyFile1.sql', '/TestProj/MyFile1.sql',
'/Root/Level1/Level2/TestProj.sqlproj/MyFile2.sql']); '/TestProj/MyFile2.sql']);
}); });
}); });