@itwin/core-backend 5.8.0-dev.6 → 5.8.0-dev.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -1
- package/lib/cjs/IModelDb.d.ts +8 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +16 -0
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +10 -2
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +8 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +16 -0
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +10 -2
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +21 -12
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +6 -0
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.d.ts.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js +4 -0
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +6 -2
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js +51 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +53 -0
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/standalone/iModelDb.test.d.ts +2 -0
- package/lib/esm/test/standalone/iModelDb.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/iModelDb.test.js +35 -0
- package/lib/esm/test/standalone/iModelDb.test.js.map +1 -0
- package/package.json +14 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ECSqlTestParser.d.ts","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestParser.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IAGd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,2BAA2B,EAAE,OAAO,CAAC;IACrC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC;IAMrC,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAAE,GAAG,GAAG,EAAE,CAAC;IACnD,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAG/B,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,mBAAmB,EAAE,GAAG,CAAC,MAAM,eAAe,CAWzD,CAAC;AA6CH,oBAAY,YAAY;IACtB,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,WAAW,gBAAgB;CAC5B;AAED,oBAAY,iBAAiB;IAC3B,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,OAAO,YAAY;CACpB;
|
|
1
|
+
{"version":3,"file":"ECSqlTestParser.d.ts","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestParser.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IAGd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,2BAA2B,EAAE,OAAO,CAAC;IACrC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC;IAMrC,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,EAAE,GAAG,GAAG,EAAE,CAAC;IACnD,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAG/B,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,mBAAmB,EAAE,GAAG,CAAC,MAAM,eAAe,CAWzD,CAAC;AA6CH,oBAAY,YAAY;IACtB,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,WAAW,gBAAgB;CAC5B;AAED,oBAAY,iBAAiB;IAC3B,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,OAAO,YAAY;CACpB;AAmCD,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAQ7C;AAkBD,qBAAa,sBAAsB;WACnB,KAAK,IAAI,aAAa,EAAE;IAgBtC,OAAO,CAAC,MAAM,CAAC,SAAS;IA+CxB,OAAO,CAAC,MAAM,CAAC,eAAe;IAuD9B,OAAO,CAAC,MAAM,CAAC,UAAU;IAgBzB,OAAO,CAAC,MAAM,CAAC,eAAe;IAgB9B,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAcnC,OAAO,CAAC,MAAM,CAAC,eAAe;IA+B9B,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAqBvC,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAIxC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAS/B,OAAO,CAAC,MAAM,CAAC,WAAW;IAY1B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAmBhC,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAwBzC,OAAO,CAAC,MAAM,CAAC,uDAAuD;CAsBvE"}
|
|
@@ -81,6 +81,10 @@ export var ECDbTestRowFormat;
|
|
|
81
81
|
ECDbTestRowFormat["JsNames"] = "JsNames";
|
|
82
82
|
})(ECDbTestRowFormat || (ECDbTestRowFormat = {}));
|
|
83
83
|
function tableTextToValue(text) {
|
|
84
|
+
// Unescape literal \n sequences to actual newline characters
|
|
85
|
+
text = text.replace(/\\n/g, "\n");
|
|
86
|
+
// Trim leading/trailing whitespaces
|
|
87
|
+
text = text.trim();
|
|
84
88
|
if (text.startsWith("\"") && text.endsWith("\""))
|
|
85
89
|
return text.slice(1, text.length - 1);
|
|
86
90
|
if (text === "null")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ECSqlTestParser.js","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestParser.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport * as path from \"path\";\r\nimport * as fs from \"fs\";\r\nimport { marked, Tokens } from \"marked\";\r\n\r\nexport interface ECDbTestProps {\r\n fileName: string;\r\n title: string;\r\n\r\n // Things from properties:\r\n only?: boolean; // This flag handles the only property to filter tests\r\n skip?: string; // This flag handles the skip property to filter tests\r\n dataset?: string;\r\n mode: ECDbTestMode;\r\n rowFormat: ECDbTestRowFormat;\r\n abbreviateBlobs: boolean;\r\n convertClassIdsToClassNames: boolean;\r\n errorDuringPrepare?: boolean;\r\n indexesToIncludeInResults?: number[]; // We now have the feature to check only certain columns of expected results\r\n // but if the rowFormat is ECSqlIndexes then there is no way to uniquely identify the columns, in that case this flag is used to include certain property indexes\r\n // for checking and ignore the rest, if this flag is not given while the rowFormat is ECSqlIndexes then the expected Results column\r\n // will assume an incremental 0 based indexing by default. This flag serves as a mapping for the actual results while checking with the expected results.\r\n\r\n // TODO: implement, it's currently being parsed but not used\r\n stepStatus?: string;\r\n\r\n // Things from code blocks or tables\r\n sql?: string;\r\n expectedResults?: { [key: string]: any }[] | any[];\r\n columnInfo?: ColumnInfoProps[];\r\n\r\n // Things from lists\r\n binders?: ECDbTestBinderProps[];\r\n}\r\n\r\nexport interface ECDbTestBinderProps {\r\n indexOrName: string;\r\n type: string;\r\n value: string;\r\n}\r\n\r\nexport interface ColumnInfoProps {\r\n name: string;\r\n className?: string;\r\n accessString?: string;\r\n generated?: boolean;\r\n index?: number;\r\n jsonName?: string;\r\n // expected extendedType value should be given when we know that the actual column info extendedType will be a valid non empty string for test to pass.\r\n // This extendedType value is internally used to check both extendType and extendedType values of column metadata.\r\n extendedType?: string;\r\n type?: string; // type is used on ECSqlStatement because it can differ from TypeName\r\n typeName?: string; // typeName is used on ConcurrentQuery\r\n originPropertyName?: string; // only supported for ECSqlStatement\r\n}\r\n\r\nexport const columnInfoPropsKeys: Set<keyof ColumnInfoProps> = new Set([\r\n \"name\",\r\n \"className\",\r\n \"accessString\",\r\n \"generated\",\r\n \"index\",\r\n \"jsonName\",\r\n \"extendedType\",\r\n \"type\",\r\n \"typeName\",\r\n \"originPropertyName\",\r\n]);\r\n\r\n/* interface QueryPropertyMetaData\r\n className: string;\r\n accessString?: string;\r\n generated: boolean;\r\n index: number;\r\n jsonName: string;\r\n name: string;\r\n extendType: string;\r\n typeName: string;\r\n*/\r\n\r\nfunction isColumnInfoProps(obj: any): obj is ColumnInfoProps {\r\n const numberOfKeys = typeof obj === \"object\" ? Object.keys(obj).length : 0;\r\n const isValid = typeof obj === \"object\" &&\r\n typeof obj.name === \"string\" &&\r\n (obj.className === undefined || typeof obj.className === \"string\") &&\r\n (obj.accessString === undefined || typeof obj.accessString === \"string\") &&\r\n (obj.generated === undefined || typeof obj.generated === \"boolean\") &&\r\n (obj.index === undefined || typeof obj.index === \"number\") &&\r\n (obj.jsonName === undefined || typeof obj.jsonName === \"string\") &&\r\n (obj.extendedType === undefined || typeof obj.extendedType === \"string\") &&\r\n (obj.type === undefined || typeof obj.type === \"string\") &&\r\n (obj.typeName === undefined || typeof obj.typeName === \"string\");\r\n\r\n if (!isValid) {\r\n const errors: string[] = [];\r\n if (typeof obj !== \"object\") errors.push(\"Object is not of type 'object'\");\r\n if (numberOfKeys < 1 || numberOfKeys > 7) errors.push(\"Number of keys is not between 1 and 7\");\r\n if (typeof obj.name !== \"string\") errors.push(\"Property 'name' is not of type 'string'\");\r\n if (obj.className !== undefined && typeof obj.className !== \"string\") errors.push(\"Property 'className' is not of type 'string'\");\r\n if (obj.accessString !== undefined && typeof obj.accessString !== \"string\") errors.push(\"Property 'accessString' is not of type 'string'\");\r\n if (obj.generated !== undefined && typeof obj.generated !== \"boolean\") errors.push(\"Property 'generated' is not of type 'boolean'\");\r\n if (obj.index !== undefined && typeof obj.index !== \"number\") errors.push(\"Property 'index' is not of type 'number'\");\r\n if (obj.jsonName !== undefined && typeof obj.jsonName !== \"string\") errors.push(\"Property 'jsonName' is not of type 'string'\");\r\n if (obj.extendedType !== undefined && typeof obj.extendedType !== \"string\") errors.push(\"Property 'extendedType' is not of type 'string'\");\r\n if (obj.type !== undefined && typeof obj.type !== \"string\") errors.push(\"Property 'type' is not of type 'string'\");\r\n if (obj.typeName !== undefined && typeof obj.typeName !== \"string\") errors.push(\"Property 'typeName' is not of type 'string'\");\r\n logWarning(`Validation failed for ColumnInfoProps. Object: ${JSON.stringify(obj)}. Errors: ${errors.join(\", \")}`);\r\n }\r\n\r\n return isValid;\r\n}\r\n\r\nexport enum ECDbTestMode {\r\n Both = \"Both\",\r\n Statement = \"Statement\",\r\n QueryReader = \"QueryReader\",\r\n};\r\n\r\nexport enum ECDbTestRowFormat {\r\n ECSqlNames = \"ECSqlNames\",\r\n ECSqlIndexes = \"ECSqlIndexes\",\r\n JsNames = \"JsNames\",\r\n}\r\n\r\nfunction tableTextToValue(text: string): any {\r\n if (text.startsWith(\"\\\"\") && text.endsWith(\"\\\"\"))\r\n return text.slice(1, text.length - 1);\r\n if (text === \"null\")\r\n return null;\r\n if (text === \"undefined\")\r\n return undefined;\r\n if (text.startsWith(\"{\") || text.startsWith(\"[\"))\r\n return JSON.parse(text);\r\n if (text === \"true\" || text === \"false\")\r\n return text === \"true\";\r\n if (text.startsWith(\"0x\"))\r\n return text; // we use this for IDs and they are handled as strings, the parseInt below would attempt to convert them to numbers\r\n if (/^-?\\d+(\\.\\d+)?$/.test(text)) {\r\n const flt = parseFloat(text);\r\n if (!Number.isNaN(flt))\r\n return flt;\r\n }\r\n\r\n if (/^-?\\d+$/.test(text)) {\r\n // eslint-disable-next-line radix\r\n const asInt = parseInt(text);\r\n if (!Number.isNaN(asInt))\r\n return asInt;\r\n }\r\n\r\n return text;\r\n}\r\n\r\nexport function buildBinaryData(obj: any): any { //TODO: we should do this during table parsing\r\n for (const key in obj) {\r\n if (typeof obj[key] === \"string\" && obj[key].startsWith(\"BIN(\") && obj[key].endsWith(\")\"))\r\n obj[key] = understandAndReplaceBinaryData(obj[key])\r\n else if (typeof obj[key] === \"object\" || Array.isArray(obj[key]))\r\n obj[key] = buildBinaryData(obj[key])\r\n }\r\n return obj;\r\n}\r\n\r\nfunction understandAndReplaceBinaryData(str: string): any {\r\n const startInd = str.indexOf(\"(\") + 1;\r\n const endInd = str.indexOf(\")\");\r\n str = str.slice(startInd, endInd);\r\n const ans: number[] = []\r\n const numbers: string[] = str.split(\",\");\r\n numbers.forEach((value: string) => {\r\n value = value.trim();\r\n // eslint-disable-next-line radix\r\n ans.push(parseInt(value));\r\n }\r\n );\r\n return Uint8Array.of(...ans);\r\n}\r\n\r\n\r\nexport class ECDbMarkdownTestParser {\r\n public static parse(): ECDbTestProps[] {\r\n const testAssetsDir = path.join(__dirname, \"..\", \"queries\");\r\n const testFiles = fs.readdirSync(testAssetsDir, \"utf-8\").filter((fileName) => fileName.toLowerCase().endsWith(\"ecsql.md\"));\r\n const out: ECDbTestProps[] = [];\r\n\r\n for (const fileName of testFiles) {\r\n try {\r\n const tests = this.parseFile(testAssetsDir, fileName);\r\n out.push(...tests);\r\n } catch (error) {\r\n logWarning(`Failed to parse file ${fileName}. Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n private static parseFile(testAssetsDir: string, fileName: string): ECDbTestProps[] {\r\n const markdownFilePath = path.join(testAssetsDir, fileName);\r\n const baseFileName = fileName.replace(/\\.ecdbtest\\.md$/i, \"\");\r\n const markdownContent = fs.readFileSync(markdownFilePath, \"utf-8\");\r\n const tokens = marked.lexer(markdownContent);\r\n\r\n const out: ECDbTestProps[] = [];\r\n let currentTest: ECDbTestProps | undefined;\r\n\r\n for (const token of tokens) {\r\n switch (token.type) {\r\n case \"space\":\r\n case \"html\":\r\n case \"paragraph\":\r\n case \"hr\":\r\n continue;\r\n case \"heading\":\r\n if (currentTest !== undefined) {\r\n out.push(currentTest);\r\n }\r\n currentTest = {\r\n title: token.text, mode: ECDbTestMode.Both, fileName: baseFileName,\r\n rowFormat: ECDbTestRowFormat.ECSqlNames, abbreviateBlobs: false, convertClassIdsToClassNames: false\r\n };\r\n break;\r\n case \"list\":\r\n this.handleListToken(token as Tokens.List, currentTest, markdownFilePath);\r\n break;\r\n case \"code\":\r\n this.handleCodeToken(token as Tokens.Code, currentTest, markdownFilePath);\r\n break;\r\n case \"table\":\r\n this.handleTableToken(token as Tokens.Table, currentTest, markdownFilePath);\r\n break;\r\n default:\r\n logWarning(`Unknown token type ${token.type} found in file ${markdownFilePath}. Skipping.`);\r\n break;\r\n }\r\n }\r\n\r\n if (currentTest !== undefined) {\r\n out.push(currentTest);\r\n }\r\n return out;\r\n }\r\n\r\n\r\n private static handleListToken(token: Tokens.List, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\r\n if (currentTest === undefined) {\r\n logWarning(`List token found without a test title in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n\r\n const variableRegex = /^(\\w+):\\s*(.+)$/;\r\n const bindRegex = /^bind(\\w+)\\s([^,\\s]+),\\s?(.+)$/;\r\n for (const item of token.items) {\r\n const match = item.text.match(variableRegex);\r\n if (match) {\r\n const key = match[1];\r\n const value = match[2];\r\n switch (key.toLowerCase()) {\r\n case \"dataset\":\r\n currentTest.dataset = value;\r\n continue;\r\n case \"errorduringprepare\":\r\n currentTest.errorDuringPrepare = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"stepstatus\":\r\n currentTest.stepStatus = value;\r\n continue;\r\n case \"only\":\r\n currentTest.only = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"skip\":\r\n currentTest.skip = value;\r\n continue;\r\n case \"mode\":\r\n this.handleMode(value, currentTest, markdownFilePath);\r\n continue;\r\n case \"rowformat\":\r\n this.handleRowFormat(value, currentTest, markdownFilePath);\r\n continue;\r\n case \"abbreviateblobs\":\r\n currentTest.abbreviateBlobs = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"convertclassidstoclassnames\":\r\n currentTest.convertClassIdsToClassNames = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"indexestoinclude\":\r\n currentTest.indexesToIncludeInResults = this.handleValidIndexList(value);\r\n continue;\r\n }\r\n }\r\n const bindMatch = item.text.match(bindRegex);\r\n if (bindMatch) {\r\n currentTest.binders = currentTest.binders || [];\r\n currentTest.binders.push({ indexOrName: bindMatch[2], type: bindMatch[1], value: bindMatch[3] });\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n private static handleMode(value: string, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n switch (value.toLowerCase()) {\r\n case \"statement\":\r\n currentTest.mode = ECDbTestMode.Statement;\r\n break;\r\n case \"queryreader\":\r\n currentTest.mode = ECDbTestMode.QueryReader;\r\n break;\r\n case \"both\":\r\n currentTest.mode = ECDbTestMode.Both;\r\n break;\r\n default:\r\n logWarning(`Mode value (${value}) is not recognized in file ${markdownFilePath} and test ${currentTest.title}. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleRowFormat(value: string, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n switch (value.toLowerCase()) {\r\n case \"ecsqlnames\":\r\n currentTest.rowFormat = ECDbTestRowFormat.ECSqlNames;\r\n break;\r\n case \"ecsqlindexes\":\r\n currentTest.rowFormat = ECDbTestRowFormat.ECSqlIndexes;\r\n break;\r\n case \"jsnames\":\r\n currentTest.rowFormat = ECDbTestRowFormat.JsNames;\r\n break;\r\n default:\r\n logWarning(`Row Format value (${value}) is not recognized in file ${markdownFilePath} and test ${currentTest.title}. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleValidIndexList(obj: string): number[] | undefined {\r\n try {\r\n const numsArr = JSON.parse(obj);\r\n if (Array.isArray(numsArr) && numsArr.every((val: any) => typeof val === \"number\"))\r\n return numsArr;\r\n logWarning(\"The given value is not valid for the property indexestoinclude\");\r\n return undefined;\r\n }\r\n catch {\r\n logWarning(\"The given value is not valid for the property indexestoinclude\");\r\n return undefined;\r\n }\r\n }\r\n\r\n private static handleCodeToken(token: Tokens.Code, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\r\n if (currentTest === undefined) {\r\n logWarning(`Code token found without a test title in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n\r\n if (token.lang === \"sql\") {\r\n currentTest.sql = token.text;\r\n } else if (token.lang === \"json\") {\r\n let json: any;\r\n try {\r\n json = JSON.parse(token.text);\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n logWarning(`Failed to parse JSON ${token.text} in file ${markdownFilePath}. ${error.message} Skipping.`);\r\n } else {\r\n logWarning(`Failed to parse SON ${token.text} in file ${markdownFilePath}. Unknown error. Skipping.`);\r\n }\r\n }\r\n\r\n if (typeof json === \"object\" && Array.isArray(json.columns)) {\r\n this.handleJSONColumnMetadata(json, currentTest, markdownFilePath);\r\n return;\r\n }\r\n\r\n this.handleJSONExpectedResults(json, currentTest); // TODO: validate the expected results\r\n } else {\r\n logWarning(`Unknown code language ${token.lang} found in file ${markdownFilePath}. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleJSONColumnMetadata(json: any, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n const extraProps: Set<string> = new Set();\r\n\r\n if (json.columns.every(isColumnInfoProps)) {\r\n currentTest.columnInfo = json.columns;\r\n for (const column of json.columns) {\r\n for (const key in column) {\r\n if (!columnInfoPropsKeys.has(key as keyof ColumnInfoProps)) {\r\n extraProps.add(key);\r\n }\r\n }\r\n }\r\n\r\n if (extraProps.size > 0) {\r\n logWarning(`Found extra properties in column infos: ${Array.from(extraProps).join(\", \")} in file '${markdownFilePath}' test '${currentTest.title}'.`);\r\n }\r\n } else {\r\n logWarning(`Columns format in file '${markdownFilePath}' test '${currentTest.title}' failed type guard. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleJSONExpectedResults(json: any, currentTest: ECDbTestProps) {\r\n currentTest.expectedResults = json\r\n }\r\n\r\n private static handleTableToken(token: Tokens.Table, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\r\n if (currentTest === undefined) {\r\n logWarning(`Table token found without a test title in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n\r\n this.handleTable(token, currentTest, markdownFilePath);\r\n }\r\n\r\n private static handleTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n if (token.header.length > 0 && currentTest.columnInfo === undefined && columnInfoPropsKeys.has(token.header[0].text as keyof ColumnInfoProps)) {\r\n this.handleColumnTable(token, currentTest, markdownFilePath);\r\n return;\r\n }\r\n else if (token.header.length > 0 && token.header[0].text === \"\") {\r\n this.handleExpectedResultsTableForECSqlPropertyIndexesOption(token, currentTest, markdownFilePath);\r\n } else {\r\n this.handleExpectedResultsTable(token, currentTest, markdownFilePath);\r\n }\r\n }\r\n\r\n private static handleColumnTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n const columnInfos: any[] = [];\r\n for (const row of token.rows) {\r\n if (row.length < 1 || row.length !== token.header.length) {\r\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\r\n continue;\r\n }\r\n const columnInfo: { [key: string]: any } = {};\r\n for (let i = 0; i < token.header.length; i++) {\r\n const header = token.header[i].text;\r\n const cell = row[i].text;\r\n columnInfo[header] = tableTextToValue(cell);\r\n }\r\n columnInfos.push(columnInfo);\r\n }\r\n\r\n this.handleJSONColumnMetadata({ columns: columnInfos }, currentTest, markdownFilePath);\r\n }\r\n\r\n private static handleExpectedResultsTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n if (currentTest.expectedResults !== undefined) {\r\n logWarning(`Expected results already set for test ${currentTest.title} in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n currentTest.expectedResults = [];\r\n for (const row of token.rows) {\r\n if (row.length < 1 || row.length !== token.header.length) {\r\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\r\n continue;\r\n }\r\n\r\n const expectedResult: { [key: string]: any } = {};\r\n for (let i = 0; i < token.header.length; i++) {\r\n const header = token.header[i].text;\r\n const cell = row[i].text;\r\n const value = tableTextToValue(cell);\r\n if (value !== undefined)\r\n expectedResult[header] = value;\r\n }\r\n currentTest.expectedResults.push(expectedResult);\r\n }\r\n }\r\n\r\n private static handleExpectedResultsTableForECSqlPropertyIndexesOption(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n if (currentTest.expectedResults !== undefined) {\r\n logWarning(`Expected results already set for test ${currentTest.title} in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n currentTest.expectedResults = [];\r\n for (const row of token.rows) {\r\n if (row.length < 1 || row.length !== token.header.length) {\r\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\r\n continue;\r\n }\r\n\r\n const expectedResult: any[] = [];\r\n for (let i = 0; i < token.header.length; i++) {\r\n const cell = row[i].text;\r\n const value = tableTextToValue(cell);\r\n if (value !== undefined)\r\n expectedResult.push(value);\r\n }\r\n currentTest.expectedResults.push(expectedResult);\r\n }\r\n }\r\n}\r\n\r\nfunction logWarning(message: string) {\r\n // eslint-disable-next-line no-console\r\n console.log(`\\x1b[33m${message}\\x1b[0m`);\r\n}"]}
|
|
1
|
+
{"version":3,"file":"ECSqlTestParser.js","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestParser.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport * as path from \"path\";\r\nimport * as fs from \"fs\";\r\nimport { marked, Tokens } from \"marked\";\r\n\r\nexport interface ECDbTestProps {\r\n fileName: string;\r\n title: string;\r\n\r\n // Things from properties:\r\n only?: boolean; // This flag handles the only property to filter tests\r\n skip?: string; // This flag handles the skip property to filter tests\r\n dataset?: string;\r\n mode: ECDbTestMode;\r\n rowFormat: ECDbTestRowFormat;\r\n abbreviateBlobs: boolean;\r\n convertClassIdsToClassNames: boolean;\r\n errorDuringPrepare?: boolean;\r\n indexesToIncludeInResults?: number[]; // We now have the feature to check only certain columns of expected results\r\n // but if the rowFormat is ECSqlIndexes then there is no way to uniquely identify the columns, in that case this flag is used to include certain property indexes\r\n // for checking and ignore the rest, if this flag is not given while the rowFormat is ECSqlIndexes then the expected Results column\r\n // will assume an incremental 0 based indexing by default. This flag serves as a mapping for the actual results while checking with the expected results.\r\n\r\n // TODO: implement, it's currently being parsed but not used\r\n stepStatus?: string;\r\n\r\n // Things from code blocks or tables\r\n sql?: string;\r\n expectedResults?: { [key: string]: any }[] | any[];\r\n columnInfo?: ColumnInfoProps[];\r\n\r\n // Things from lists\r\n binders?: ECDbTestBinderProps[];\r\n}\r\n\r\nexport interface ECDbTestBinderProps {\r\n indexOrName: string;\r\n type: string;\r\n value: string;\r\n}\r\n\r\nexport interface ColumnInfoProps {\r\n name: string;\r\n className?: string;\r\n accessString?: string;\r\n generated?: boolean;\r\n index?: number;\r\n jsonName?: string;\r\n // expected extendedType value should be given when we know that the actual column info extendedType will be a valid non empty string for test to pass.\r\n // This extendedType value is internally used to check both extendType and extendedType values of column metadata.\r\n extendedType?: string;\r\n type?: string; // type is used on ECSqlStatement because it can differ from TypeName\r\n typeName?: string; // typeName is used on ConcurrentQuery\r\n originPropertyName?: string; // only supported for ECSqlStatement\r\n}\r\n\r\nexport const columnInfoPropsKeys: Set<keyof ColumnInfoProps> = new Set([\r\n \"name\",\r\n \"className\",\r\n \"accessString\",\r\n \"generated\",\r\n \"index\",\r\n \"jsonName\",\r\n \"extendedType\",\r\n \"type\",\r\n \"typeName\",\r\n \"originPropertyName\",\r\n]);\r\n\r\n/* interface QueryPropertyMetaData\r\n className: string;\r\n accessString?: string;\r\n generated: boolean;\r\n index: number;\r\n jsonName: string;\r\n name: string;\r\n extendType: string;\r\n typeName: string;\r\n*/\r\n\r\nfunction isColumnInfoProps(obj: any): obj is ColumnInfoProps {\r\n const numberOfKeys = typeof obj === \"object\" ? Object.keys(obj).length : 0;\r\n const isValid = typeof obj === \"object\" &&\r\n typeof obj.name === \"string\" &&\r\n (obj.className === undefined || typeof obj.className === \"string\") &&\r\n (obj.accessString === undefined || typeof obj.accessString === \"string\") &&\r\n (obj.generated === undefined || typeof obj.generated === \"boolean\") &&\r\n (obj.index === undefined || typeof obj.index === \"number\") &&\r\n (obj.jsonName === undefined || typeof obj.jsonName === \"string\") &&\r\n (obj.extendedType === undefined || typeof obj.extendedType === \"string\") &&\r\n (obj.type === undefined || typeof obj.type === \"string\") &&\r\n (obj.typeName === undefined || typeof obj.typeName === \"string\");\r\n\r\n if (!isValid) {\r\n const errors: string[] = [];\r\n if (typeof obj !== \"object\") errors.push(\"Object is not of type 'object'\");\r\n if (numberOfKeys < 1 || numberOfKeys > 7) errors.push(\"Number of keys is not between 1 and 7\");\r\n if (typeof obj.name !== \"string\") errors.push(\"Property 'name' is not of type 'string'\");\r\n if (obj.className !== undefined && typeof obj.className !== \"string\") errors.push(\"Property 'className' is not of type 'string'\");\r\n if (obj.accessString !== undefined && typeof obj.accessString !== \"string\") errors.push(\"Property 'accessString' is not of type 'string'\");\r\n if (obj.generated !== undefined && typeof obj.generated !== \"boolean\") errors.push(\"Property 'generated' is not of type 'boolean'\");\r\n if (obj.index !== undefined && typeof obj.index !== \"number\") errors.push(\"Property 'index' is not of type 'number'\");\r\n if (obj.jsonName !== undefined && typeof obj.jsonName !== \"string\") errors.push(\"Property 'jsonName' is not of type 'string'\");\r\n if (obj.extendedType !== undefined && typeof obj.extendedType !== \"string\") errors.push(\"Property 'extendedType' is not of type 'string'\");\r\n if (obj.type !== undefined && typeof obj.type !== \"string\") errors.push(\"Property 'type' is not of type 'string'\");\r\n if (obj.typeName !== undefined && typeof obj.typeName !== \"string\") errors.push(\"Property 'typeName' is not of type 'string'\");\r\n logWarning(`Validation failed for ColumnInfoProps. Object: ${JSON.stringify(obj)}. Errors: ${errors.join(\", \")}`);\r\n }\r\n\r\n return isValid;\r\n}\r\n\r\nexport enum ECDbTestMode {\r\n Both = \"Both\",\r\n Statement = \"Statement\",\r\n QueryReader = \"QueryReader\",\r\n};\r\n\r\nexport enum ECDbTestRowFormat {\r\n ECSqlNames = \"ECSqlNames\",\r\n ECSqlIndexes = \"ECSqlIndexes\",\r\n JsNames = \"JsNames\",\r\n}\r\n\r\nfunction tableTextToValue(text: string): any {\r\n // Unescape literal \\n sequences to actual newline characters\r\n text = text.replace(/\\\\n/g, \"\\n\");\r\n // Trim leading/trailing whitespaces\r\n text = text.trim();\r\n if (text.startsWith(\"\\\"\") && text.endsWith(\"\\\"\"))\r\n return text.slice(1, text.length - 1);\r\n if (text === \"null\")\r\n return null;\r\n if (text === \"undefined\")\r\n return undefined;\r\n if (text.startsWith(\"{\") || text.startsWith(\"[\"))\r\n return JSON.parse(text);\r\n if (text === \"true\" || text === \"false\")\r\n return text === \"true\";\r\n if (text.startsWith(\"0x\"))\r\n return text; // we use this for IDs and they are handled as strings, the parseInt below would attempt to convert them to numbers\r\n if (/^-?\\d+(\\.\\d+)?$/.test(text)) {\r\n const flt = parseFloat(text);\r\n if (!Number.isNaN(flt))\r\n return flt;\r\n }\r\n\r\n if (/^-?\\d+$/.test(text)) {\r\n // eslint-disable-next-line radix\r\n const asInt = parseInt(text);\r\n if (!Number.isNaN(asInt))\r\n return asInt;\r\n }\r\n\r\n return text;\r\n}\r\n\r\nexport function buildBinaryData(obj: any): any { //TODO: we should do this during table parsing\r\n for (const key in obj) {\r\n if (typeof obj[key] === \"string\" && obj[key].startsWith(\"BIN(\") && obj[key].endsWith(\")\"))\r\n obj[key] = understandAndReplaceBinaryData(obj[key])\r\n else if (typeof obj[key] === \"object\" || Array.isArray(obj[key]))\r\n obj[key] = buildBinaryData(obj[key])\r\n }\r\n return obj;\r\n}\r\n\r\nfunction understandAndReplaceBinaryData(str: string): any {\r\n const startInd = str.indexOf(\"(\") + 1;\r\n const endInd = str.indexOf(\")\");\r\n str = str.slice(startInd, endInd);\r\n const ans: number[] = []\r\n const numbers: string[] = str.split(\",\");\r\n numbers.forEach((value: string) => {\r\n value = value.trim();\r\n // eslint-disable-next-line radix\r\n ans.push(parseInt(value));\r\n }\r\n );\r\n return Uint8Array.of(...ans);\r\n}\r\n\r\n\r\nexport class ECDbMarkdownTestParser {\r\n public static parse(): ECDbTestProps[] {\r\n const testAssetsDir = path.join(__dirname, \"..\", \"queries\");\r\n const testFiles = fs.readdirSync(testAssetsDir, \"utf-8\").filter((fileName) => fileName.toLowerCase().endsWith(\"ecsql.md\"));\r\n const out: ECDbTestProps[] = [];\r\n\r\n for (const fileName of testFiles) {\r\n try {\r\n const tests = this.parseFile(testAssetsDir, fileName);\r\n out.push(...tests);\r\n } catch (error) {\r\n logWarning(`Failed to parse file ${fileName}. Error: ${error instanceof Error ? error.message : \"Unknown error\"}`);\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n private static parseFile(testAssetsDir: string, fileName: string): ECDbTestProps[] {\r\n const markdownFilePath = path.join(testAssetsDir, fileName);\r\n const baseFileName = fileName.replace(/\\.ecdbtest\\.md$/i, \"\");\r\n const markdownContent = fs.readFileSync(markdownFilePath, \"utf-8\");\r\n const tokens = marked.lexer(markdownContent);\r\n\r\n const out: ECDbTestProps[] = [];\r\n let currentTest: ECDbTestProps | undefined;\r\n\r\n for (const token of tokens) {\r\n switch (token.type) {\r\n case \"space\":\r\n case \"html\":\r\n case \"paragraph\":\r\n case \"hr\":\r\n continue;\r\n case \"heading\":\r\n if (currentTest !== undefined) {\r\n out.push(currentTest);\r\n }\r\n currentTest = {\r\n title: token.text, mode: ECDbTestMode.Both, fileName: baseFileName,\r\n rowFormat: ECDbTestRowFormat.ECSqlNames, abbreviateBlobs: false, convertClassIdsToClassNames: false\r\n };\r\n break;\r\n case \"list\":\r\n this.handleListToken(token as Tokens.List, currentTest, markdownFilePath);\r\n break;\r\n case \"code\":\r\n this.handleCodeToken(token as Tokens.Code, currentTest, markdownFilePath);\r\n break;\r\n case \"table\":\r\n this.handleTableToken(token as Tokens.Table, currentTest, markdownFilePath);\r\n break;\r\n default:\r\n logWarning(`Unknown token type ${token.type} found in file ${markdownFilePath}. Skipping.`);\r\n break;\r\n }\r\n }\r\n\r\n if (currentTest !== undefined) {\r\n out.push(currentTest);\r\n }\r\n return out;\r\n }\r\n\r\n\r\n private static handleListToken(token: Tokens.List, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\r\n if (currentTest === undefined) {\r\n logWarning(`List token found without a test title in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n\r\n const variableRegex = /^(\\w+):\\s*(.+)$/;\r\n const bindRegex = /^bind(\\w+)\\s([^,\\s]+),\\s?(.+)$/;\r\n for (const item of token.items) {\r\n const match = item.text.match(variableRegex);\r\n if (match) {\r\n const key = match[1];\r\n const value = match[2];\r\n switch (key.toLowerCase()) {\r\n case \"dataset\":\r\n currentTest.dataset = value;\r\n continue;\r\n case \"errorduringprepare\":\r\n currentTest.errorDuringPrepare = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"stepstatus\":\r\n currentTest.stepStatus = value;\r\n continue;\r\n case \"only\":\r\n currentTest.only = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"skip\":\r\n currentTest.skip = value;\r\n continue;\r\n case \"mode\":\r\n this.handleMode(value, currentTest, markdownFilePath);\r\n continue;\r\n case \"rowformat\":\r\n this.handleRowFormat(value, currentTest, markdownFilePath);\r\n continue;\r\n case \"abbreviateblobs\":\r\n currentTest.abbreviateBlobs = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"convertclassidstoclassnames\":\r\n currentTest.convertClassIdsToClassNames = value.toLowerCase() === \"true\";\r\n continue;\r\n case \"indexestoinclude\":\r\n currentTest.indexesToIncludeInResults = this.handleValidIndexList(value);\r\n continue;\r\n }\r\n }\r\n const bindMatch = item.text.match(bindRegex);\r\n if (bindMatch) {\r\n currentTest.binders = currentTest.binders || [];\r\n currentTest.binders.push({ indexOrName: bindMatch[2], type: bindMatch[1], value: bindMatch[3] });\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n private static handleMode(value: string, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n switch (value.toLowerCase()) {\r\n case \"statement\":\r\n currentTest.mode = ECDbTestMode.Statement;\r\n break;\r\n case \"queryreader\":\r\n currentTest.mode = ECDbTestMode.QueryReader;\r\n break;\r\n case \"both\":\r\n currentTest.mode = ECDbTestMode.Both;\r\n break;\r\n default:\r\n logWarning(`Mode value (${value}) is not recognized in file ${markdownFilePath} and test ${currentTest.title}. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleRowFormat(value: string, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n switch (value.toLowerCase()) {\r\n case \"ecsqlnames\":\r\n currentTest.rowFormat = ECDbTestRowFormat.ECSqlNames;\r\n break;\r\n case \"ecsqlindexes\":\r\n currentTest.rowFormat = ECDbTestRowFormat.ECSqlIndexes;\r\n break;\r\n case \"jsnames\":\r\n currentTest.rowFormat = ECDbTestRowFormat.JsNames;\r\n break;\r\n default:\r\n logWarning(`Row Format value (${value}) is not recognized in file ${markdownFilePath} and test ${currentTest.title}. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleValidIndexList(obj: string): number[] | undefined {\r\n try {\r\n const numsArr = JSON.parse(obj);\r\n if (Array.isArray(numsArr) && numsArr.every((val: any) => typeof val === \"number\"))\r\n return numsArr;\r\n logWarning(\"The given value is not valid for the property indexestoinclude\");\r\n return undefined;\r\n }\r\n catch {\r\n logWarning(\"The given value is not valid for the property indexestoinclude\");\r\n return undefined;\r\n }\r\n }\r\n\r\n private static handleCodeToken(token: Tokens.Code, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\r\n if (currentTest === undefined) {\r\n logWarning(`Code token found without a test title in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n\r\n if (token.lang === \"sql\") {\r\n currentTest.sql = token.text;\r\n } else if (token.lang === \"json\") {\r\n let json: any;\r\n try {\r\n json = JSON.parse(token.text);\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n logWarning(`Failed to parse JSON ${token.text} in file ${markdownFilePath}. ${error.message} Skipping.`);\r\n } else {\r\n logWarning(`Failed to parse SON ${token.text} in file ${markdownFilePath}. Unknown error. Skipping.`);\r\n }\r\n }\r\n\r\n if (typeof json === \"object\" && Array.isArray(json.columns)) {\r\n this.handleJSONColumnMetadata(json, currentTest, markdownFilePath);\r\n return;\r\n }\r\n\r\n this.handleJSONExpectedResults(json, currentTest); // TODO: validate the expected results\r\n } else {\r\n logWarning(`Unknown code language ${token.lang} found in file ${markdownFilePath}. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleJSONColumnMetadata(json: any, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n const extraProps: Set<string> = new Set();\r\n\r\n if (json.columns.every(isColumnInfoProps)) {\r\n currentTest.columnInfo = json.columns;\r\n for (const column of json.columns) {\r\n for (const key in column) {\r\n if (!columnInfoPropsKeys.has(key as keyof ColumnInfoProps)) {\r\n extraProps.add(key);\r\n }\r\n }\r\n }\r\n\r\n if (extraProps.size > 0) {\r\n logWarning(`Found extra properties in column infos: ${Array.from(extraProps).join(\", \")} in file '${markdownFilePath}' test '${currentTest.title}'.`);\r\n }\r\n } else {\r\n logWarning(`Columns format in file '${markdownFilePath}' test '${currentTest.title}' failed type guard. Skipping.`);\r\n }\r\n }\r\n\r\n private static handleJSONExpectedResults(json: any, currentTest: ECDbTestProps) {\r\n currentTest.expectedResults = json\r\n }\r\n\r\n private static handleTableToken(token: Tokens.Table, currentTest: ECDbTestProps | undefined, markdownFilePath: string) {\r\n if (currentTest === undefined) {\r\n logWarning(`Table token found without a test title in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n\r\n this.handleTable(token, currentTest, markdownFilePath);\r\n }\r\n\r\n private static handleTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n if (token.header.length > 0 && currentTest.columnInfo === undefined && columnInfoPropsKeys.has(token.header[0].text as keyof ColumnInfoProps)) {\r\n this.handleColumnTable(token, currentTest, markdownFilePath);\r\n return;\r\n }\r\n else if (token.header.length > 0 && token.header[0].text === \"\") {\r\n this.handleExpectedResultsTableForECSqlPropertyIndexesOption(token, currentTest, markdownFilePath);\r\n } else {\r\n this.handleExpectedResultsTable(token, currentTest, markdownFilePath);\r\n }\r\n }\r\n\r\n private static handleColumnTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n const columnInfos: any[] = [];\r\n for (const row of token.rows) {\r\n if (row.length < 1 || row.length !== token.header.length) {\r\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\r\n continue;\r\n }\r\n const columnInfo: { [key: string]: any } = {};\r\n for (let i = 0; i < token.header.length; i++) {\r\n const header = token.header[i].text;\r\n const cell = row[i].text;\r\n columnInfo[header] = tableTextToValue(cell);\r\n }\r\n columnInfos.push(columnInfo);\r\n }\r\n\r\n this.handleJSONColumnMetadata({ columns: columnInfos }, currentTest, markdownFilePath);\r\n }\r\n\r\n private static handleExpectedResultsTable(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n if (currentTest.expectedResults !== undefined) {\r\n logWarning(`Expected results already set for test ${currentTest.title} in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n currentTest.expectedResults = [];\r\n for (const row of token.rows) {\r\n if (row.length < 1 || row.length !== token.header.length) {\r\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\r\n continue;\r\n }\r\n\r\n const expectedResult: { [key: string]: any } = {};\r\n for (let i = 0; i < token.header.length; i++) {\r\n const header = token.header[i].text;\r\n const cell = row[i].text;\r\n const value = tableTextToValue(cell);\r\n if (value !== undefined)\r\n expectedResult[header] = value;\r\n }\r\n currentTest.expectedResults.push(expectedResult);\r\n }\r\n }\r\n\r\n private static handleExpectedResultsTableForECSqlPropertyIndexesOption(token: Tokens.Table, currentTest: ECDbTestProps, markdownFilePath: string) {\r\n if (currentTest.expectedResults !== undefined) {\r\n logWarning(`Expected results already set for test ${currentTest.title} in file ${markdownFilePath}. Skipping.`);\r\n return;\r\n }\r\n currentTest.expectedResults = [];\r\n for (const row of token.rows) {\r\n if (row.length < 1 || row.length !== token.header.length) {\r\n logWarning(`Rows in a expected result table must have a minimum of 1 cell, and as many cells as there are headers. ${markdownFilePath}. Skipping.`);\r\n continue;\r\n }\r\n\r\n const expectedResult: any[] = [];\r\n for (let i = 0; i < token.header.length; i++) {\r\n const cell = row[i].text;\r\n const value = tableTextToValue(cell);\r\n if (value !== undefined)\r\n expectedResult.push(value);\r\n }\r\n currentTest.expectedResults.push(expectedResult);\r\n }\r\n }\r\n}\r\n\r\nfunction logWarning(message: string) {\r\n // eslint-disable-next-line no-console\r\n console.log(`\\x1b[33m${message}\\x1b[0m`);\r\n}"]}
|
|
@@ -426,13 +426,17 @@ function checkingExpectedResults(rowFormat, actualResult, expectedResult, indexe
|
|
|
426
426
|
if (rowFormat === ECDbTestRowFormat.ECSqlIndexes && indexesToInclude) {
|
|
427
427
|
let i = 0;
|
|
428
428
|
for (const key of Object.keys(expectedResult)) {
|
|
429
|
-
|
|
429
|
+
const expected = typeof expectedResult[key] === "string" ? expectedResult[key].trim() : expectedResult[key];
|
|
430
|
+
const actual = typeof actualResult[indexesToInclude[i]] === "string" ? actualResult[indexesToInclude[i]].trim() : actualResult[indexesToInclude[i]];
|
|
431
|
+
assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[indexesToInclude[i]])}`);
|
|
430
432
|
i++;
|
|
431
433
|
}
|
|
432
434
|
}
|
|
433
435
|
else {
|
|
434
436
|
for (const key of Object.keys(expectedResult)) {
|
|
435
|
-
|
|
437
|
+
const expected = typeof expectedResult[key] === "string" ? expectedResult[key].trim() : expectedResult[key];
|
|
438
|
+
const actual = typeof actualResult[key] === "string" ? actualResult[key].trim() : actualResult[key];
|
|
439
|
+
assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[key])}`);
|
|
436
440
|
}
|
|
437
441
|
}
|
|
438
442
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ECSqlTestRunner.test.js","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestRunner.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert } from \"chai\";\r\nimport { DbResult } from \"@itwin/core-bentley\";\r\nimport { ECSqlRowArg, ECSqlStatement, ECSqlSyncReader, SnapshotDb, SynchronousQueryOptions } from \"../../../core-backend\";\r\nimport { KnownTestLocations } from \"../../KnownTestLocations\";\r\nimport { ECSqlReader, ECSqlValueType, QueryBinder, QueryOptions, QueryPropertyMetaData, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { buildBinaryData, ECDbMarkdownTestParser, ECDbTestMode, ECDbTestProps, ECDbTestRowFormat } from \"./ECSqlTestParser\";\r\nimport * as path from \"path\";\r\nimport * as fs from \"fs\";\r\nimport { ECSqlDatasets } from \"../dataset/ECSqlDatasets\";\r\nimport { Point2d, Point3d } from \"@itwin/core-geometry\";\r\n\r\nenum TestDataset {\r\n AllProperties = \"AllProperties.bim\"\r\n}\r\n\r\nconst snapshotDbs: { [key in TestDataset]?: SnapshotDb } = {};\r\n\r\ndescribe(\"Markdown based ECDb test runner\", async () => {\r\n before(async () => {\r\n await ECSqlDatasets.generateFiles();\r\n const datasetFilePath = path.join(KnownTestLocations.outputDir, \"ECSqlTests\", TestDataset.AllProperties);\r\n if (!fs.existsSync(datasetFilePath)) {\r\n throw new Error(`Dataset file ${datasetFilePath} does not exist`);\r\n }\r\n snapshotDbs[TestDataset.AllProperties] = SnapshotDb.openFile(datasetFilePath);\r\n });\r\n\r\n after(() => {\r\n for (const key in snapshotDbs) {\r\n if (snapshotDbs.hasOwnProperty(key)) {\r\n (snapshotDbs[key as keyof typeof snapshotDbs])?.close();\r\n }\r\n }\r\n });\r\n const tests: ECDbTestProps[] = ECDbMarkdownTestParser.parse();\r\n\r\n //TODO: Mechanism to run a single test, put something like it.only into the test md which causes this loop to only run those tests\r\n for (const test of tests) {\r\n if (!test.dataset) {\r\n logWarning(`Skipping test ${test.title} because it does not have a dataset`);\r\n continue;\r\n }\r\n\r\n if (test.dataset.toLowerCase() !== TestDataset.AllProperties.toLowerCase()) {\r\n logWarning(`Skipping test ${test.title} because dataset ${test.dataset} is not recognized`);\r\n continue;\r\n }\r\n const dataset = TestDataset.AllProperties;\r\n\r\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.Statement) {\r\n if (test.skip)\r\n it(`${test.fileName}: ${test.title} (Statement) skipped. Reason: ${test.skip}`);\r\n else if (test.only)\r\n it.only(`${test.fileName}: ${test.title} (Statement)`, () => {\r\n runECSqlStatementTest(test, dataset);\r\n });\r\n else\r\n it(`${test.fileName}: ${test.title} (Statement)`, () => {\r\n runECSqlStatementTest(test, dataset);\r\n });\r\n }\r\n\r\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.QueryReader) {\r\n if (test.skip) {\r\n it(`${test.fileName}: ${test.title} (ECSqlReader) skipped. Reason: ${test.skip}`);\r\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader) skipped. Reason: ${test.skip}`);\r\n }\r\n else if (test.only) {\r\n it.only(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {\r\n await runECSqlReaderTest(test, dataset);\r\n });\r\n it.only(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {\r\n await runECSqlSyncReaderTest(test, dataset);\r\n });\r\n }\r\n else {\r\n it(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {\r\n await runECSqlReaderTest(test, dataset);\r\n });\r\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {\r\n await runECSqlSyncReaderTest(test, dataset);\r\n });\r\n }\r\n }\r\n }\r\n});\r\n\r\nfunction runECSqlStatementTest(test: ECDbTestProps, dataset: TestDataset) {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n let stmt: ECSqlStatement | undefined;\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n try {\r\n // TODO: statement options should be exposed through the markdown\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n stmt = imodel.prepareStatement(test.sql); // TODO: Wire up logic for tests we expect to fail during prepare\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during prepare of Statement: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n try {\r\n if (test.binders !== undefined) {\r\n for (const binder of test.binders) {\r\n // eslint-disable-next-line radix\r\n let id: number | string = Number.parseInt(binder.indexOrName);\r\n if (isNaN(id))\r\n id = binder.indexOrName;\r\n\r\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\r\n case \"null\":\r\n stmt.bindNull(id);\r\n break;\r\n case \"string\":\r\n stmt.bindString(id, binder.value);\r\n break;\r\n case \"int\":\r\n // eslint-disable-next-line radix\r\n stmt.bindInteger(id, Number.parseInt(binder.value));\r\n break;\r\n case \"double\":\r\n stmt.bindDouble(id, Number.parseFloat(binder.value));\r\n break;\r\n case \"id\":\r\n stmt.bindId(id, binder.value);\r\n break;\r\n case \"idset\":\r\n const values: string[] = binder.value.slice(1, -1).split(\",\");\r\n const trimmedValues = values.map((value: string) =>\r\n value.trim()\r\n );\r\n stmt.bindIdSet(id, trimmedValues);\r\n break;\r\n case \"datetime\":\r\n stmt.bindDateTime(id, binder.value);\r\n break;\r\n case \"point2d\":\r\n const parsedVal2d = JSON.parse(binder.value);\r\n stmt.bindPoint2d(id, { x: parsedVal2d.X, y: parsedVal2d.Y });\r\n break;\r\n case \"point3d\":\r\n const parsedVal3d = JSON.parse(binder.value);\r\n stmt.bindPoint3d(id, { x: parsedVal3d.X, y: parsedVal3d.Y, z: parsedVal3d.Z });\r\n break;\r\n case \"blob\":\r\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\r\n const numbers = arrayValues.map((value: string) =>\r\n // eslint-disable-next-line radix\r\n parseInt(value.trim())\r\n );\r\n stmt.bindBlob(id, Uint8Array.of(...numbers));\r\n break;\r\n case \"navigation\":\r\n stmt.bindNavigation(id, JSON.parse(binder.value));\r\n break;\r\n case \"array\":\r\n stmt.bindArray(id, JSON.parse(binder.value));\r\n break;\r\n case \"struct\":\r\n stmt.bindStruct(id, JSON.parse(binder.value));\r\n break;\r\n default:\r\n assert.fail(`Unsupported binder type ${binder.type}`);\r\n } // switch binder.type\r\n } // for binder\r\n } // if test.binders\r\n\r\n let resultCount = 0;\r\n let stepResult: DbResult;\r\n while ((stepResult = stmt.step()) === DbResult.BE_SQLITE_ROW) {\r\n if (resultCount === 0 && test.columnInfo) {\r\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\r\n const colCount = stmt.getColumnCount();\r\n assert.strictEqual(colCount, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colCount}`);\r\n for (let i = 0; i < colCount; i++) {\r\n const colInfo = stmt.getValue(i).columnInfo;\r\n const expectedColInfo = test.columnInfo[i];\r\n // cannot directly compare against colInfo because it has methods instead of getters\r\n assert.strictEqual(colInfo.getPropertyName(), expectedColInfo.name, `Expected property name ${expectedColInfo.name} but got ${colInfo.getPropertyName()} for column index ${i}`);\r\n //if (expectedColInfo.isDynamicProp !== undefined) TODO: Is this not exposed?\r\n // assert.strictEqual(colInfo..isDynamicProperty, expectedColInfo.isDynamicProp, `Expected dynamic property ${expectedColInfo.isDynamicProp} but got ${colInfo.isDynamicProperty} for column index ${i}`);\r\n // TODO: Extended type name not exposed??\r\n if (expectedColInfo.generated !== undefined)\r\n assert.strictEqual(colInfo.isGeneratedProperty(), expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.isGeneratedProperty()} for column index ${i}`);\r\n if (expectedColInfo.accessString !== undefined)\r\n assert.strictEqual(colInfo.getAccessString(), expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.getAccessString()} for column index ${i}`);\r\n if (expectedColInfo.type !== undefined)\r\n assert.strictEqual(ECSqlValueType[colInfo.getType()], expectedColInfo.type, `Expected type ${expectedColInfo.type} but got ${ECSqlValueType[colInfo.getType()]} for column index ${i}`);\r\n if (expectedColInfo.originPropertyName !== undefined)\r\n assert.strictEqual(colInfo.getOriginPropertyName(), expectedColInfo.originPropertyName, `Expected Origin PropertyName ${expectedColInfo.originPropertyName} but got ${colInfo.getOriginPropertyName()} for column index ${i}`);\r\n }\r\n }\r\n\r\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\r\n let expectedResult = test.expectedResults[resultCount];\r\n expectedResult = buildBinaryData(expectedResult);\r\n const rowArgs: ECSqlRowArg = { rowFormat: getRowFormat(test.rowFormat), classIdsToClassNames: test.convertClassIdsToClassNames };\r\n const actualResult = stmt.getRow(rowArgs);\r\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\r\n }\r\n resultCount++;\r\n }\r\n stmt[Symbol.dispose]();\r\n stmt = undefined;\r\n\r\n if (resultCount === 0 && test.stepStatus) {\r\n const stepResultString = DbResult[stepResult];\r\n assert.strictEqual(stepResultString, test.stepStatus, `Expected step status ${test.stepStatus} but got ${stepResultString}`);\r\n }\r\n\r\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\r\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\r\n }\r\n } finally {\r\n if (stmt !== undefined)\r\n stmt[Symbol.dispose]();\r\n }\r\n}\r\n\r\nfunction getRowFormat(rowFormat: ECDbTestRowFormat): QueryRowFormat {\r\n switch (rowFormat) {\r\n case ECDbTestRowFormat.ECSqlNames:\r\n return QueryRowFormat.UseECSqlPropertyNames;\r\n case ECDbTestRowFormat.ECSqlIndexes:\r\n return QueryRowFormat.UseECSqlPropertyIndexes;\r\n case ECDbTestRowFormat.JsNames:\r\n return QueryRowFormat.UseJsPropertyNames;\r\n default:\r\n return QueryRowFormat.UseECSqlPropertyNames;\r\n }\r\n}\r\n\r\n/** Builds a QueryBinder from the test's binder definitions. Returns undefined when the test has no binders. */\r\nfunction buildQueryBinder(test: ECDbTestProps): QueryBinder | undefined {\r\n if (test.binders === undefined)\r\n return undefined;\r\n\r\n const params = new QueryBinder();\r\n for (const binder of test.binders) {\r\n // eslint-disable-next-line radix\r\n let id: number | string = Number.parseInt(binder.indexOrName);\r\n if (isNaN(id))\r\n id = binder.indexOrName;\r\n\r\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\r\n case \"null\":\r\n params.bindNull(id);\r\n break;\r\n case \"string\":\r\n params.bindString(id, binder.value);\r\n break;\r\n case \"int\":\r\n // eslint-disable-next-line radix\r\n params.bindInt(id, Number.parseInt(binder.value));\r\n break;\r\n case \"long\":\r\n // eslint-disable-next-line radix\r\n params.bindLong(id, Number.parseInt(binder.value));\r\n break;\r\n case \"double\":\r\n params.bindDouble(id, Number.parseFloat(binder.value));\r\n break;\r\n case \"id\":\r\n params.bindId(id, binder.value);\r\n break;\r\n case \"idset\":\r\n const values: string[] = binder.value.slice(1, -1).split(\",\");\r\n const trimmedValues = values.map((value: string) =>\r\n value.trim()\r\n );\r\n params.bindIdSet(id, trimmedValues);\r\n break;\r\n case \"point2d\":\r\n const parsedVal2d = JSON.parse(binder.value);\r\n params.bindPoint2d(id, new Point2d(parsedVal2d.X, parsedVal2d.Y));\r\n break;\r\n case \"point3d\":\r\n const parsedVal3d = JSON.parse(binder.value);\r\n params.bindPoint3d(id, new Point3d(parsedVal3d.X, parsedVal3d.Y, parsedVal3d.Z));\r\n break;\r\n case \"blob\":\r\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\r\n const numbers = arrayValues.map((value: string) =>\r\n // eslint-disable-next-line radix\r\n parseInt(value.trim())\r\n );\r\n params.bindBlob(id, Uint8Array.of(...numbers));\r\n break;\r\n case \"struct\":\r\n params.bindStruct(id, JSON.parse(binder.value));\r\n break;\r\n default:\r\n assert.fail(`Unsupported binder type ${binder.type}`);\r\n } // switch binder.type\r\n } // for binder\r\n return params;\r\n}\r\n\r\n/** Builds the common query options object from the test configuration. */\r\nfunction buildReaderQueryOptions(test: ECDbTestProps): QueryOptions {\r\n const queryOptions: QueryOptions = {};\r\n queryOptions.rowFormat = getRowFormat(test.rowFormat);\r\n if (test.abbreviateBlobs)\r\n queryOptions.abbreviateBlobs = true;\r\n if (test.convertClassIdsToClassNames) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n queryOptions.convertClassIdsToClassNames = true;\r\n }\r\n return queryOptions;\r\n}\r\n\r\n/**\r\n * Shared assertion logic for QueryReader tests that operates on the result rows and column metadata.\r\n * Used by both ECSqlReader and ECSqlSyncReader test paths.\r\n */\r\nfunction runResultAssertions(test: ECDbTestProps, rows: any, colMetaData: QueryPropertyMetaData[]) {\r\n let resultCount = 0;\r\n while (resultCount < rows.length) {\r\n if (resultCount === 0 && test.columnInfo) {\r\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\r\n assert.strictEqual(colMetaData.length, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colMetaData.length}`);\r\n for (let i = 0; i < colMetaData.length; i++) {\r\n const colInfo = colMetaData[i];\r\n const expectedColInfo = test.columnInfo[i];\r\n // cannot directly compare against colInfo because it has methods instead of getters\r\n assert.strictEqual(colInfo.name, expectedColInfo.name, `Expected name ${expectedColInfo.name} but got ${colInfo.name} for column index ${i}`);\r\n if (expectedColInfo.generated !== undefined)\r\n assert.strictEqual(colInfo.generated, expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.generated} for column index ${i}`);\r\n if (expectedColInfo.accessString !== undefined)\r\n assert.strictEqual(colInfo.accessString, expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.accessString} for column index ${i}`);\r\n if (expectedColInfo.typeName !== undefined)\r\n assert.strictEqual(colInfo.typeName, expectedColInfo.typeName, `Expected type name ${expectedColInfo.typeName} but got ${colInfo.typeName} for column index ${i}`);\r\n if (expectedColInfo.className !== undefined)\r\n assert.strictEqual(colInfo.className, expectedColInfo.className, `Expected class name ${expectedColInfo.className} but got ${colInfo.className} for column index ${i}`);\r\n assert.strictEqual(colInfo.extendedType, expectedColInfo.extendedType, `Expected extended type ${expectedColInfo.extendedType} but got ${colInfo.extendedType} for column index ${i}`);\r\n assert.strictEqual(colInfo.extendType, expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType, `Expected extend type ${expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType} but got ${colInfo.extendType} for column index ${i}`); // eslint-disable-line @typescript-eslint/no-deprecated\r\n }\r\n }\r\n\r\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\r\n let expectedResult = test.expectedResults[resultCount];\r\n // replace props in expected result, TODO: optimize this\r\n expectedResult = buildBinaryData(expectedResult);\r\n\r\n const actualResult = rows[resultCount]; // TODO: should we test getValue() as well?\r\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\r\n }\r\n resultCount++;\r\n }\r\n\r\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\r\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\r\n }\r\n}\r\n\r\n/**\r\n * Shared assertion logic that operates on an already-created ECSqlReader.\r\n * Used by ECSqlReader test paths.\r\n */\r\nasync function runAssertionsOnReader(test: ECDbTestProps, reader: ECSqlReader, label: string): Promise<void> {\r\n let rows;\r\n try {\r\n rows = await reader.toArray();\r\n }\r\n catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during execution of ${label}: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n const colMetaData = await reader.getMetaData();\r\n runResultAssertions(test, rows, colMetaData);\r\n}\r\n\r\n/**\r\n * Shared assertion logic that operates on an already-created ECSqlReader.\r\n * Used by ECSqlSyncReader test paths.\r\n */\r\nfunction runAssertionsOnSyncReader(test: ECDbTestProps, reader: ECSqlSyncReader, label: string): void {\r\n let rows;\r\n try {\r\n rows = reader.toArray();\r\n }\r\n catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during execution of ${label}: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n const colMetaData = reader.getMetaData();\r\n runResultAssertions(test, rows, colMetaData);\r\n}\r\n\r\nasync function runECSqlReaderTest(test: ECDbTestProps, dataset: TestDataset): Promise<void> {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n const params = buildQueryBinder(test);\r\n const queryOptions = buildReaderQueryOptions(test);\r\n\r\n let reader: ECSqlReader;\r\n try {\r\n reader = imodel.createQueryReader(test.sql, params, queryOptions);\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during creating ECSqlReader: ${error.message}`);\r\n }\r\n\r\n await runAssertionsOnReader(test, reader, \"ECSqlReader\");\r\n}\r\n\r\nasync function runECSqlSyncReaderTest(test: ECDbTestProps, dataset: TestDataset): Promise<void> {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n const params = buildQueryBinder(test);\r\n const queryOptions = buildReaderQueryOptions(test);\r\n\r\n try {\r\n imodel.withQueryReader(test.sql, reader => {\r\n runAssertionsOnSyncReader(test, reader, \"ECSqlSyncReader\");\r\n }, params, queryOptions as SynchronousQueryOptions);\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during creating ECSqlSyncReader: ${error.message}`);\r\n }\r\n}\r\n\r\nfunction checkingExpectedResults(rowFormat: ECDbTestRowFormat, actualResult: any, expectedResult: any, indexesToInclude?: number[]) {\r\n if (rowFormat === ECDbTestRowFormat.ECSqlIndexes && indexesToInclude) {\r\n let i: any = 0;\r\n for (const key of Object.keys(expectedResult)) {\r\n assert.deepEqual(actualResult[indexesToInclude[i]], expectedResult[key], `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[indexesToInclude[i]])}`);\r\n i++;\r\n }\r\n }\r\n else {\r\n for (const key of Object.keys(expectedResult)) {\r\n assert.deepEqual(actualResult[key], expectedResult[key], `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[key])}`);\r\n }\r\n }\r\n}\r\nfunction logWarning(message: string) {\r\n // eslint-disable-next-line no-console\r\n console.log(`\\x1b[33m${message}\\x1b[0m`);\r\n}"]}
|
|
1
|
+
{"version":3,"file":"ECSqlTestRunner.test.js","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestRunner.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert } from \"chai\";\r\nimport { DbResult } from \"@itwin/core-bentley\";\r\nimport { ECSqlRowArg, ECSqlStatement, ECSqlSyncReader, SnapshotDb, SynchronousQueryOptions } from \"../../../core-backend\";\r\nimport { KnownTestLocations } from \"../../KnownTestLocations\";\r\nimport { ECSqlReader, ECSqlValueType, QueryBinder, QueryOptions, QueryPropertyMetaData, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { buildBinaryData, ECDbMarkdownTestParser, ECDbTestMode, ECDbTestProps, ECDbTestRowFormat } from \"./ECSqlTestParser\";\r\nimport * as path from \"path\";\r\nimport * as fs from \"fs\";\r\nimport { ECSqlDatasets } from \"../dataset/ECSqlDatasets\";\r\nimport { Point2d, Point3d } from \"@itwin/core-geometry\";\r\n\r\nenum TestDataset {\r\n AllProperties = \"AllProperties.bim\"\r\n}\r\n\r\nconst snapshotDbs: { [key in TestDataset]?: SnapshotDb } = {};\r\n\r\ndescribe(\"Markdown based ECDb test runner\", async () => {\r\n before(async () => {\r\n await ECSqlDatasets.generateFiles();\r\n const datasetFilePath = path.join(KnownTestLocations.outputDir, \"ECSqlTests\", TestDataset.AllProperties);\r\n if (!fs.existsSync(datasetFilePath)) {\r\n throw new Error(`Dataset file ${datasetFilePath} does not exist`);\r\n }\r\n snapshotDbs[TestDataset.AllProperties] = SnapshotDb.openFile(datasetFilePath);\r\n });\r\n\r\n after(() => {\r\n for (const key in snapshotDbs) {\r\n if (snapshotDbs.hasOwnProperty(key)) {\r\n (snapshotDbs[key as keyof typeof snapshotDbs])?.close();\r\n }\r\n }\r\n });\r\n const tests: ECDbTestProps[] = ECDbMarkdownTestParser.parse();\r\n\r\n //TODO: Mechanism to run a single test, put something like it.only into the test md which causes this loop to only run those tests\r\n for (const test of tests) {\r\n if (!test.dataset) {\r\n logWarning(`Skipping test ${test.title} because it does not have a dataset`);\r\n continue;\r\n }\r\n\r\n if (test.dataset.toLowerCase() !== TestDataset.AllProperties.toLowerCase()) {\r\n logWarning(`Skipping test ${test.title} because dataset ${test.dataset} is not recognized`);\r\n continue;\r\n }\r\n const dataset = TestDataset.AllProperties;\r\n\r\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.Statement) {\r\n if (test.skip)\r\n it(`${test.fileName}: ${test.title} (Statement) skipped. Reason: ${test.skip}`);\r\n else if (test.only)\r\n it.only(`${test.fileName}: ${test.title} (Statement)`, () => {\r\n runECSqlStatementTest(test, dataset);\r\n });\r\n else\r\n it(`${test.fileName}: ${test.title} (Statement)`, () => {\r\n runECSqlStatementTest(test, dataset);\r\n });\r\n }\r\n\r\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.QueryReader) {\r\n if (test.skip) {\r\n it(`${test.fileName}: ${test.title} (ECSqlReader) skipped. Reason: ${test.skip}`);\r\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader) skipped. Reason: ${test.skip}`);\r\n }\r\n else if (test.only) {\r\n it.only(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {\r\n await runECSqlReaderTest(test, dataset);\r\n });\r\n it.only(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {\r\n await runECSqlSyncReaderTest(test, dataset);\r\n });\r\n }\r\n else {\r\n it(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {\r\n await runECSqlReaderTest(test, dataset);\r\n });\r\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {\r\n await runECSqlSyncReaderTest(test, dataset);\r\n });\r\n }\r\n }\r\n }\r\n});\r\n\r\nfunction runECSqlStatementTest(test: ECDbTestProps, dataset: TestDataset) {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n let stmt: ECSqlStatement | undefined;\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n try {\r\n // TODO: statement options should be exposed through the markdown\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n stmt = imodel.prepareStatement(test.sql); // TODO: Wire up logic for tests we expect to fail during prepare\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during prepare of Statement: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n try {\r\n if (test.binders !== undefined) {\r\n for (const binder of test.binders) {\r\n // eslint-disable-next-line radix\r\n let id: number | string = Number.parseInt(binder.indexOrName);\r\n if (isNaN(id))\r\n id = binder.indexOrName;\r\n\r\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\r\n case \"null\":\r\n stmt.bindNull(id);\r\n break;\r\n case \"string\":\r\n stmt.bindString(id, binder.value);\r\n break;\r\n case \"int\":\r\n // eslint-disable-next-line radix\r\n stmt.bindInteger(id, Number.parseInt(binder.value));\r\n break;\r\n case \"double\":\r\n stmt.bindDouble(id, Number.parseFloat(binder.value));\r\n break;\r\n case \"id\":\r\n stmt.bindId(id, binder.value);\r\n break;\r\n case \"idset\":\r\n const values: string[] = binder.value.slice(1, -1).split(\",\");\r\n const trimmedValues = values.map((value: string) =>\r\n value.trim()\r\n );\r\n stmt.bindIdSet(id, trimmedValues);\r\n break;\r\n case \"datetime\":\r\n stmt.bindDateTime(id, binder.value);\r\n break;\r\n case \"point2d\":\r\n const parsedVal2d = JSON.parse(binder.value);\r\n stmt.bindPoint2d(id, { x: parsedVal2d.X, y: parsedVal2d.Y });\r\n break;\r\n case \"point3d\":\r\n const parsedVal3d = JSON.parse(binder.value);\r\n stmt.bindPoint3d(id, { x: parsedVal3d.X, y: parsedVal3d.Y, z: parsedVal3d.Z });\r\n break;\r\n case \"blob\":\r\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\r\n const numbers = arrayValues.map((value: string) =>\r\n // eslint-disable-next-line radix\r\n parseInt(value.trim())\r\n );\r\n stmt.bindBlob(id, Uint8Array.of(...numbers));\r\n break;\r\n case \"navigation\":\r\n stmt.bindNavigation(id, JSON.parse(binder.value));\r\n break;\r\n case \"array\":\r\n stmt.bindArray(id, JSON.parse(binder.value));\r\n break;\r\n case \"struct\":\r\n stmt.bindStruct(id, JSON.parse(binder.value));\r\n break;\r\n default:\r\n assert.fail(`Unsupported binder type ${binder.type}`);\r\n } // switch binder.type\r\n } // for binder\r\n } // if test.binders\r\n\r\n let resultCount = 0;\r\n let stepResult: DbResult;\r\n while ((stepResult = stmt.step()) === DbResult.BE_SQLITE_ROW) {\r\n if (resultCount === 0 && test.columnInfo) {\r\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\r\n const colCount = stmt.getColumnCount();\r\n assert.strictEqual(colCount, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colCount}`);\r\n for (let i = 0; i < colCount; i++) {\r\n const colInfo = stmt.getValue(i).columnInfo;\r\n const expectedColInfo = test.columnInfo[i];\r\n // cannot directly compare against colInfo because it has methods instead of getters\r\n assert.strictEqual(colInfo.getPropertyName(), expectedColInfo.name, `Expected property name ${expectedColInfo.name} but got ${colInfo.getPropertyName()} for column index ${i}`);\r\n //if (expectedColInfo.isDynamicProp !== undefined) TODO: Is this not exposed?\r\n // assert.strictEqual(colInfo..isDynamicProperty, expectedColInfo.isDynamicProp, `Expected dynamic property ${expectedColInfo.isDynamicProp} but got ${colInfo.isDynamicProperty} for column index ${i}`);\r\n // TODO: Extended type name not exposed??\r\n if (expectedColInfo.generated !== undefined)\r\n assert.strictEqual(colInfo.isGeneratedProperty(), expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.isGeneratedProperty()} for column index ${i}`);\r\n if (expectedColInfo.accessString !== undefined)\r\n assert.strictEqual(colInfo.getAccessString(), expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.getAccessString()} for column index ${i}`);\r\n if (expectedColInfo.type !== undefined)\r\n assert.strictEqual(ECSqlValueType[colInfo.getType()], expectedColInfo.type, `Expected type ${expectedColInfo.type} but got ${ECSqlValueType[colInfo.getType()]} for column index ${i}`);\r\n if (expectedColInfo.originPropertyName !== undefined)\r\n assert.strictEqual(colInfo.getOriginPropertyName(), expectedColInfo.originPropertyName, `Expected Origin PropertyName ${expectedColInfo.originPropertyName} but got ${colInfo.getOriginPropertyName()} for column index ${i}`);\r\n }\r\n }\r\n\r\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\r\n let expectedResult = test.expectedResults[resultCount];\r\n expectedResult = buildBinaryData(expectedResult);\r\n const rowArgs: ECSqlRowArg = { rowFormat: getRowFormat(test.rowFormat), classIdsToClassNames: test.convertClassIdsToClassNames };\r\n const actualResult = stmt.getRow(rowArgs);\r\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\r\n }\r\n resultCount++;\r\n }\r\n stmt[Symbol.dispose]();\r\n stmt = undefined;\r\n\r\n if (resultCount === 0 && test.stepStatus) {\r\n const stepResultString = DbResult[stepResult];\r\n assert.strictEqual(stepResultString, test.stepStatus, `Expected step status ${test.stepStatus} but got ${stepResultString}`);\r\n }\r\n\r\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\r\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\r\n }\r\n } finally {\r\n if (stmt !== undefined)\r\n stmt[Symbol.dispose]();\r\n }\r\n}\r\n\r\nfunction getRowFormat(rowFormat: ECDbTestRowFormat): QueryRowFormat {\r\n switch (rowFormat) {\r\n case ECDbTestRowFormat.ECSqlNames:\r\n return QueryRowFormat.UseECSqlPropertyNames;\r\n case ECDbTestRowFormat.ECSqlIndexes:\r\n return QueryRowFormat.UseECSqlPropertyIndexes;\r\n case ECDbTestRowFormat.JsNames:\r\n return QueryRowFormat.UseJsPropertyNames;\r\n default:\r\n return QueryRowFormat.UseECSqlPropertyNames;\r\n }\r\n}\r\n\r\n/** Builds a QueryBinder from the test's binder definitions. Returns undefined when the test has no binders. */\r\nfunction buildQueryBinder(test: ECDbTestProps): QueryBinder | undefined {\r\n if (test.binders === undefined)\r\n return undefined;\r\n\r\n const params = new QueryBinder();\r\n for (const binder of test.binders) {\r\n // eslint-disable-next-line radix\r\n let id: number | string = Number.parseInt(binder.indexOrName);\r\n if (isNaN(id))\r\n id = binder.indexOrName;\r\n\r\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\r\n case \"null\":\r\n params.bindNull(id);\r\n break;\r\n case \"string\":\r\n params.bindString(id, binder.value);\r\n break;\r\n case \"int\":\r\n // eslint-disable-next-line radix\r\n params.bindInt(id, Number.parseInt(binder.value));\r\n break;\r\n case \"long\":\r\n // eslint-disable-next-line radix\r\n params.bindLong(id, Number.parseInt(binder.value));\r\n break;\r\n case \"double\":\r\n params.bindDouble(id, Number.parseFloat(binder.value));\r\n break;\r\n case \"id\":\r\n params.bindId(id, binder.value);\r\n break;\r\n case \"idset\":\r\n const values: string[] = binder.value.slice(1, -1).split(\",\");\r\n const trimmedValues = values.map((value: string) =>\r\n value.trim()\r\n );\r\n params.bindIdSet(id, trimmedValues);\r\n break;\r\n case \"point2d\":\r\n const parsedVal2d = JSON.parse(binder.value);\r\n params.bindPoint2d(id, new Point2d(parsedVal2d.X, parsedVal2d.Y));\r\n break;\r\n case \"point3d\":\r\n const parsedVal3d = JSON.parse(binder.value);\r\n params.bindPoint3d(id, new Point3d(parsedVal3d.X, parsedVal3d.Y, parsedVal3d.Z));\r\n break;\r\n case \"blob\":\r\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\r\n const numbers = arrayValues.map((value: string) =>\r\n // eslint-disable-next-line radix\r\n parseInt(value.trim())\r\n );\r\n params.bindBlob(id, Uint8Array.of(...numbers));\r\n break;\r\n case \"struct\":\r\n params.bindStruct(id, JSON.parse(binder.value));\r\n break;\r\n default:\r\n assert.fail(`Unsupported binder type ${binder.type}`);\r\n } // switch binder.type\r\n } // for binder\r\n return params;\r\n}\r\n\r\n/** Builds the common query options object from the test configuration. */\r\nfunction buildReaderQueryOptions(test: ECDbTestProps): QueryOptions {\r\n const queryOptions: QueryOptions = {};\r\n queryOptions.rowFormat = getRowFormat(test.rowFormat);\r\n if (test.abbreviateBlobs)\r\n queryOptions.abbreviateBlobs = true;\r\n if (test.convertClassIdsToClassNames) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n queryOptions.convertClassIdsToClassNames = true;\r\n }\r\n return queryOptions;\r\n}\r\n\r\n/**\r\n * Shared assertion logic for QueryReader tests that operates on the result rows and column metadata.\r\n * Used by both ECSqlReader and ECSqlSyncReader test paths.\r\n */\r\nfunction runResultAssertions(test: ECDbTestProps, rows: any, colMetaData: QueryPropertyMetaData[]) {\r\n let resultCount = 0;\r\n while (resultCount < rows.length) {\r\n if (resultCount === 0 && test.columnInfo) {\r\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\r\n assert.strictEqual(colMetaData.length, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colMetaData.length}`);\r\n for (let i = 0; i < colMetaData.length; i++) {\r\n const colInfo = colMetaData[i];\r\n const expectedColInfo = test.columnInfo[i];\r\n // cannot directly compare against colInfo because it has methods instead of getters\r\n assert.strictEqual(colInfo.name, expectedColInfo.name, `Expected name ${expectedColInfo.name} but got ${colInfo.name} for column index ${i}`);\r\n if (expectedColInfo.generated !== undefined)\r\n assert.strictEqual(colInfo.generated, expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.generated} for column index ${i}`);\r\n if (expectedColInfo.accessString !== undefined)\r\n assert.strictEqual(colInfo.accessString, expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.accessString} for column index ${i}`);\r\n if (expectedColInfo.typeName !== undefined)\r\n assert.strictEqual(colInfo.typeName, expectedColInfo.typeName, `Expected type name ${expectedColInfo.typeName} but got ${colInfo.typeName} for column index ${i}`);\r\n if (expectedColInfo.className !== undefined)\r\n assert.strictEqual(colInfo.className, expectedColInfo.className, `Expected class name ${expectedColInfo.className} but got ${colInfo.className} for column index ${i}`);\r\n assert.strictEqual(colInfo.extendedType, expectedColInfo.extendedType, `Expected extended type ${expectedColInfo.extendedType} but got ${colInfo.extendedType} for column index ${i}`);\r\n assert.strictEqual(colInfo.extendType, expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType, `Expected extend type ${expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType} but got ${colInfo.extendType} for column index ${i}`); // eslint-disable-line @typescript-eslint/no-deprecated\r\n }\r\n }\r\n\r\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\r\n let expectedResult = test.expectedResults[resultCount];\r\n // replace props in expected result, TODO: optimize this\r\n expectedResult = buildBinaryData(expectedResult);\r\n\r\n const actualResult = rows[resultCount]; // TODO: should we test getValue() as well?\r\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\r\n }\r\n resultCount++;\r\n }\r\n\r\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\r\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\r\n }\r\n}\r\n\r\n/**\r\n * Shared assertion logic that operates on an already-created ECSqlReader.\r\n * Used by ECSqlReader test paths.\r\n */\r\nasync function runAssertionsOnReader(test: ECDbTestProps, reader: ECSqlReader, label: string): Promise<void> {\r\n let rows;\r\n try {\r\n rows = await reader.toArray();\r\n }\r\n catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during execution of ${label}: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n const colMetaData = await reader.getMetaData();\r\n runResultAssertions(test, rows, colMetaData);\r\n}\r\n\r\n/**\r\n * Shared assertion logic that operates on an already-created ECSqlReader.\r\n * Used by ECSqlSyncReader test paths.\r\n */\r\nfunction runAssertionsOnSyncReader(test: ECDbTestProps, reader: ECSqlSyncReader, label: string): void {\r\n let rows;\r\n try {\r\n rows = reader.toArray();\r\n }\r\n catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during execution of ${label}: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n const colMetaData = reader.getMetaData();\r\n runResultAssertions(test, rows, colMetaData);\r\n}\r\n\r\nasync function runECSqlReaderTest(test: ECDbTestProps, dataset: TestDataset): Promise<void> {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n const params = buildQueryBinder(test);\r\n const queryOptions = buildReaderQueryOptions(test);\r\n\r\n let reader: ECSqlReader;\r\n try {\r\n reader = imodel.createQueryReader(test.sql, params, queryOptions);\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during creating ECSqlReader: ${error.message}`);\r\n }\r\n\r\n await runAssertionsOnReader(test, reader, \"ECSqlReader\");\r\n}\r\n\r\nasync function runECSqlSyncReaderTest(test: ECDbTestProps, dataset: TestDataset): Promise<void> {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n const params = buildQueryBinder(test);\r\n const queryOptions = buildReaderQueryOptions(test);\r\n\r\n try {\r\n imodel.withQueryReader(test.sql, reader => {\r\n runAssertionsOnSyncReader(test, reader, \"ECSqlSyncReader\");\r\n }, params, queryOptions as SynchronousQueryOptions);\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during creating ECSqlSyncReader: ${error.message}`);\r\n }\r\n}\r\n\r\nfunction checkingExpectedResults(rowFormat: ECDbTestRowFormat, actualResult: any, expectedResult: any, indexesToInclude?: number[]) {\r\n if (rowFormat === ECDbTestRowFormat.ECSqlIndexes && indexesToInclude) {\r\n let i: any = 0;\r\n for (const key of Object.keys(expectedResult)) {\r\n const expected = typeof expectedResult[key] === \"string\" ? expectedResult[key].trim() : expectedResult[key];\r\n const actual = typeof actualResult[indexesToInclude[i]] === \"string\" ? actualResult[indexesToInclude[i]].trim() : actualResult[indexesToInclude[i]];\r\n assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[indexesToInclude[i]])}`);\r\n i++;\r\n }\r\n }\r\n else {\r\n for (const key of Object.keys(expectedResult)) {\r\n const expected = typeof expectedResult[key] === \"string\" ? expectedResult[key].trim() : expectedResult[key];\r\n const actual = typeof actualResult[key] === \"string\" ? actualResult[key].trim() : actualResult[key];\r\n assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[key])}`);\r\n }\r\n }\r\n}\r\nfunction logWarning(message: string) {\r\n // eslint-disable-next-line no-console\r\n console.log(`\\x1b[33m${message}\\x1b[0m`);\r\n}"]}
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
import { assert } from "chai";
|
|
5
|
+
import { assert, expect } from "chai";
|
|
6
6
|
import { _nativeDb, IModelJsFs, StandaloneDb } from "../../core-backend";
|
|
7
7
|
import { IModelTestUtils } from "../IModelTestUtils";
|
|
8
|
+
import { Code, IModel } from "@itwin/core-common";
|
|
8
9
|
describe("StandaloneDb", () => {
|
|
9
10
|
describe("transaction flags", () => {
|
|
10
11
|
it("should enable transactions with legacy allowEdit string flag", () => {
|
|
@@ -98,6 +99,55 @@ describe("StandaloneDb", () => {
|
|
|
98
99
|
iModel.close();
|
|
99
100
|
IModelJsFs.removeSync(fileName);
|
|
100
101
|
});
|
|
102
|
+
it("should delete txns on close", async () => {
|
|
103
|
+
const fileName = IModelTestUtils.prepareOutputFile("StandaloneDb", "DeleteTxnsOnClose.bim");
|
|
104
|
+
// Create with transactions explicitly enabled
|
|
105
|
+
const iModel = StandaloneDb.createEmpty(fileName, {
|
|
106
|
+
rootSubject: { name: "Test" },
|
|
107
|
+
enableTransactions: true,
|
|
108
|
+
});
|
|
109
|
+
const schema1 = `<?xml version="1.0" encoding="UTF-8"?>
|
|
110
|
+
<ECSchema schemaName="TestDomain" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
|
|
111
|
+
<ECSchemaReference name="BisCore" version="01.00.00" alias="bis"/>
|
|
112
|
+
<ECEntityClass typeName="a1">
|
|
113
|
+
<BaseClass>bis:GraphicalElement2d</BaseClass>
|
|
114
|
+
<ECProperty propertyName="prop1" typeName="string" />
|
|
115
|
+
</ECEntityClass>
|
|
116
|
+
<ECEntityClass typeName="A1Recipe2d">
|
|
117
|
+
<BaseClass>bis:TemplateRecipe2d</BaseClass>
|
|
118
|
+
<ECProperty propertyName="prop1" typeName="string" />
|
|
119
|
+
</ECEntityClass>
|
|
120
|
+
<ECRelationshipClass typeName="A1OwnsA1" modifier="None" strength="embedding">
|
|
121
|
+
<BaseClass>bis:ElementOwnsChildElements</BaseClass>
|
|
122
|
+
<Source multiplicity="(0..1)" roleLabel="owns" polymorphic="true">
|
|
123
|
+
<Class class="a1"/>
|
|
124
|
+
</Source>
|
|
125
|
+
<Target multiplicity="(0..*)" roleLabel="is owned by" polymorphic="false">
|
|
126
|
+
<Class class="a1"/>
|
|
127
|
+
</Target>
|
|
128
|
+
</ECRelationshipClass>
|
|
129
|
+
</ECSchema>`;
|
|
130
|
+
await iModel.importSchemaStrings([schema1]);
|
|
131
|
+
iModel.saveChanges();
|
|
132
|
+
const e1 = iModel.elements.insertElement({
|
|
133
|
+
classFullName: "TestDomain:A1Recipe2d",
|
|
134
|
+
model: IModel.dictionaryId,
|
|
135
|
+
code: Code.createEmpty(),
|
|
136
|
+
});
|
|
137
|
+
iModel.saveChanges(`inserted element ${e1}`);
|
|
138
|
+
expect(iModel.txns.hasPendingTxns).to.be.true;
|
|
139
|
+
// load up concurrent queries to ensure they are shutdown on close
|
|
140
|
+
const reader = iModel.createQueryReader(`SELECT [ECInstanceId] as [id] FROM [TestDomain]:[A1Recipe2d]`);
|
|
141
|
+
await reader.step();
|
|
142
|
+
expect(reader.current.id).to.equal(e1);
|
|
143
|
+
// should delete pending txns on close without error
|
|
144
|
+
iModel.close();
|
|
145
|
+
const reopened = StandaloneDb.openFile(fileName);
|
|
146
|
+
expect(reopened.txns.hasPendingTxns).to.be.false;
|
|
147
|
+
expect(() => reopened.elements.getElement(e1)).to.not.throw();
|
|
148
|
+
reopened.close();
|
|
149
|
+
IModelJsFs.removeSync(fileName);
|
|
150
|
+
});
|
|
101
151
|
});
|
|
102
152
|
});
|
|
103
153
|
//# sourceMappingURL=StandaloneDb.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StandaloneDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/StandaloneDb.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert } from \"chai\";\r\nimport { _nativeDb, IModelJsFs, StandaloneDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\n\r\ndescribe(\"StandaloneDb\", () => {\r\n\r\n describe(\"transaction flags\", () => {\r\n\r\n it(\"should enable transactions with legacy allowEdit string flag\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"AllowEditString.bim\");\r\n\r\n // Create with allowEdit set to any truthy string value\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n allowEdit: \"any string value\",\r\n });\r\n\r\n // Verify the flag is set correctly in the database\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.equal(value, `{ \"txns\": true }`);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should enable transactions with legacy allowEdit JSON string\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"AllowEditJSON.bim\");\r\n\r\n // Create with allowEdit using the traditional JSON.stringify pattern\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n allowEdit: JSON.stringify({ txns: true }),\r\n });\r\n\r\n // Verify the flag is set correctly\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.equal(value, `{ \"txns\": true }`);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should enable transactions with new enableTransactions boolean flag\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"EnableTransactions.bim\");\r\n\r\n // Create with the new boolean flag\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n enableTransactions: true,\r\n });\r\n\r\n // Verify the flag is set correctly\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.equal(value, `{ \"txns\": true }`);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should enable transactions when either flag is set\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"BothFlags.bim\");\r\n\r\n // Create with both flags set\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n allowEdit: \"legacy\",\r\n enableTransactions: true,\r\n });\r\n\r\n // Verify the flag is set correctly\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.equal(value, `{ \"txns\": true }`);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should enable transactions with enableTransactions true even if allowEdit is undefined\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"OnlyEnableTransactions.bim\");\r\n\r\n // Create with only the new flag\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n enableTransactions: true,\r\n });\r\n\r\n // Verify the flag is set correctly\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.equal(value, `{ \"txns\": true }`);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should not enable transactions when both flags are false/undefined\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"NoFlags.bim\");\r\n\r\n // Create without enabling transactions\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n enableTransactions: false,\r\n });\r\n\r\n // Verify the flag is not set\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.isUndefined(value);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should not enable transactions when no flags are provided\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"NoFlagsDefault.bim\");\r\n\r\n // Create without any edit flags\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n });\r\n\r\n // Verify the flag is not set\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.isUndefined(value);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n });\r\n\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"StandaloneDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/StandaloneDb.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, expect } from \"chai\";\r\nimport { _nativeDb, IModelJsFs, StandaloneDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { Code, IModel } from \"@itwin/core-common\";\r\n\r\ndescribe(\"StandaloneDb\", () => {\r\n\r\n describe(\"transaction flags\", () => {\r\n\r\n it(\"should enable transactions with legacy allowEdit string flag\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"AllowEditString.bim\");\r\n\r\n // Create with allowEdit set to any truthy string value\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n allowEdit: \"any string value\",\r\n });\r\n\r\n // Verify the flag is set correctly in the database\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.equal(value, `{ \"txns\": true }`);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should enable transactions with legacy allowEdit JSON string\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"AllowEditJSON.bim\");\r\n\r\n // Create with allowEdit using the traditional JSON.stringify pattern\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n allowEdit: JSON.stringify({ txns: true }),\r\n });\r\n\r\n // Verify the flag is set correctly\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.equal(value, `{ \"txns\": true }`);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should enable transactions with new enableTransactions boolean flag\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"EnableTransactions.bim\");\r\n\r\n // Create with the new boolean flag\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n enableTransactions: true,\r\n });\r\n\r\n // Verify the flag is set correctly\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.equal(value, `{ \"txns\": true }`);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should enable transactions when either flag is set\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"BothFlags.bim\");\r\n\r\n // Create with both flags set\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n allowEdit: \"legacy\",\r\n enableTransactions: true,\r\n });\r\n\r\n // Verify the flag is set correctly\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.equal(value, `{ \"txns\": true }`);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should enable transactions with enableTransactions true even if allowEdit is undefined\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"OnlyEnableTransactions.bim\");\r\n\r\n // Create with only the new flag\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n enableTransactions: true,\r\n });\r\n\r\n // Verify the flag is set correctly\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.equal(value, `{ \"txns\": true }`);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should not enable transactions when both flags are false/undefined\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"NoFlags.bim\");\r\n\r\n // Create without enabling transactions\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n enableTransactions: false,\r\n });\r\n\r\n // Verify the flag is not set\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.isUndefined(value);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should not enable transactions when no flags are provided\", () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"NoFlagsDefault.bim\");\r\n\r\n // Create without any edit flags\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n });\r\n\r\n // Verify the flag is not set\r\n const value = iModel[_nativeDb].queryLocalValue(\"StandaloneEdit\");\r\n assert.isUndefined(value);\r\n\r\n iModel.close();\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n\r\n it(\"should delete txns on close\", async() => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"StandaloneDb\", \"DeleteTxnsOnClose.bim\");\r\n\r\n // Create with transactions explicitly enabled\r\n const iModel = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"Test\" },\r\n enableTransactions: true,\r\n });\r\n\r\n const schema1 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\r\n <ECSchemaReference name=\"BisCore\" version=\"01.00.00\" alias=\"bis\"/>\r\n <ECEntityClass typeName=\"a1\">\r\n <BaseClass>bis:GraphicalElement2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n </ECEntityClass>\r\n <ECEntityClass typeName=\"A1Recipe2d\">\r\n <BaseClass>bis:TemplateRecipe2d</BaseClass>\r\n <ECProperty propertyName=\"prop1\" typeName=\"string\" />\r\n </ECEntityClass>\r\n <ECRelationshipClass typeName=\"A1OwnsA1\" modifier=\"None\" strength=\"embedding\">\r\n <BaseClass>bis:ElementOwnsChildElements</BaseClass>\r\n <Source multiplicity=\"(0..1)\" roleLabel=\"owns\" polymorphic=\"true\">\r\n <Class class=\"a1\"/>\r\n </Source>\r\n <Target multiplicity=\"(0..*)\" roleLabel=\"is owned by\" polymorphic=\"false\">\r\n <Class class=\"a1\"/>\r\n </Target>\r\n </ECRelationshipClass>\r\n </ECSchema>`;\r\n\r\n await iModel.importSchemaStrings([schema1]);\r\n iModel.saveChanges();\r\n\r\n const e1 = iModel.elements.insertElement({\r\n classFullName: \"TestDomain:A1Recipe2d\",\r\n model: IModel.dictionaryId,\r\n code: Code.createEmpty(),\r\n });\r\n\r\n iModel.saveChanges(`inserted element ${e1}`);\r\n expect(iModel.txns.hasPendingTxns).to.be.true;\r\n\r\n // load up concurrent queries to ensure they are shutdown on close\r\n const reader = iModel.createQueryReader(\r\n `SELECT [ECInstanceId] as [id] FROM [TestDomain]:[A1Recipe2d]`\r\n );\r\n\r\n await reader.step();\r\n expect(reader.current.id).to.equal(e1);\r\n\r\n // should delete pending txns on close without error\r\n iModel.close();\r\n\r\n const reopened = StandaloneDb.openFile(fileName);\r\n expect(reopened.txns.hasPendingTxns).to.be.false;\r\n expect(() => reopened.elements.getElement(e1)).to.not.throw();\r\n reopened.close();\r\n\r\n IModelJsFs.removeSync(fileName);\r\n });\r\n });\r\n\r\n});\r\n"]}
|
|
@@ -163,5 +163,58 @@ describe("WorkspaceFile", () => {
|
|
|
163
163
|
fontsDb.addFile("Helvetica.ttf", schemaFile, "ttf");
|
|
164
164
|
fontsDb.close();
|
|
165
165
|
});
|
|
166
|
+
describe("getContainerAsync token resolution", () => {
|
|
167
|
+
afterEach(() => sinon.restore());
|
|
168
|
+
it("preserves an explicitly-provided accessToken", async () => {
|
|
169
|
+
const requestTokenStub = sinon.stub(CloudSqlite, "requestToken").rejects(new Error("should not be called"));
|
|
170
|
+
const getContainerSpy = sinon.spy(workspace, "getContainer");
|
|
171
|
+
const props = {
|
|
172
|
+
containerId: "explicit-token-test",
|
|
173
|
+
baseUri: "https://some-cloud-uri",
|
|
174
|
+
storageType: "azure",
|
|
175
|
+
accessToken: "my-explicit-token",
|
|
176
|
+
};
|
|
177
|
+
try {
|
|
178
|
+
await workspace.getContainerAsync(props);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// expected — no real cloud endpoint
|
|
182
|
+
}
|
|
183
|
+
expect(requestTokenStub.called).to.be.false;
|
|
184
|
+
expect(getContainerSpy.calledOnce).to.be.true;
|
|
185
|
+
expect(getContainerSpy.firstCall.args[0].accessToken).to.equal("my-explicit-token");
|
|
186
|
+
});
|
|
187
|
+
it("uses empty token for local containers with empty baseUri", async () => {
|
|
188
|
+
const requestTokenStub = sinon.stub(CloudSqlite, "requestToken").rejects(new Error("should not be called"));
|
|
189
|
+
const getContainerSpy = sinon.spy(workspace, "getContainer");
|
|
190
|
+
const props = {
|
|
191
|
+
containerId: "local-token-test",
|
|
192
|
+
baseUri: "",
|
|
193
|
+
storageType: "azure",
|
|
194
|
+
};
|
|
195
|
+
await workspace.getContainerAsync(props);
|
|
196
|
+
expect(requestTokenStub.called).to.be.false;
|
|
197
|
+
expect(getContainerSpy.calledOnce).to.be.true;
|
|
198
|
+
expect(getContainerSpy.firstCall.args[0].accessToken).to.equal("");
|
|
199
|
+
});
|
|
200
|
+
it("calls requestToken when no accessToken is provided for a cloud container", async () => {
|
|
201
|
+
const requestTokenStub = sinon.stub(CloudSqlite, "requestToken").resolves("resolved-token");
|
|
202
|
+
const getContainerSpy = sinon.spy(workspace, "getContainer");
|
|
203
|
+
const props = {
|
|
204
|
+
containerId: "cloud-no-token-test",
|
|
205
|
+
baseUri: "https://some-cloud-uri",
|
|
206
|
+
storageType: "azure",
|
|
207
|
+
};
|
|
208
|
+
try {
|
|
209
|
+
await workspace.getContainerAsync(props);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
// expected — no real cloud endpoint
|
|
213
|
+
}
|
|
214
|
+
expect(requestTokenStub.calledOnce).to.be.true;
|
|
215
|
+
expect(getContainerSpy.calledOnce).to.be.true;
|
|
216
|
+
expect(getContainerSpy.firstCall.args[0].accessToken).to.equal("resolved-token");
|
|
217
|
+
});
|
|
218
|
+
});
|
|
166
219
|
});
|
|
167
220
|
//# sourceMappingURL=Workspace.test.js.map
|