Skip to content

Commit

Permalink
Check Dataverse Org URL for validity (#1001)
Browse files Browse the repository at this point in the history
* Check Dataverse Org URL fro validity

* Update test cases
  • Loading branch information
tyaginidhi authored Jul 25, 2024
1 parent 1dcf63c commit 726205d
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ export enum webExtensionTelemetryEventNames {
WEB_EXTENSION_MULTI_FILE_FEATURE_FLAG_ENABLED = "WebExtensionMultiFileFeatureFlagEnabled",
WEB_EXTENSION_MULTI_FILE_FEATURE_FLAG_DISABLED = "WebExtensionMultiFileFeatureFlagDisabled",
WEB_EXTENSION_MULTI_FILE_MANDATORY_PARAMETERS_MISSING = "WebExtensionMultiFileMandatoryParametersMissing",
WEB_EXTENSION_MULTI_FILE_INVALID_DATAVERSE_URL = "WebExtensionMultiFileInvalidDataverseUrl",
WEB_EXTENSION_MULTI_FILE_INVALID_WEBSITE_PREVIEW_URL = "WebExtensionMultiFileInvalidWebsitePreviewUrl",
WEB_EXTENSION_CO_PRESENCE_FEATURE_FLAG_DISABLED = "WebExtensionCoPresenceFeatureFlagDisabled",
WEB_EXTENSION_CO_PRESENCE_FEATURE_FLAG_ENABLED = "WebExtensionCoPresenceFeatureFlagEnabled",
WEB_EXTENSION_FILES_LOAD_SUCCESS = "WebExtensionFilesLoadSuccess",
Expand Down
22 changes: 20 additions & 2 deletions src/web/client/common/errorHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,13 @@ export function checkMandatoryQueryParameters(
const dataSource = queryParamsMap?.get(queryParameters.DATA_SOURCE);
const schemaName = queryParamsMap?.get(schemaKey.SCHEMA_VERSION);
const websiteId = queryParamsMap?.get(queryParameters.WEBSITE_ID);
if (orgURL && dataSource && schemaName && websiteId) {
if (orgURL && dataSource && schemaName && websiteId && isDynamicsCRMUrl(orgURL)) {
return true;
} else {
WebExtensionContext.telemetry.sendErrorTelemetry(
webExtensionTelemetryEventNames.WEB_EXTENSION_MANDATORY_QUERY_PARAMETERS_MISSING,
checkMandatoryQueryParameters.name,
`${orgURL ? `orgURL, ` : ``}dataSource:${dataSource}, schemaName:${schemaName} ,websiteId:${websiteId}`
`orgURL:${orgURL ? orgURL : ``}, dataSource:${dataSource}, schemaName:${schemaName} ,websiteId:${websiteId}`
);
showErrorDialog(
vscode.l10n.t("There was a problem opening the workspace"),
Expand Down Expand Up @@ -132,3 +132,21 @@ export function checkMandatoryMultifileParameters(
return false;
}
}

// Query Param value checks
export function isDynamicsCRMUrl(url: string) {
// Updated pattern to match both conditions: with and without digits after "crm"
// We are in public cloud currently - ignoring the gov cloud for now
const pattern = /^https?:\/\/[^.]+\.crm(\d{1,2})?\.dynamics\.com/;
const result = pattern.test(url);

if (!result) {
WebExtensionContext.telemetry.sendErrorTelemetry(
webExtensionTelemetryEventNames.WEB_EXTENSION_MULTI_FILE_INVALID_DATAVERSE_URL,
isDynamicsCRMUrl.name,
`orgURL:${url}`
);
}

return result;
}
81 changes: 66 additions & 15 deletions src/web/client/test/integration/errorHandler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
checkMandatoryParameters,
checkMandatoryPathParameters,
checkMandatoryQueryParameters,
isDynamicsCRMUrl,
} from "../../common/errorHandler";
import {
showErrorDialog
Expand Down Expand Up @@ -116,7 +117,7 @@ describe("errorHandler", () => {
//Act
const appName = "portal";
const queryParamsMap = new Map<string, string>([
[queryParameters.ORG_URL, "url"],
[queryParameters.ORG_URL, "https://org.crm4.dynamics.com"],
[queryParameters.DATA_SOURCE, "SQL"],
[schemaKey.SCHEMA_VERSION, "1.0.0"],
[
Expand All @@ -140,7 +141,7 @@ describe("errorHandler", () => {
const _mockShowErrorMessage = stub(vscode.window, "showErrorMessage");
const appName = "por";
const queryParamsMap = new Map<string, string>([
[queryParameters.ORG_URL, "url"],
[queryParameters.ORG_URL, "https://org.crm.dynamics.com"],
[queryParameters.DATA_SOURCE, "SQL"],
[schemaKey.SCHEMA_VERSION, "1.0.0"],
[
Expand Down Expand Up @@ -186,7 +187,7 @@ describe("errorHandler", () => {
//Act
const appName = "portal";
const queryParamsMap = new Map<string, string>([
[queryParameters.ORG_URL, "orgUrl"],
[queryParameters.ORG_URL, "https://org.crm2.dynamics.com"],
[queryParameters.DATA_SOURCE, ""],
[schemaKey.SCHEMA_VERSION, "1.0.0"],
[
Expand All @@ -209,7 +210,7 @@ describe("errorHandler", () => {
//Act
const appName = "portal";
const queryParamsMap = new Map<string, string>([
[queryParameters.ORG_URL, "orgUrl"],
[queryParameters.ORG_URL, "https://org.crm11.dynamics.com"],
[queryParameters.DATA_SOURCE, "SQL"],
[schemaKey.SCHEMA_VERSION, ""],
[
Expand All @@ -232,7 +233,7 @@ describe("errorHandler", () => {
//Act
const appName = "portal";
const queryParamsMap = new Map<string, string>([
[queryParameters.ORG_URL, "orgUrl"],
[queryParameters.ORG_URL, "https://org.crm20.dynamics.com"],
[queryParameters.DATA_SOURCE, "SQL"],
[schemaKey.SCHEMA_VERSION, "1.0.0.0"],
[queryParameters.WEBSITE_ID, ""],
Expand All @@ -257,7 +258,7 @@ describe("errorHandler", () => {
expect(result).true;
});

it("checkMandatoryPathParameters_whenPppNameIsDifferentFromPortal_shouldReturnFalse", () => {
it("checkMandatoryPathParameters_whenPpNameIsDifferentFromPortal_shouldReturnFalse", () => {
//Act
const _mockShowErrorMessage = stub(vscode.window, "showErrorMessage");
const appName = "por";
Expand All @@ -275,7 +276,7 @@ describe("errorHandler", () => {
//Act
const appName = "portal";
const queryParamsMap = new Map<string, string>([
[queryParameters.ORG_URL, "orgUrl"],
[queryParameters.ORG_URL, "https://org.crm11.dynamics.com"],
[queryParameters.DATA_SOURCE, "SQL"],
[schemaKey.SCHEMA_VERSION, "1.0.0.0"],
[
Expand Down Expand Up @@ -325,7 +326,7 @@ describe("errorHandler", () => {
_mockSendErrorTelemetry,
webExtensionTelemetryEventNames.WEB_EXTENSION_MANDATORY_QUERY_PARAMETERS_MISSING,
checkMandatoryQueryParameters.name,
`dataSource:SQL, schemaName:1.0.0.0 ,websiteId:ed9a6c19-5ab6-4f67-8c35-2423cff958c4`
`orgURL:, dataSource:SQL, schemaName:1.0.0.0 ,websiteId:ed9a6c19-5ab6-4f67-8c35-2423cff958c4`
);
});

Expand All @@ -338,7 +339,7 @@ describe("errorHandler", () => {
);
const appName = "portal";
const queryParamsMap = new Map<string, string>([
[queryParameters.ORG_URL, "ORG_URL"],
[queryParameters.ORG_URL, "https://org.crm14.dynamics.com"],
[queryParameters.DATA_SOURCE, ""],
[schemaKey.SCHEMA_VERSION, "1.0.0.0"],
[
Expand All @@ -364,7 +365,7 @@ describe("errorHandler", () => {
_mockSendErrorTelemetry,
webExtensionTelemetryEventNames.WEB_EXTENSION_MANDATORY_QUERY_PARAMETERS_MISSING,
checkMandatoryQueryParameters.name,
`orgURL, dataSource:, schemaName:1.0.0.0 ,websiteId:ed9a6c19-5ab6-4f67-8c35-2423cff958c4`
`orgURL:https://org.crm14.dynamics.com, dataSource:, schemaName:1.0.0.0 ,websiteId:ed9a6c19-5ab6-4f67-8c35-2423cff958c4`
);
});

Expand All @@ -377,7 +378,7 @@ describe("errorHandler", () => {
);
const appName = "portal";
const queryParamsMap = new Map<string, string>([
[queryParameters.ORG_URL, "ORG_URL"],
[queryParameters.ORG_URL, "https://org.crm19.dynamics.com"],
[queryParameters.DATA_SOURCE, "SQL"],
[schemaKey.SCHEMA_VERSION, ""],
[
Expand All @@ -403,7 +404,7 @@ describe("errorHandler", () => {
_mockSendErrorTelemetry,
webExtensionTelemetryEventNames.WEB_EXTENSION_MANDATORY_QUERY_PARAMETERS_MISSING,
checkMandatoryQueryParameters.name,
`orgURL, dataSource:SQL, schemaName: ,websiteId:ed9a6c19-5ab6-4f67-8c35-2423cff958c4`
`orgURL:https://org.crm19.dynamics.com, dataSource:SQL, schemaName: ,websiteId:ed9a6c19-5ab6-4f67-8c35-2423cff958c4`
);
});

Expand All @@ -416,7 +417,7 @@ describe("errorHandler", () => {
);
const appName = "portal";
const queryParamsMap = new Map<string, string>([
[queryParameters.ORG_URL, "ORG_URL"],
[queryParameters.ORG_URL, "https://org.crm4.dynamics.com"],
[queryParameters.DATA_SOURCE, "SQL"],
[schemaKey.SCHEMA_VERSION, "1.0.0.0"],
[queryParameters.WEBSITE_ID, ""],
Expand All @@ -439,7 +440,7 @@ describe("errorHandler", () => {
_mockSendErrorTelemetry,
webExtensionTelemetryEventNames.WEB_EXTENSION_MANDATORY_QUERY_PARAMETERS_MISSING,
checkMandatoryQueryParameters.name,
`orgURL, dataSource:SQL, schemaName:1.0.0.0 ,websiteId:`
`orgURL:https://org.crm4.dynamics.com, dataSource:SQL, schemaName:1.0.0.0 ,websiteId:`
);
});

Expand All @@ -448,7 +449,7 @@ describe("errorHandler", () => {
const _mockShowErrorMessage = spy(vscode.window, "showErrorMessage");
const appName = "por";
const queryParamsMap = new Map<string, string>([
[queryParameters.ORG_URL, "ORG_URL"],
[queryParameters.ORG_URL, "https://org.crm4.dynamics.com"],
[queryParameters.DATA_SOURCE, "SQL"],
[schemaKey.SCHEMA_VERSION, "1.0.0.0"],
[queryParameters.WEBSITE_ID, "12345"],
Expand All @@ -466,4 +467,54 @@ describe("errorHandler", () => {
detailMessage
);
});

it("checkMandatoryQueryParameters_whenOrgUrlIsInvalid_shouldReturnFalse", () => {
//Act
const _mockShowErrorMessage = spy(vscode.window, "showErrorMessage");
const _mockSendErrorTelemetry = spy(
WebExtensionContext.telemetry,
"sendErrorTelemetry"
);

const appName = "portal";
const queryParamsMap = new Map<string, string>([
[queryParameters.ORG_URL, "https://org.dynamics.com"],
[queryParameters.DATA_SOURCE, "SQL"],
[schemaKey.SCHEMA_VERSION, "1.0.0.0"],
[
queryParameters.WEBSITE_ID,
"ed9a6c19-5ab6-4f67-8c35-2423cff958c4",
],
]);
//Action
const result = checkMandatoryQueryParameters(appName, queryParamsMap);
//Assert
expect(result).false;
const detailMessage = vscode.l10n.t("Check the URL and verify the parameters are correct");

const errorString = vscode.l10n.t("There was a problem opening the workspace");
const options = { detail: detailMessage, modal: true };

assert.calledOnceWithExactly(
_mockShowErrorMessage,
errorString,
options
);


const sendErrorTelemetryCalls = _mockSendErrorTelemetry.getCalls();
assert.callCount(_mockSendErrorTelemetry, 2);
assert.calledWithMatch(
sendErrorTelemetryCalls[0],
webExtensionTelemetryEventNames.WEB_EXTENSION_MULTI_FILE_INVALID_DATAVERSE_URL,
isDynamicsCRMUrl.name,
`orgURL:https://org.dynamics.com`
);
assert.calledWithMatch(
sendErrorTelemetryCalls[1],
webExtensionTelemetryEventNames.WEB_EXTENSION_MANDATORY_QUERY_PARAMETERS_MISSING,
checkMandatoryQueryParameters.name,
`orgURL:https://org.dynamics.com, dataSource:SQL, schemaName:1.0.0.0 ,websiteId:ed9a6c19-5ab6-4f67-8c35-2423cff958c4`
);
});
});

0 comments on commit 726205d

Please sign in to comment.