Skip to content

Commit ebc7d6c

Browse files
committed
Refactor site management and update tests
- πŸ”§ Simplified telemetry imports in ActionsHubCommandHandlers - πŸ“ Updated uploadCodeSite command to properly quote site name - βœ… Added isCodeSite property to various website details in tests - πŸ§ͺ Enhanced test cases for EnvironmentGroupTreeItem and InactiveGroupTreeItem - πŸ› οΈ Improved mock data for PPAPIService tests -Priyanshu
1 parent d7caf49 commit ebc7d6c

File tree

8 files changed

+277
-174
lines changed

8 files changed

+277
-174
lines changed

β€Žsrc/client/power-pages/actions-hub/ActionsHubCommandHandlers.tsβ€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import { isEdmEnvironment } from '../../../common/copilot/dataverseMetadata';
2929
import { IWebsiteInfo } from './models/IWebsiteInfo';
3030
import moment from 'moment';
3131
import { SiteVisibility } from './models/SiteVisibility';
32-
import { getBaseEventInfo, traceError, traceInfo } from './TelemetryHelper';
32+
import { traceError, traceInfo } from './TelemetryHelper';
3333

3434
const sortByCreatedOn = <T extends { createdOn?: string | null }>(item1: T, item2: T): number => {
3535
const date1 = new Date(item1.createdOn || '').valueOf(); //NaN if createdOn is null or undefined
@@ -366,7 +366,7 @@ const uploadCodeSite = async (siteInfo: IWebsiteInfo, uploadPath: string) => {
366366
}
367367

368368
traceInfo(Constants.EventNames.ACTIONS_HUB_UPLOAD_OTHER_SITE_PAC_TRIGGERED, { methodName: uploadCodeSite.name, siteIdToUpload: siteInfo.websiteId });
369-
PacTerminal.getTerminal().sendText(`pac pages upload-code-site --rootPath "${uploadPath}" --compiledPath "${compiledPath}" --siteName ${siteInfo.name}`);
369+
PacTerminal.getTerminal().sendText(`pac pages upload-code-site --rootPath "${uploadPath}" --compiledPath "${compiledPath}" --siteName "${siteInfo.name}"`);
370370
} catch (error) {
371371
traceError(Constants.EventNames.ACTIONS_HUB_UPLOAD_CODE_SITE_FAILED, error as Error, { methodName: uploadCodeSite.name, siteIdToUpload: siteInfo.websiteId });
372372
await vscode.window.showErrorMessage(vscode.l10n.t(Constants.Strings.UPLOAD_CODE_SITE_FAILED));

β€Žsrc/client/test/Integration/WebsiteUtil.test.tsβ€Ž

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ describe("WebsiteUtil", () => {
7777
siteManagementUrl: 'https://management.url/1',
7878
siteVisibility: undefined,
7979
creator: 'Test User',
80-
createdOn: '2025-03-01T12:00:00Z'
80+
createdOn: '2025-03-01T12:00:00Z',
81+
isCodeSite: false
8182
},
8283
{
8384
name: 'Test Website 2',
@@ -90,7 +91,8 @@ describe("WebsiteUtil", () => {
9091
siteManagementUrl: 'https://management.url/2',
9192
siteVisibility: undefined,
9293
creator: 'Another User',
93-
createdOn: '2025-03-15T12:00:00Z'
94+
createdOn: '2025-03-15T12:00:00Z',
95+
isCodeSite: false
9496
}
9597
];
9698

@@ -190,6 +192,16 @@ describe("WebsiteUtil", () => {
190192
}
191193
];
192194

195+
const mockPowerPagesSiteSettings = [
196+
{
197+
mspp_name: "CodeSite/Enabled",
198+
mspp_value: "false",
199+
_mspp_websiteid_value: "pp-id-1",
200+
statecode: 0,
201+
statuscode: 1
202+
}
203+
];
204+
193205
it("should return combined website details from ADX and Power Pages", async () => {
194206
// Arrange
195207
// Stub the dataverseAuthentication function directly
@@ -212,6 +224,12 @@ describe("WebsiteUtil", () => {
212224
json: () => Promise.resolve({ value: mockAppModules })
213225
} as Response);
214226

227+
// Fourth call - Power Pages site settings
228+
fetchStub.onCall(3).resolves({
229+
ok: true,
230+
json: () => Promise.resolve({ value: mockPowerPagesSiteSettings })
231+
} as Response);
232+
215233
// Act
216234
const result = await getAllWebsites(mockOrgDetails);
217235

@@ -225,13 +243,16 @@ describe("WebsiteUtil", () => {
225243
expect(adxWebsite?.name).to.equal("ADX Website 1");
226244
expect(adxWebsite?.dataModel).to.equal(WebsiteDataModel.Standard);
227245
expect(adxWebsite?.siteManagementUrl).to.include("portal-app-id");
246+
expect(adxWebsite?.websiteUrl).to.equal("https://adx1.powerapps.com");
247+
expect(adxWebsite?.isCodeSite).to.be.false;
228248

229249
// Verify Power Pages website details
230250
const ppWebsite = result.find(w => w.websiteRecordId === "pp-id-1");
231251
expect(ppWebsite).to.exist;
232252
expect(ppWebsite?.name).to.equal("Power Pages Site 1");
233253
expect(ppWebsite?.dataModel).to.equal(WebsiteDataModel.Enhanced);
234254
expect(ppWebsite?.siteManagementUrl).to.include("pp-app-id");
255+
expect(ppWebsite?.isCodeSite).to.be.false;
235256
});
236257

237258
it("should handle errors when fetching ADX website records gracefully", async () => {
@@ -258,6 +279,12 @@ describe("WebsiteUtil", () => {
258279
json: () => Promise.resolve({ value: mockAppModules })
259280
} as Response);
260281

282+
// Fourth call - Power Pages site settings
283+
fetchStub.onCall(3).resolves({
284+
ok: true,
285+
json: () => Promise.resolve({ value: mockPowerPagesSiteSettings })
286+
} as Response);
287+
261288
// Act
262289
const result = await getAllWebsites(mockOrgDetails);
263290

@@ -292,6 +319,12 @@ describe("WebsiteUtil", () => {
292319
json: () => Promise.resolve({ value: mockAppModules })
293320
} as Response);
294321

322+
// Fourth call - Power Pages site settings
323+
fetchStub.onCall(3).resolves({
324+
ok: true,
325+
json: () => Promise.resolve({ value: mockPowerPagesSiteSettings })
326+
} as Response);
327+
295328
// Act
296329
const result = await getAllWebsites(mockOrgDetails);
297330

@@ -326,6 +359,12 @@ describe("WebsiteUtil", () => {
326359
status: 500
327360
} as Response);
328361

362+
// Fourth call - Power Pages site settings
363+
fetchStub.onCall(3).resolves({
364+
ok: true,
365+
json: () => Promise.resolve({ value: mockPowerPagesSiteSettings })
366+
} as Response);
367+
329368
// Act
330369
const result = await getAllWebsites(mockOrgDetails);
331370

@@ -409,6 +448,12 @@ describe("WebsiteUtil", () => {
409448
json: () => Promise.resolve({ value: [] })
410449
} as Response);
411450

451+
// Fourth call - Power Pages site settings
452+
fetchStub.onCall(3).resolves({
453+
ok: true,
454+
json: () => Promise.resolve({ value: [] })
455+
} as Response);
456+
412457
// Act
413458
const result = await getAllWebsites(mockOrgDetails);
414459

β€Žsrc/client/test/Integration/power-pages/actions-hub/ActionsHubCommandHandlers.test.tsβ€Ž

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,8 @@ describe('ActionsHubCommandHandlers', () => {
626626
siteVisibility: SiteVisibility.Public,
627627
siteManagementUrl: 'https://test-site-management.com',
628628
createdOn: "2025-03-20",
629-
creator: "Test Creator"
629+
creator: "Test Creator",
630+
isCodeSite: false
630631
};
631632
});
632633

@@ -699,7 +700,8 @@ describe('ActionsHubCommandHandlers', () => {
699700
dataModel: WebsiteDataModel.Enhanced,
700701
websiteUrl: 'https://active-site-1.com',
701702
id: 'active-site-1',
702-
siteVisibility: "public"
703+
siteVisibility: "public",
704+
isCodeSite: false
703705
}
704706
] as IWebsiteDetails[];
705707
const inactiveSites = [
@@ -710,7 +712,8 @@ describe('ActionsHubCommandHandlers', () => {
710712
websiteUrl: 'https://inactive-site-1.com',
711713
id: 'inactive-site-1',
712714
siteVisibility: 'private',
713-
siteManagementUrl: "https://inactive-site-1-management.com"
715+
siteManagementUrl: "https://inactive-site-1-management.com",
716+
isCodeSite: false
714717
}
715718
] as IWebsiteDetails[];
716719

@@ -724,7 +727,7 @@ describe('ActionsHubCommandHandlers', () => {
724727

725728
const response = await fetchWebsites();
726729

727-
expect(response.activeSites).to.deep.equal([...activeSites.map(site => ({ ...site, siteManagementUrl: "https://portalmanagement.com", createdOn: "2025-03-20", creator: "Test Creator" }))]);
730+
expect(response.activeSites).to.deep.equal([...activeSites.map(site => ({ ...site, isCodeSite: false, siteManagementUrl: "https://portalmanagement.com", createdOn: "2025-03-20", creator: "Test Creator" }))]);
728731
expect(response.inactiveSites).to.deep.equal(inactiveSites);
729732
});
730733
});
@@ -869,7 +872,8 @@ describe('ActionsHubCommandHandlers', () => {
869872
siteVisibility: SiteVisibility.Public,
870873
siteManagementUrl: "https://inactive-site-1-management.com",
871874
createdOn: "2025-03-20",
872-
creator: "Test Creator"
875+
creator: "Test Creator",
876+
isCodeSite: false
873877
});
874878
mockShowInformationMessage.resolves(Constants.Strings.YES);
875879

@@ -892,7 +896,8 @@ describe('ActionsHubCommandHandlers', () => {
892896
siteVisibility: SiteVisibility.Public,
893897
siteManagementUrl: "https://inactive-site-1-management.com",
894898
createdOn: "2025-03-20",
895-
creator: "Test Creator"
899+
creator: "Test Creator",
900+
isCodeSite: false
896901
});
897902
mockShowInformationMessage.resolves(undefined);
898903

@@ -913,7 +918,8 @@ describe('ActionsHubCommandHandlers', () => {
913918
siteVisibility: SiteVisibility.Private,
914919
siteManagementUrl: "https://inactive-site-1-management.com",
915920
createdOn: "2025-03-20",
916-
creator: "Test Creator"
921+
creator: "Test Creator",
922+
isCodeSite: false
917923
});
918924

919925
await uploadSite(mockSiteTreeItem, "");
@@ -922,6 +928,34 @@ describe('ActionsHubCommandHandlers', () => {
922928
expect(mockSendText.calledOnceWith(`pac pages upload --path "test-path" --modelVersion "1"`)).to.be.true;
923929
});
924930

931+
it('should upload code site', async () => {
932+
mockSiteTreeItem = new SiteTreeItem({
933+
name: "Test Site",
934+
websiteId: "test-id",
935+
dataModelVersion: 1,
936+
status: WebsiteStatus.Active,
937+
websiteUrl: 'https://test-site.com',
938+
isCurrent: false,
939+
siteVisibility: SiteVisibility.Private,
940+
siteManagementUrl: "https://inactive-site-1-management.com",
941+
createdOn: "2025-03-20",
942+
creator: "Test Creator",
943+
isCodeSite: true
944+
});
945+
946+
const mockQuickPick = sinon.stub(vscode.window, 'showQuickPick');
947+
mockQuickPick.resolves({ label: "Browse..." });
948+
949+
const mockShowOpenDialog = sinon.stub(vscode.window, 'showOpenDialog');
950+
mockShowOpenDialog.resolves([{ fsPath: "D:/foo" } as unknown as vscode.Uri]);
951+
952+
await uploadSite(mockSiteTreeItem, "");
953+
954+
expect(mockQuickPick.calledOnce, "showQuickPick was not called").to.be.true;
955+
expect(mockShowOpenDialog.calledOnce, "showOpenDialog was not called").to.be.true;
956+
expect(mockSendText.firstCall.args[0]).to.equal(`pac pages upload-code-site --rootPath "test-path" --compiledPath "D:/foo" --siteName "Test Site"`);
957+
});
958+
925959
it('should handle case sensitivity for public site visibility', async () => {
926960
mockSiteTreeItem = new SiteTreeItem({
927961
name: "Test Site",
@@ -933,7 +967,8 @@ describe('ActionsHubCommandHandlers', () => {
933967
siteVisibility: SiteVisibility.Public,
934968
siteManagementUrl: "https://inactive-site-1-management.com",
935969
createdOn: "2025-03-20",
936-
creator: "Test Creator"
970+
creator: "Test Creator",
971+
isCodeSite: false
937972
});
938973
mockShowInformationMessage.resolves(Constants.Strings.YES);
939974

@@ -954,7 +989,8 @@ describe('ActionsHubCommandHandlers', () => {
954989
siteVisibility: SiteVisibility.Private,
955990
siteManagementUrl: "https://inactive-site-1-management.com",
956991
createdOn: "2025-03-20",
957-
creator: "Test Creator"
992+
creator: "Test Creator",
993+
isCodeSite: false
958994
});
959995

960996
mockSendText.throws(new Error('Upload failed'));

β€Žsrc/client/test/Integration/power-pages/actions-hub/tree-items/ActiveGroupTreeItem.test.tsβ€Ž

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ describe('ActiveGroupTreeItem', () => {
7474
siteVisibility: SiteVisibility.Public,
7575
siteManagementUrl: "http://site1.com/manage",
7676
createdOn: "2025-03-20",
77-
creator: "Test Creator"
77+
creator: "Test Creator",
78+
isCodeSite: true
7879
},
7980
{
8081
websiteRecordId: "2",
@@ -87,7 +88,8 @@ describe('ActiveGroupTreeItem', () => {
8788
siteVisibility: SiteVisibility.Private,
8889
siteManagementUrl: "http://site2.com/manage",
8990
createdOn: "2025-03-20",
90-
creator: "Test Creator"
91+
creator: "Test Creator",
92+
isCodeSite: false
9193
}
9294
];
9395

@@ -105,7 +107,8 @@ describe('ActiveGroupTreeItem', () => {
105107
siteVisibility: SiteVisibility.Public,
106108
siteManagementUrl: "http://site1.com/manage",
107109
createdOn: "2025-03-20",
108-
creator: "Test Creator"
110+
creator: "Test Creator",
111+
isCodeSite: true
109112
});
110113

111114
const site2 = children[1] as SiteTreeItem;
@@ -119,7 +122,8 @@ describe('ActiveGroupTreeItem', () => {
119122
siteVisibility: SiteVisibility.Private,
120123
siteManagementUrl: "http://site2.com/manage",
121124
createdOn: "2025-03-20",
122-
creator: "Test Creator"
125+
creator: "Test Creator",
126+
isCodeSite: false
123127
});
124128
});
125129

@@ -137,7 +141,8 @@ describe('ActiveGroupTreeItem', () => {
137141
siteVisibility: SiteVisibility.Public,
138142
siteManagementUrl: "http://site1.com/manage",
139143
createdOn: "2025-03-20",
140-
creator: "Test Creator"
144+
creator: "Test Creator",
145+
isCodeSite: true
141146
}
142147
];
143148

@@ -155,7 +160,8 @@ describe('ActiveGroupTreeItem', () => {
155160
siteVisibility: "public",
156161
siteManagementUrl: "http://site1.com/manage",
157162
createdOn: "2025-03-20",
158-
creator: "Test Creator"
163+
creator: "Test Creator",
164+
isCodeSite: true
159165
});
160166
});
161167

@@ -174,7 +180,8 @@ describe('ActiveGroupTreeItem', () => {
174180
siteVisibility: SiteVisibility.Public,
175181
siteManagementUrl: "http://site1.com/manage",
176182
createdOn: "2025-03-20",
177-
creator: "Test Creator"
183+
creator: "Test Creator",
184+
isCodeSite: true
178185
}
179186
];
180187

@@ -192,7 +199,8 @@ describe('ActiveGroupTreeItem', () => {
192199
siteVisibility: SiteVisibility.Public,
193200
siteManagementUrl: "http://site1.com/manage",
194201
createdOn: "2025-03-20",
195-
creator: "Test Creator"
202+
creator: "Test Creator",
203+
isCodeSite: true
196204
});
197205
});
198206
});

0 commit comments

Comments
Β (0)