From 3afaff9bdf96077cc94c37cf46c7fe28eb1fc60c Mon Sep 17 00:00:00 2001 From: Matthias Osswald Date: Mon, 18 Aug 2025 16:48:16 +0200 Subject: [PATCH] test: Add reproducible example with failing snapshots Snapshots contain the expected behavior/result. The autofix that is being made is not correct. --- .../projects/globals/webapp/manifest.json | 6 + .../globals/webapp/test/globalFactory1.js | 4 + .../globals/webapp/test/globalFactory2.js | 4 + test/lib/autofix/autofix.projects.ts | 30 +++++ .../autofix/snapshots/autofix.projects.ts.md | 119 ++++++++++++++++++ .../snapshots/autofix.projects.ts.snap | Bin 3608 -> 4263 bytes 6 files changed, 163 insertions(+) create mode 100644 test/fixtures/linter/projects/globals/webapp/manifest.json create mode 100644 test/fixtures/linter/projects/globals/webapp/test/globalFactory1.js create mode 100644 test/fixtures/linter/projects/globals/webapp/test/globalFactory2.js diff --git a/test/fixtures/linter/projects/globals/webapp/manifest.json b/test/fixtures/linter/projects/globals/webapp/manifest.json new file mode 100644 index 000000000..28e66e248 --- /dev/null +++ b/test/fixtures/linter/projects/globals/webapp/manifest.json @@ -0,0 +1,6 @@ +{ + "sap.app": { + "id": "com.example.app", + "type": "application" + } +} diff --git a/test/fixtures/linter/projects/globals/webapp/test/globalFactory1.js b/test/fixtures/linter/projects/globals/webapp/test/globalFactory1.js new file mode 100644 index 000000000..ec949fb4d --- /dev/null +++ b/test/fixtures/linter/projects/globals/webapp/test/globalFactory1.js @@ -0,0 +1,4 @@ +function globalFactory() {} +sap.ui.getCore().attachInit(function () { + sap.ui.require([], globalFactory); +}); diff --git a/test/fixtures/linter/projects/globals/webapp/test/globalFactory2.js b/test/fixtures/linter/projects/globals/webapp/test/globalFactory2.js new file mode 100644 index 000000000..9848c63d6 --- /dev/null +++ b/test/fixtures/linter/projects/globals/webapp/test/globalFactory2.js @@ -0,0 +1,4 @@ +function globalFactory() { + +} +sap.ui.getCore().attachInit(function () {}); diff --git a/test/lib/autofix/autofix.projects.ts b/test/lib/autofix/autofix.projects.ts index 58d3fbbb5..71fa29f93 100644 --- a/test/lib/autofix/autofix.projects.ts +++ b/test/lib/autofix/autofix.projects.ts @@ -88,3 +88,33 @@ test.serial("lint: All files of library with sap.ui.core namespace", async (t) = t.true(writeFilePath.startsWith(projectPath), `${writeFilePath} should start with ${projectPath}`); } }); + +test.serial("lint: All files of globals application", async (t) => { + const projectPath = path.join(fixturesProjectsPath, "globals"); + const {linterEngine} = t.context; + + const res = await linterEngine.lint({ + rootDir: projectPath, + fix: true, + }); + + t.snapshot(preprocessLintResultsForSnapshot(res)); + t.truthy(t.context.autofixSpy.callCount >= 1); + let expectedWrites = 0; + for (let i = t.context.autofixSpy.callCount - 1; i >= 0; i--) { + const autofixResult = await t.context.autofixSpy.getCall(i).returnValue; + expectedWrites += autofixResult.size; + const autofixResultEntries = Array.from(autofixResult.entries()); + autofixResultEntries.sort((a, b) => a[0].localeCompare(b[0])); + for (const [filePath, content] of autofixResultEntries) { + t.snapshot(content, `AutofixResult iteration #${i}: ${filePath}`); + } + } + + // Ensure that all files are written using an absolute path within the project + t.is(t.context.writeFileStub.callCount, expectedWrites); + const writeFilePaths = t.context.writeFileStub.args.map((args) => args[0]); + for (const writeFilePath of writeFilePaths) { + t.true(writeFilePath.startsWith(projectPath), `${writeFilePath} should start with ${projectPath}`); + } +}); diff --git a/test/lib/autofix/snapshots/autofix.projects.ts.md b/test/lib/autofix/snapshots/autofix.projects.ts.md index 769ee2b79..03bb63322 100644 --- a/test/lib/autofix/snapshots/autofix.projects.ts.md +++ b/test/lib/autofix/snapshots/autofix.projects.ts.md @@ -425,3 +425,122 @@ Generated by [AVA](https://avajs.dev). warningCount: 0, }, ] + +## lint: All files of globals application + +> Snapshot 1 + + [ + { + coverageInfo: [], + errorCount: 3, + fatalErrorCount: 0, + filePath: 'webapp/test/globalFactory1.js', + messages: [ + { + column: 1, + line: 2, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + ruleId: 'no-globals', + severity: 2, + ui5TypeInfo: undefined, + }, + { + column: 8, + line: 2, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + ruleId: 'no-deprecated-api', + severity: 2, + ui5TypeInfo: { + kind: 'Function', + name: 'getCore', + parent: { + kind: 'Namespace', + name: 'ui', + parent: { + kind: 'Namespace', + name: 'sap', + }, + }, + }, + }, + { + column: 18, + line: 2, + message: 'Call to deprecated function \'attachInit\' of class \'Core\'', + ruleId: 'no-deprecated-api', + severity: 2, + ui5TypeInfo: { + kind: 'Method', + name: 'attachInit', + parent: { + kind: 'Class', + name: 'Core', + parent: { + kind: 'Module', + library: 'sap.ui.core', + name: 'sap/ui/core/Core', + }, + }, + }, + }, + ], + warningCount: 0, + }, + { + coverageInfo: [], + errorCount: 3, + fatalErrorCount: 0, + filePath: 'webapp/test/globalFactory2.js', + messages: [ + { + column: 1, + line: 4, + message: 'Access of global variable \'sap\' (sap.ui.getCore)', + ruleId: 'no-globals', + severity: 2, + ui5TypeInfo: undefined, + }, + { + column: 8, + line: 4, + message: 'Call to deprecated function \'getCore\' (sap.ui.getCore)', + ruleId: 'no-deprecated-api', + severity: 2, + ui5TypeInfo: { + kind: 'Function', + name: 'getCore', + parent: { + kind: 'Namespace', + name: 'ui', + parent: { + kind: 'Namespace', + name: 'sap', + }, + }, + }, + }, + { + column: 18, + line: 4, + message: 'Call to deprecated function \'attachInit\' of class \'Core\'', + ruleId: 'no-deprecated-api', + severity: 2, + ui5TypeInfo: { + kind: 'Method', + name: 'attachInit', + parent: { + kind: 'Class', + name: 'Core', + parent: { + kind: 'Module', + library: 'sap.ui.core', + name: 'sap/ui/core/Core', + }, + }, + }, + }, + ], + warningCount: 0, + }, + ] diff --git a/test/lib/autofix/snapshots/autofix.projects.ts.snap b/test/lib/autofix/snapshots/autofix.projects.ts.snap index 87e1532c7b6b6ed06d308aa9f44e4a11a0a875fd..0354b33a9aff2d03c964754344362ec28d7c0410 100644 GIT binary patch literal 4263 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 JW*U)H001RaV#ELd literal 3608 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