diff --git a/src/linter/LinterContext.ts b/src/linter/LinterContext.ts index 6baf1df9e..9378f5a49 100644 --- a/src/linter/LinterContext.ts +++ b/src/linter/LinterContext.ts @@ -95,6 +95,7 @@ export interface PositionRange { export interface LintMetadata { // The metadata holds information to be shared across linters directives: Set; + transformedImports: Map>; } export default class LinterContext { diff --git a/src/linter/html/transpiler.ts b/src/linter/html/transpiler.ts index 9aebfd09f..d88772290 100644 --- a/src/linter/html/transpiler.ts +++ b/src/linter/html/transpiler.ts @@ -21,6 +21,8 @@ export default async function transpileHtml( lintBootstrapAttributes(bootstrapTag, report); } + detectTestStarter(resourcePath, scriptTags, context); + scriptTags.forEach((tag) => { // Tags with src attribute do not parse and run inline code const hasSrc = tag.attributes.some((attr) => { @@ -52,6 +54,26 @@ export default async function transpileHtml( } } +function detectTestStarter(resourcePath: ResourcePath, scriptTags: Tag[], context: LinterContext) { + const shouldBeMigrated = scriptTags.some((tag) => { + const isTestsuiteQunitFile = /testsuite(?:\.[a-z][a-z0-9-]*)*\.qunit\.html$/.test(resourcePath); + return (isTestsuiteQunitFile && !tag.attributes.some((attr) => { + return attr.name.value.toLowerCase() === "src" && + (attr.value.value.endsWith("/resources/sap/ui/test/starter/createSuite.js") || + attr.value.value === "resources/sap/ui/test/starter/createSuite.js"); + })) || + (!isTestsuiteQunitFile && resourcePath.endsWith("qunit.html") && !tag.attributes.some((attr) => { + return attr.name.value.toLowerCase() === "src" && + (attr.value.value.endsWith("/resources/sap/ui/test/starter/runTest.js") || + attr.value.value === "resources/sap/ui/test/starter/runTest.js"); + })); + }); + + if (shouldBeMigrated) { + context.addLintingMessage(resourcePath, MESSAGE.PREFER_TEST_STARTER, undefined as never); + } +} + function findBootstrapTag(tags: Tag[]): Tag | undefined { // First search for script tag with id "sap-ui-bootstrap" for (const tag of tags) { diff --git a/src/linter/messages.ts b/src/linter/messages.ts index 0e7989ea3..048c9c5b6 100644 --- a/src/linter/messages.ts +++ b/src/linter/messages.ts @@ -12,6 +12,7 @@ const RULES = { "no-pseudo-modules": "no-pseudo-modules", "parsing-error": "parsing-error", "ui5-class-declaration": "ui5-class-declaration", + "prefer-test-starter": "prefer-test-starter", } as const; export enum LintMessageSeverity { @@ -63,6 +64,7 @@ export enum MESSAGE { PARTIALLY_DEPRECATED_ODATA_MODEL_V2_CREATE_ENTRY, PARTIALLY_DEPRECATED_ODATA_MODEL_V2_CREATE_ENTRY_PROPERTIES_ARRAY, PARTIALLY_DEPRECATED_PARAMETERS_GET, + PREFER_TEST_STARTER, REDUNDANT_BOOTSTRAP_PARAM, REDUNDANT_BOOTSTRAP_PARAM_ERROR, REDUNDANT_VIEW_CONFIG_PROPERTY, @@ -550,6 +552,15 @@ export const MESSAGE_INFO = { }, }, + [MESSAGE.PREFER_TEST_STARTER]: { + severity: LintMessageSeverity.Warning, + ruleId: RULES["prefer-test-starter"], + + message: () => "To save boilerplate code and ensure compliance with UI5 2.x best practices," + + " please migrate to the Test Starter concept", + details: () => "{@link topic:032be2cb2e1d4115af20862673bedcdb Test Starter}", + }, + [MESSAGE.REPLACED_BOOTSTRAP_PARAM]: { severity: LintMessageSeverity.Error, ruleId: RULES["no-deprecated-api"], diff --git a/src/linter/ui5Types/SourceFileLinter.ts b/src/linter/ui5Types/SourceFileLinter.ts index 8f362c170..d19cf6907 100644 --- a/src/linter/ui5Types/SourceFileLinter.ts +++ b/src/linter/ui5Types/SourceFileLinter.ts @@ -15,6 +15,10 @@ import {findDirectives} from "./directives.js"; const log = getLogger("linter:ui5Types:SourceFileLinter"); +// This is the same check as in the framework and prevents false-positives +// https://github.com/SAP/openui5/blob/32c21c33d9dc29a32bf7ee7f41d7bae23dcf086b/src/sap.ui.core/src/sap/ui/test/starter/_utils.js#L287 +const VALID_TESTSUITE = /^\/testsuite(?:\.[a-z][a-z0-9-]*)*\.qunit\.(?:js|ts)$/; + interface DeprecationInfo { symbol: ts.Symbol; messageDetails: string; @@ -58,6 +62,7 @@ export default class SourceFileLinter { #boundVisitNode: (node: ts.Node) => void; #fileName: string; #isComponent: boolean; + #hasTestStarterFindings: boolean; constructor( private context: LinterContext, @@ -76,6 +81,7 @@ export default class SourceFileLinter { this.#boundVisitNode = this.visitNode.bind(this); this.#fileName = path.basename(resourcePath); this.#isComponent = this.#fileName === "Component.js" || this.#fileName === "Component.ts"; + this.#hasTestStarterFindings = false; } // eslint-disable-next-line @typescript-eslint/require-await @@ -88,6 +94,12 @@ export default class SourceFileLinter { findDirectives(this.sourceFile, metadata); } this.visitNode(this.sourceFile); + + if (this.sourceFile.fileName.endsWith(".qunit.js") && // TS files do not have sap.ui.define + !metadata?.transformedImports?.get("sap.ui.define")) { + this.#reportTestStarter(this.sourceFile); + } + this.#reporter.deduplicateMessages(); } catch (err) { const message = err instanceof Error ? err.message : String(err); @@ -642,6 +654,13 @@ export default class SourceFileLinter { } analyzeNewExpression(node: ts.NewExpression) { + if (/\.qunit\.(js|ts)$/.test(this.sourceFile.fileName) && + ((ts.isPropertyAccessExpression(node.expression) && node.expression.name.getText() === "jsUnitTestSuite") || + (ts.isIdentifier(node.expression) && node.expression.getText() === "jsUnitTestSuite") + )) { + this.#reportTestStarter(node); + } + const nodeType = this.checker.getTypeAtLocation(node); // checker.getContextualType(node); if (!nodeType.symbol || !this.isSymbolOfUi5OrThirdPartyType(nodeType.symbol)) { return; @@ -790,6 +809,9 @@ export default class SourceFileLinter { this.#analyzeMobileInit(node); } else if (symbolName === "setTheme" && moduleName === "sap/ui/core/Theming") { this.#analyzeThemingSetTheme(node); + } else if (/\.qunit\.(js|ts)$/.test(this.sourceFile.fileName) && + symbolName === "ready" && moduleName === "sap/ui/core/Core") { + this.#reportTestStarter(node); } } @@ -826,11 +848,17 @@ export default class SourceFileLinter { } } + const propName = getPropertyName(reportNode); + this.#reporter.addMessage(MESSAGE.DEPRECATED_FUNCTION_CALL, { - functionName: getPropertyName(reportNode), + functionName: propName, additionalMessage, details: deprecationInfo.messageDetails, }, reportNode); + + if (propName === "attachInit" && /\.qunit\.(js|ts)$/.test(this.sourceFile.fileName)) { + this.#reportTestStarter(reportNode); + } } getSymbolModuleDeclaration(symbol: ts.Symbol) { @@ -915,6 +943,13 @@ export default class SourceFileLinter { }); } + #reportTestStarter(node: ts.Node) { + if (!this.#hasTestStarterFindings) { + this.#reporter.addMessage(MESSAGE.PREFER_TEST_STARTER, node); + this.#hasTestStarterFindings = true; + } + } + #analyzeParametersGetCall(node: ts.CallExpression) { if (node.arguments.length && ts.isObjectLiteralExpression(node.arguments[0])) { // Non-deprecated usage @@ -1299,10 +1334,7 @@ export default class SourceFileLinter { analyzeTestsuiteThemeProperty(node: ts.PropertyAssignment) { // Check if the node is part of a testsuite config file by its file name. - // This is the same check as in the framework and prevents false-positives - // https://github.com/SAP/openui5/blob/32c21c33d9dc29a32bf7ee7f41d7bae23dcf086b/src/sap.ui.core/src/sap/ui/test/starter/_utils.js#L287 - const validTestSuiteName = /^\/testsuite(?:\.[a-z][a-z0-9-]*)*\.qunit\.(?:js|ts)$/; - if (!validTestSuiteName.test(node.getSourceFile().fileName)) return; + if (!VALID_TESTSUITE.test(node.getSourceFile().fileName)) return; // In a Test Starter testsuite file, // themes can be defined as default (1.) or for test configs individually (2.). diff --git a/src/linter/ui5Types/amdTranspiler/tsTransformer.ts b/src/linter/ui5Types/amdTranspiler/tsTransformer.ts index 6473d1bc6..a0726a192 100644 --- a/src/linter/ui5Types/amdTranspiler/tsTransformer.ts +++ b/src/linter/ui5Types/amdTranspiler/tsTransformer.ts @@ -9,7 +9,7 @@ import replaceNodeInParent, {NodeReplacement} from "./replaceNodeInParent.js"; import {toPosStr, UnsupportedModuleError} from "./util.js"; import rewriteExtendCall, {UnsupportedExtendCall} from "./rewriteExtendCall.js"; import insertNodesInParent from "./insertNodesInParent.js"; -import LinterContext from "../../LinterContext.js"; +import LinterContext, {LintMetadata} from "../../LinterContext.js"; import {findDirectives} from "../directives.js"; const log = getLogger("linter:ui5Types:amdTranspiler:TsTransformer"); @@ -113,6 +113,13 @@ function transform( const moduleDeclaration = parseModuleDeclaration(node.arguments, checker); const moduleDefinition = moduleDeclarationToDefinition(moduleDeclaration, sourceFile, nodeFactory); moduleDefinitions.push(moduleDefinition); + if (moduleDefinition.imports.length) { + moduleDefinition.imports.forEach((importStatement) => + addModuleMetadata(metadata, "sap.ui.define", importStatement)); + } else { + // Empty sap.ui.define (no imports, no body) + addModuleMetadata(metadata, "sap.ui.define"); + } pruneNode(node); // Mark the define call for removal } catch (err) { if (err instanceof UnsupportedModuleError) { @@ -127,6 +134,8 @@ function transform( if (requireExpression.async) { const res = transformAsyncRequireCall(node, requireExpression, nodeFactory); requireImports.push(...res.imports); + res.imports.forEach((importStatement) => + addModuleMetadata(metadata, "sap.ui.require", importStatement)); if (res.callback) { replaceNode(node, res.callback); if (res.errback) { @@ -149,6 +158,7 @@ function transform( } else { const res = transformSyncRequireCall(node, requireExpression, nodeFactory); requireImports.push(res.import); + addModuleMetadata(metadata, "sap.ui.require", res.import); replaceNode(node, res.requireStatement); } } catch (err) { @@ -273,6 +283,17 @@ function transform( } }); + function addModuleMetadata(metadata: LintMetadata, importType: string, importStatement?: ts.ImportDeclaration) { + if (!metadata.transformedImports) { + metadata.transformedImports = new Map>(); + } + const curResource = metadata.transformedImports.get(importType) ?? new Set(); + if (importStatement && ts.isStringLiteral(importStatement.moduleSpecifier)) { + curResource.add(importStatement.moduleSpecifier.text); + } + metadata.transformedImports.set(importType, curResource); + } + function getCommentsFromNode(node: ts.Node, sourceFile?: ts.SourceFile): NodeComments { const sourceText = sourceFile?.getFullText() ?? fullSourceText; const leadingComments = ts.getLeadingCommentRanges(sourceText, node.getFullStart()) ?? []; diff --git a/test/fixtures/linter/projects/sap.f/test/sap/f/testsuite.qunit.html b/test/fixtures/linter/projects/sap.f/test/sap/f/testsuite.qunit.html new file mode 100644 index 000000000..1da383824 --- /dev/null +++ b/test/fixtures/linter/projects/sap.f/test/sap/f/testsuite.qunit.html @@ -0,0 +1,16 @@ + + + + + QUnit test suite for Todo App + + + + + diff --git a/test/fixtures/linter/projects/sap.f/test/sap/f/testsuite.qunit.js b/test/fixtures/linter/projects/sap.f/test/sap/f/testsuite.qunit.js new file mode 100644 index 000000000..b52aea177 --- /dev/null +++ b/test/fixtures/linter/projects/sap.f/test/sap/f/testsuite.qunit.js @@ -0,0 +1,21 @@ +sap.ui.define(function () { + "use strict"; + return { + name: "QUnit test suite for sap.f", + defaults: { + page: "ui5://test-resources/sap/f/Test.qunit.html?testsuite={suite}&test={name}", + qunit: { + version: 2 + }, + sinon: { + version: 4 + }, + ui5: { + language: "EN", + theme: "sap_horizon" + } + }, + tests: { + } + }; +}); diff --git a/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md b/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md index 3382b06a5..f1a6fbcf0 100644 --- a/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md +++ b/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.md @@ -567,8 +567,17 @@ Generated by [AVA](https://avajs.dev). errorCount: 0, fatalErrorCount: 0, filePath: 'Configuration.beforeBootstrap.qunit.js', - messages: [], - warningCount: 0, + messages: [ + { + column: 1, + line: 3, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, + ], + warningCount: 1, }, ] diff --git a/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.snap b/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.snap index f6e1bff05..b35f0c47e 100644 Binary files a/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.snap and b/test/lib/linter/rules/snapshots/NoDeprecatedApi.ts.snap differ diff --git a/test/lib/linter/snapshots/linter.ts.md b/test/lib/linter/snapshots/linter.ts.md index 7fe4b783e..2738ab7a1 100644 --- a/test/lib/linter/snapshots/linter.ts.md +++ b/test/lib/linter/snapshots/linter.ts.md @@ -800,8 +800,16 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 1, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 3, + warningCount: 4, }, { coverageInfo: [], @@ -817,6 +825,14 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 4, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 4, @@ -834,7 +850,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [ @@ -901,6 +917,14 @@ Generated by [AVA](https://avajs.dev). fatalErrorCount: 0, filePath: 'webapp/test/testsuite.qunit.html', messages: [ + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 3, line: 12, @@ -910,7 +934,7 @@ Generated by [AVA](https://avajs.dev). severity: 1, }, ], - warningCount: 1, + warningCount: 2, }, { coverageInfo: [ @@ -930,8 +954,17 @@ Generated by [AVA](https://avajs.dev). errorCount: 0, fatalErrorCount: 0, filePath: 'webapp/test/testsuite.qunit.js', - messages: [], - warningCount: 0, + messages: [ + { + column: 14, + line: 3, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, + ], + warningCount: 1, }, { coverageInfo: [], @@ -969,8 +1002,16 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 2, + warningCount: 3, }, { coverageInfo: [], @@ -986,6 +1027,14 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 6, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 6, @@ -1003,7 +1052,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -1371,8 +1420,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 1, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 3, + warningCount: 4, }, { coverageInfo: [], @@ -1387,6 +1443,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 4, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 4, @@ -1402,7 +1465,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -1410,6 +1473,13 @@ Generated by [AVA](https://avajs.dev). fatalErrorCount: 0, filePath: 'webapp/test/testsuite.qunit.html', messages: [ + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 3, line: 12, @@ -1418,6 +1488,22 @@ Generated by [AVA](https://avajs.dev). severity: 1, }, ], + warningCount: 2, + }, + { + coverageInfo: [], + errorCount: 0, + fatalErrorCount: 0, + filePath: 'webapp/test/testsuite.qunit.js', + messages: [ + { + column: 14, + line: 3, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, + ], warningCount: 1, }, { @@ -1447,8 +1533,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 2, + warningCount: 3, }, { coverageInfo: [], @@ -1463,6 +1556,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 6, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 6, @@ -1478,7 +1578,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -2189,6 +2289,14 @@ Generated by [AVA](https://avajs.dev). ], warningCount: 0, }, + { + coverageInfo: [], + errorCount: 0, + fatalErrorCount: 0, + filePath: 'test/sap/f/testsuite.qunit.js', + messages: [], + warningCount: 0, + }, ] ## lint: All files of mocked minimal sap.ui.core library @@ -2915,6 +3023,14 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 4, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 4, @@ -2932,7 +3048,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], diff --git a/test/lib/linter/snapshots/linter.ts.snap b/test/lib/linter/snapshots/linter.ts.snap index 30e01cb32..119160eed 100644 Binary files a/test/lib/linter/snapshots/linter.ts.snap and b/test/lib/linter/snapshots/linter.ts.snap differ diff --git a/test/lib/snapshots/index.ts.md b/test/lib/snapshots/index.ts.md index ce0fa4312..eec583e80 100644 --- a/test/lib/snapshots/index.ts.md +++ b/test/lib/snapshots/index.ts.md @@ -265,8 +265,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 1, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 3, + warningCount: 4, }, { coverageInfo: [], @@ -281,6 +288,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 4, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 4, @@ -296,7 +310,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -304,6 +318,13 @@ Generated by [AVA](https://avajs.dev). fatalErrorCount: 0, filePath: 'webapp/test/testsuite.qunit.html', messages: [ + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 3, line: 12, @@ -312,6 +333,22 @@ Generated by [AVA](https://avajs.dev). severity: 1, }, ], + warningCount: 2, + }, + { + coverageInfo: [], + errorCount: 0, + fatalErrorCount: 0, + filePath: 'webapp/test/testsuite.qunit.js', + messages: [ + { + column: 14, + line: 3, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, + ], warningCount: 1, }, { @@ -341,8 +378,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 2, + warningCount: 3, }, { coverageInfo: [], @@ -357,6 +401,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 6, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 6, @@ -372,7 +423,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -676,8 +727,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 1, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 3, + warningCount: 4, }, { coverageInfo: [], @@ -692,6 +750,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 4, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 4, @@ -707,7 +772,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -715,6 +780,13 @@ Generated by [AVA](https://avajs.dev). fatalErrorCount: 0, filePath: 'webapp/test/testsuite.qunit.html', messages: [ + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 3, line: 12, @@ -723,6 +795,22 @@ Generated by [AVA](https://avajs.dev). severity: 1, }, ], + warningCount: 2, + }, + { + coverageInfo: [], + errorCount: 0, + fatalErrorCount: 0, + filePath: 'webapp/test/testsuite.qunit.js', + messages: [ + { + column: 14, + line: 3, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, + ], warningCount: 1, }, { @@ -752,8 +840,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 2, + warningCount: 3, }, { coverageInfo: [], @@ -768,6 +863,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 6, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 6, @@ -783,7 +885,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -1161,8 +1263,16 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 1, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 3, + warningCount: 4, }, { coverageInfo: [], @@ -1178,6 +1288,14 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 4, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 4, @@ -1196,7 +1314,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [ @@ -1263,6 +1381,14 @@ Generated by [AVA](https://avajs.dev). fatalErrorCount: 0, filePath: 'webapp/test/testsuite.qunit.html', messages: [ + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 3, line: 12, @@ -1272,7 +1398,7 @@ Generated by [AVA](https://avajs.dev). severity: 1, }, ], - warningCount: 1, + warningCount: 2, }, { coverageInfo: [ @@ -1292,8 +1418,17 @@ Generated by [AVA](https://avajs.dev). errorCount: 0, fatalErrorCount: 0, filePath: 'webapp/test/testsuite.qunit.js', - messages: [], - warningCount: 0, + messages: [ + { + column: 14, + line: 3, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, + ], + warningCount: 1, }, { coverageInfo: [], @@ -1331,8 +1466,16 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 2, + warningCount: 3, }, { coverageInfo: [], @@ -1348,6 +1491,14 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 6, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + messageDetails: 'Test Starter (https://ui5.sap.com/#/topic/032be2cb2e1d4115af20862673bedcdb)', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 6, @@ -1366,7 +1517,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -1699,8 +1850,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 1, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 3, + warningCount: 4, }, { coverageInfo: [], @@ -1715,6 +1873,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 4, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 4, @@ -1730,7 +1895,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -1738,6 +1903,13 @@ Generated by [AVA](https://avajs.dev). fatalErrorCount: 0, filePath: 'webapp/test/testsuite.qunit.html', messages: [ + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 3, line: 12, @@ -1746,6 +1918,22 @@ Generated by [AVA](https://avajs.dev). severity: 1, }, ], + warningCount: 2, + }, + { + coverageInfo: [], + errorCount: 0, + fatalErrorCount: 0, + filePath: 'webapp/test/testsuite.qunit.js', + messages: [ + { + column: 14, + line: 3, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, + ], warningCount: 1, }, { @@ -1775,8 +1963,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 2, + warningCount: 3, }, { coverageInfo: [], @@ -1791,6 +1986,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 6, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 6, @@ -1806,7 +2008,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -2110,8 +2312,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 1, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 3, + warningCount: 4, }, { coverageInfo: [], @@ -2126,6 +2335,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 4, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 4, @@ -2141,7 +2357,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -2149,6 +2365,13 @@ Generated by [AVA](https://avajs.dev). fatalErrorCount: 0, filePath: 'webapp/test/testsuite.qunit.html', messages: [ + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 3, line: 12, @@ -2157,6 +2380,22 @@ Generated by [AVA](https://avajs.dev). severity: 1, }, ], + warningCount: 2, + }, + { + coverageInfo: [], + errorCount: 0, + fatalErrorCount: 0, + filePath: 'webapp/test/testsuite.qunit.js', + messages: [ + { + column: 14, + line: 3, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, + ], warningCount: 1, }, { @@ -2186,8 +2425,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 2, + warningCount: 3, }, { coverageInfo: [], @@ -2202,6 +2448,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 6, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 6, @@ -2217,7 +2470,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -2521,8 +2774,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 1, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 3, + warningCount: 4, }, { coverageInfo: [], @@ -2537,6 +2797,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 4, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 4, @@ -2552,7 +2819,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], @@ -2560,6 +2827,13 @@ Generated by [AVA](https://avajs.dev). fatalErrorCount: 0, filePath: 'webapp/test/testsuite.qunit.html', messages: [ + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 3, line: 12, @@ -2568,6 +2842,22 @@ Generated by [AVA](https://avajs.dev). severity: 1, }, ], + warningCount: 2, + }, + { + coverageInfo: [], + errorCount: 0, + fatalErrorCount: 0, + filePath: 'webapp/test/testsuite.qunit.js', + messages: [ + { + column: 14, + line: 3, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, + ], warningCount: 1, }, { @@ -2597,8 +2887,15 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: undefined, + line: undefined, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, ], - warningCount: 2, + warningCount: 3, }, { coverageInfo: [], @@ -2613,6 +2910,13 @@ Generated by [AVA](https://avajs.dev). ruleId: 'no-deprecated-api', severity: 2, }, + { + column: 18, + line: 6, + message: 'To save boilerplate code and ensure compliance with UI5 2.x best practices, please migrate to the Test Starter concept', + ruleId: 'prefer-test-starter', + severity: 1, + }, { column: 8, line: 6, @@ -2628,7 +2932,7 @@ Generated by [AVA](https://avajs.dev). severity: 2, }, ], - warningCount: 0, + warningCount: 1, }, { coverageInfo: [], diff --git a/test/lib/snapshots/index.ts.snap b/test/lib/snapshots/index.ts.snap index 4d36498fa..7eb621e36 100644 Binary files a/test/lib/snapshots/index.ts.snap and b/test/lib/snapshots/index.ts.snap differ