Skip to content

Commit 0eccd24

Browse files
authored
Porting changes to release branch for database projects extension 1.4.5 (#26101)
* Fix target platform when creating project from database via quickpick (#26049) * Create project from quickpick * Fix test * Fix test * Fix a bug in my last PR (#26053) * Create project from quickpick * Fix test * Fix test * Fix a bug in my last PR * Update default SDK version to 0.2.5-preview (#26095) * Update README.md * Update buildHelper.ts * Update newSdkSqlProjectTemplate.xml * Update sql-database-projects extension to 1.4.5 (#26099)
1 parent 49c73a8 commit 0eccd24

File tree

7 files changed

+76
-42
lines changed

7 files changed

+76
-42
lines changed

extensions/sql-database-projects/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ Learn more about the SQL Database Projects extension in the documentation: https
3535

3636
### General Settings
3737
- `sqlDatabaseProjects.dotnetSDK Location`: The path to the folder containing the `dotnet` folder for the .NET SDK. If not set, the extension will attempt to find the .NET SDK on the system.
38-
- `sqlDatabaseProjects.microsoftBuildSqlVersion`: Version of Microsoft.Build.Sql binaries used when building SQL projects that are not SDK-style SQL projects. If not set, the extension will use Microsoft.Build.Sql 0.2.0-preview.
38+
- `sqlDatabaseProjects.microsoftBuildSqlVersion`: Version of Microsoft.Build.Sql binaries used when building SQL projects that are not SDK-style SQL projects. If not set, the extension will use Microsoft.Build.Sql 0.2.5-preview.
3939
- `sqlDatabaseProjects.netCoreDoNotAsk`: When true, no longer prompts to install .NET SDK when a supported installation is not found.
4040
- `sqlDatabaseProjects.collapseProjectNodes`: Option to set the default state of the project nodes in the database projects view to collapsed. If not set, the extension will default to expanded.
4141

extensions/sql-database-projects/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "sql-database-projects",
33
"displayName": "SQL Database Projects",
44
"description": "Enables users to develop and publish database schemas for MSSQL Databases",
5-
"version": "1.4.4",
5+
"version": "1.4.5",
66
"publisher": "Microsoft",
77
"preview": false,
88
"engines": {

extensions/sql-database-projects/resources/templates/newSdkSqlProjectTemplate.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build">
3-
<Sdk Name="Microsoft.Build.Sql" Version="0.2.0-preview" />
3+
<Sdk Name="Microsoft.Build.Sql" Version="0.2.5-preview" />
44
<PropertyGroup>
55
<Name>@@PROJECT_NAME@@</Name>
66
<ProjectGuid>{@@PROJECT_GUID@@}</ProjectGuid>

extensions/sql-database-projects/src/controllers/projectController.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -1581,10 +1581,7 @@ export class ProjectsController {
15811581
const databaseName = (await utils.getVscodeMssqlApi()).getDatabaseNameFromTreeNode(treeNodeContext);
15821582
(profile as mssqlVscode.IConnectionInfo).database = databaseName;
15831583
}
1584-
const model = await createNewProjectFromDatabaseWithQuickpick(profile as mssqlVscode.IConnectionInfo);
1585-
if (model) {
1586-
await this.createProjectFromDatabaseCallback(model, profile as mssqlVscode.IConnectionInfo, (profile as mssqlVscode.IConnectionInfo)?.server);
1587-
}
1584+
await createNewProjectFromDatabaseWithQuickpick(profile as mssqlVscode.IConnectionInfo, (model: ImportDataModel, connectionInfo?: string | mssqlVscode.IConnectionInfo, serverName?: string) => this.createProjectFromDatabaseCallback(model, connectionInfo, serverName));
15881585
return undefined;
15891586
}
15901587

extensions/sql-database-projects/src/dialogs/createProjectFromDatabaseQuickpick.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ import { getSDKStyleProjectInfo } from './quickpickHelper';
1717
/**
1818
* Create flow for a New Project using only VS Code-native APIs such as QuickPick
1919
* @param connectionInfo Optional connection info to use instead of prompting the user for a connection
20+
* @param createProjectFromDatabaseCallback Optional callback function to create the project from the user inputs
2021
*/
21-
export async function createNewProjectFromDatabaseWithQuickpick(connectionInfo?: IConnectionInfo): Promise<ImportDataModel | undefined> {
22+
export async function createNewProjectFromDatabaseWithQuickpick(connectionInfo?: IConnectionInfo, createProjectFromDatabaseCallback?: (model: ImportDataModel, connectionInfo?: string | IConnectionInfo, serverName?: string) => Promise<void>): Promise<void> {
2223
const vscodeMssqlApi = await getVscodeMssqlApi();
2324

2425
// 1. Select connection
@@ -162,7 +163,7 @@ export async function createNewProjectFromDatabaseWithQuickpick(connectionInfo?:
162163
return;
163164
}
164165

165-
return {
166+
const model = {
166167
connectionUri: connectionUri,
167168
database: selectedDatabase,
168169
projName: projectName,
@@ -171,5 +172,10 @@ export async function createNewProjectFromDatabaseWithQuickpick(connectionInfo?:
171172
extractTarget: mapExtractTargetEnum(folderStructure),
172173
sdkStyle: sdkStyle,
173174
includePermissions: includePermissions
174-
};
175+
} as ImportDataModel;
176+
177+
// 8. Create the project using the callback
178+
if (createProjectFromDatabaseCallback) {
179+
await createProjectFromDatabaseCallback(model, connectionProfile, connectionProfile.server);
180+
}
175181
}

extensions/sql-database-projects/src/test/dialogs/createProjectFromDatabaseQuickpick.test.ts

+62-31
Original file line numberDiff line numberDiff line change
@@ -40,35 +40,44 @@ describe('Create Project From Database Quickpick', () => {
4040
//promptForConnection spy to verify test
4141
const promptForConnectionSpy = sinon.stub(testUtils.vscodeMssqlIExtension.object, 'promptForConnection').withArgs(sinon.match.any).resolves(undefined);
4242

43-
const model = await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick();
43+
//createProjectFromDatabaseQuickpick spy to verify test
44+
const createProjectFromDatabaseCallbackSpy = sinon.stub().resolves();
45+
46+
await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(undefined, createProjectFromDatabaseCallbackSpy);
4447

4548
//verify that prompt for connection was called
4649
should(promptForConnectionSpy.calledOnce).be.true('promptForConnection should have been called');
4750

48-
//verify quickpick exited with undefined, since promptForConnection was set to cancel (resolves to undefined)
49-
should.equal(model, undefined);
51+
//verify create project callback was not called, since promptForConnection was set to cancel (resolves to undefined)
52+
should(createProjectFromDatabaseCallbackSpy.notCalled).be.true('createProjectFromDatabaseCallback should not have been called');
5053
});
5154

5255
it('Should not prompt for connection when connectionInfo is provided and exit when db is not selected', async function (): Promise<void> {
5356
//promptForConnection spy to verify test
5457
const promptForConnectionSpy = sinon.stub(testUtils.vscodeMssqlIExtension.object, 'promptForConnection').withArgs(sinon.match.any).resolves(undefined);
5558

59+
//createProjectFromDatabaseQuickpick spy to verify test
60+
const createProjectFromDatabaseCallbackSpy = sinon.stub().resolves();
61+
5662
//user chooses connection
5763
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'connect').resolves('testConnectionURI');
5864
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'listDatabases').withArgs(sinon.match.any).resolves(dbList);
5965
// user chooses to cancel when prompted for database
6066
sinon.stub(vscode.window, 'showQuickPick').resolves(undefined);
6167

62-
const model = await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo);
68+
await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo, createProjectFromDatabaseCallbackSpy);
6369

6470
//verify connection prompt wasn't presented, since connectionInfo was passed during the call
6571
should(promptForConnectionSpy.notCalled).be.true('promptForConnection should not be called when connectionInfo is provided');
6672

67-
//verify quickpick exited with undefined, since database wasn't selected (resolved to undefined)
68-
should.equal(model, undefined);
73+
//verify create project callback was not called, since database wasn't selected (resolved to undefined)
74+
should(createProjectFromDatabaseCallbackSpy.notCalled).be.true('createProjectFromDatabaseCallback should not have been called');
6975
});
7076

7177
it('Should exit when project name is not selected', async function (): Promise<void> {
78+
//createProjectFromDatabaseQuickpick spy to verify test
79+
const createProjectFromDatabaseCallbackSpy = sinon.stub().resolves();
80+
7281
//user chooses connection and database
7382
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'connect').resolves('testConnectionURI');
7483
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'listDatabases').withArgs(sinon.match.any).resolves(dbList);
@@ -78,13 +87,16 @@ describe('Create Project From Database Quickpick', () => {
7887
// user chooses to cancel when prompted to enter project name
7988
inputBoxStub.onSecondCall().resolves(undefined);
8089

81-
const model = await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo);
90+
await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo, createProjectFromDatabaseCallbackSpy);
8291

83-
//verify showInputBox exited with undefined, since project name wasn't selected (resolved to undefined)
84-
should.equal(model, undefined);
92+
//verify create project callback was not called, since project name wasn't selected (resolved to undefined)
93+
should(createProjectFromDatabaseCallbackSpy.notCalled).be.true('createProjectFromDatabaseCallback should not have been called');
8594
});
8695

8796
it('Should exit when project location is not selected', async function (): Promise<void> {
97+
//createProjectFromDatabaseQuickpick spy to verify test
98+
const createProjectFromDatabaseCallbackSpy = sinon.stub().resolves();
99+
88100
//user chooses connection and database
89101
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'connect').resolves('testConnectionURI');
90102
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'listDatabases').withArgs(sinon.match.any).resolves(dbList);
@@ -94,13 +106,16 @@ describe('Create Project From Database Quickpick', () => {
94106
//user chooses to exit
95107
quickPickStub.onSecondCall().resolves(undefined);
96108

97-
const model = await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo);
109+
await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo, createProjectFromDatabaseCallbackSpy);
98110

99-
//verify showQuickPick exited with undefined, since project location wasn't selected (resolved to undefined)
100-
should.equal(model, undefined);
111+
//verify create project callback was not called, since project location wasn't selected (resolved to undefined)
112+
should(createProjectFromDatabaseCallbackSpy.notCalled).be.true('createProjectFromDatabaseCallback should not have been called');
101113
});
102114

103115
it('Should exit when project location is not selected (test repeatedness for project location)', async function (): Promise<void> {
116+
//createProjectFromDatabaseQuickpick spy to verify test
117+
const createProjectFromDatabaseCallbackSpy = sinon.stub().resolves();
118+
104119
//user chooses connection and database
105120
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'connect').resolves('testConnectionURI');
106121
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'listDatabases').withArgs(sinon.match.any).resolves(dbList);
@@ -122,13 +137,16 @@ describe('Create Project From Database Quickpick', () => {
122137
//user chooses to exit
123138
quickPickStub.onCall(4).resolves(undefined);
124139

125-
const model = await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo);
140+
await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo, createProjectFromDatabaseCallbackSpy);
126141

127-
//verify showQuickPick exited with undefined, since project location wasn't selected (resolved to undefined)
128-
should.equal(model, undefined);
142+
//verify create project callback was not called, since project location wasn't selected (resolved to undefined)
143+
should(createProjectFromDatabaseCallbackSpy.notCalled).be.true('createProjectFromDatabaseCallback should not have been called');
129144
});
130145

131146
it('Should exit when folder structure is not selected and folder is selected through browsing (test repeatedness for project location)', async function (): Promise<void> {
147+
//createProjectFromDatabaseQuickpick spy to verify test
148+
const createProjectFromDatabaseCallbackSpy = sinon.stub().resolves();
149+
132150
//user chooses connection and database
133151
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'connect').resolves('testConnectionURI');
134152
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'listDatabases').withArgs(sinon.match.any).resolves(dbList);
@@ -146,13 +164,16 @@ describe('Create Project From Database Quickpick', () => {
146164
//user chooses to exit when prompted for folder structure
147165
quickPickStub.onCall(3).resolves(undefined);
148166

149-
const model = await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo);
167+
await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo, createProjectFromDatabaseCallbackSpy);
150168

151-
//verify showQuickPick exited with undefined, since folder structure wasn't selected (resolved to undefined)
152-
should.equal(model, undefined);
169+
//verify create project callback was not called, since folder structure wasn't selected (resolved to undefined)
170+
should(createProjectFromDatabaseCallbackSpy.notCalled).be.true('createProjectFromDatabaseCallback should not have been called');
153171
});
154172

155173
it('Should exit when folder structure is not selected and existing folder/file location is selected', async function (): Promise<void> {
174+
//createProjectFromDatabaseQuickpick spy to verify test
175+
const createProjectFromDatabaseCallbackSpy = sinon.stub().resolves();
176+
156177
//create folder and project file
157178
const projectFileName = 'TestProject';
158179
const testProjectFilePath = await generateTestFolderPath(this.test);
@@ -172,15 +193,18 @@ describe('Create Project From Database Quickpick', () => {
172193
//user chooses to exit when prompted for folder structure
173194
quickPickStub.onCall(3).resolves(undefined);
174195

175-
const model = await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo);
196+
await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo, createProjectFromDatabaseCallbackSpy);
176197

177198
await deleteGeneratedTestFolder();
178199

179-
//verify showQuickPick exited with undefined, since folder structure wasn't selected (resolved to undefined)
180-
should.equal(model, undefined);
200+
//verify create project callback was not called, since folder structure wasn't selected (resolved to undefined)
201+
should(createProjectFromDatabaseCallbackSpy.notCalled).be.true('createProjectFromDatabaseCallback should not have been called');
181202
});
182203

183204
it('Should exit when include permissions is not selected', async function (): Promise<void> {
205+
//createProjectFromDatabaseQuickpick spy to verify test
206+
const createProjectFromDatabaseCallbackSpy = sinon.stub().resolves();
207+
184208
//user chooses connection and database
185209
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'connect').resolves('testConnectionURI');
186210
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'listDatabases').withArgs(sinon.match.any).resolves(dbList);
@@ -194,13 +218,16 @@ describe('Create Project From Database Quickpick', () => {
194218
//user chooses to exit when prompted for include permissions
195219
quickPickStub.onCall(3).resolves(undefined);
196220

197-
const model = await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo);
221+
await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo, createProjectFromDatabaseCallbackSpy);
198222

199-
//verify showQuickPick exited with undefined, since include permissions wasn't selected (resolved to undefined)
200-
should.equal(model, undefined);
223+
//verify create project callback was not called, since include permissions wasn't selected (resolved to undefined)
224+
should(createProjectFromDatabaseCallbackSpy.notCalled).be.true('createProjectFromDatabaseCallback should not have been called');
201225
});
202226

203227
it('Should exit when sdk style project is not selected', async function (): Promise<void> {
228+
//createProjectFromDatabaseQuickpick spy to verify test
229+
const createProjectFromDatabaseCallbackSpy = sinon.stub().resolves();
230+
204231
//user chooses connection and database
205232
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'connect').resolves('testConnectionURI');
206233
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'listDatabases').withArgs(sinon.match.any).resolves(dbList);
@@ -216,13 +243,16 @@ describe('Create Project From Database Quickpick', () => {
216243
//user chooses to exit when prompted for sdk style project
217244
sinon.stub(quickpickHelper, 'getSDKStyleProjectInfo').resolves(undefined);
218245

219-
const model = await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo);
246+
await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo, createProjectFromDatabaseCallbackSpy);
220247

221-
//verify showQuickPick exited with undefined, since sdk style project wasn't selected (resolved to undefined)
222-
should.equal(model, undefined);
248+
//verify create project callback was not called, since sdk style project wasn't selected (resolved to undefined)
249+
should(createProjectFromDatabaseCallbackSpy.notCalled).be.true('createProjectFromDatabaseCallback should not have been called');
223250
});
224251

225-
it('Should create correct import data model when all the information is provided', async function (): Promise<void> {
252+
it('Should create project when all the information is provided', async function (): Promise<void> {
253+
//createProjectFromDatabaseQuickpick spy to verify test
254+
const createProjectFromDatabaseCallbackSpy = sinon.stub().resolves();
255+
226256
//user chooses connection and database
227257
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'connect').resolves('testConnectionURI');
228258
sinon.stub(testUtils.vscodeMssqlIExtension.object, 'listDatabases').withArgs(sinon.match.any).resolves(dbList);
@@ -238,7 +268,7 @@ describe('Create Project From Database Quickpick', () => {
238268
//user chooses sdk style project to be true
239269
sinon.stub(quickpickHelper, 'getSDKStyleProjectInfo').resolves(true);
240270

241-
const model = await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo);
271+
await createProjectFromDatabaseQuickpick.createNewProjectFromDatabaseWithQuickpick(mockConnectionInfo, createProjectFromDatabaseCallbackSpy);
242272

243273
const expectedImportDataModel: ImportDataModel = {
244274
connectionUri: 'testConnectionURI',
@@ -251,7 +281,8 @@ describe('Create Project From Database Quickpick', () => {
251281
includePermissions: false
252282
};
253283

254-
//verify the model is correctly generated
255-
should(model!).deepEqual(expectedImportDataModel);
284+
//verify create project callback was called with the correct model
285+
should(createProjectFromDatabaseCallbackSpy.calledOnce).be.true('createProjectFromDatabaseCallback should have been called');
286+
should(createProjectFromDatabaseCallbackSpy.calledWithMatch(expectedImportDataModel)).be.true('createProjectFromDatabaseCallback should have been called with the correct model');
256287
});
257288
});

extensions/sql-database-projects/src/tools/buildHelper.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class BuildHelper {
5656

5757
public async ensureDacFxDllsPresence(outputChannel: vscode.OutputChannel): Promise<boolean> {
5858
const sdkName = 'Microsoft.Build.Sql';
59-
const microsoftBuildSqlDefaultVersion = '0.2.0-preview'; // default version of Microsoft.Build.Sql nuget to use for building legacy style projects, update in README when updating this
59+
const microsoftBuildSqlDefaultVersion = '0.2.5-preview'; // default version of Microsoft.Build.Sql nuget to use for building legacy style projects, update in README when updating this
6060

6161
const dacFxBuildFiles: string[] = [
6262
'Microsoft.Data.SqlClient.dll',

0 commit comments

Comments
 (0)