From 4c60b18145ebfebb807eded62cb6d27de2886e09 Mon Sep 17 00:00:00 2001 From: "Michael B. Gale" Date: Fri, 26 Sep 2025 00:00:05 +0100 Subject: [PATCH] Add some tests for `findAndUpload` and `uploadSarif` --- src/upload-sarif.test.ts | 199 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 src/upload-sarif.test.ts diff --git a/src/upload-sarif.test.ts b/src/upload-sarif.test.ts new file mode 100644 index 000000000..b51e2d9be --- /dev/null +++ b/src/upload-sarif.test.ts @@ -0,0 +1,199 @@ +import * as fs from "fs"; +import * as path from "path"; + +import test, { ExecutionContext } from "ava"; +import * as sinon from "sinon"; + +import { + AnalysisConfig, + AnalysisKind, + CodeQuality, + CodeScanning, +} from "./analyses"; +import { getRunnerLogger } from "./logging"; +import { createFeatures, setupTests } from "./testing-utils"; +import { UploadResult } from "./upload-lib"; +import * as uploadLib from "./upload-lib"; +import { findAndUpload, uploadSarif, UploadSarifResults } from "./upload-sarif"; +import * as util from "./util"; + +setupTests(test); + +const findAndUploadMacro = test.macro({ + exec: async ( + t: ExecutionContext, + sarifFiles: string[], + analysis: AnalysisConfig, + sarifPath: (tempDir: string) => string = (tempDir) => tempDir, + expectedResult: UploadResult | undefined, + ) => { + await util.withTmpDir(async (tempDir) => { + sinon.stub(uploadLib, "uploadSpecifiedFiles").resolves(expectedResult); + const logger = getRunnerLogger(true); + const features = createFeatures([]); + + for (const sarifFile of sarifFiles) { + fs.writeFileSync(path.join(tempDir, sarifFile), ""); + } + + const stats = fs.statSync(sarifPath(tempDir)); + const actual = await findAndUpload( + logger, + features, + sarifPath(tempDir), + stats, + "", + analysis, + ); + + t.deepEqual(actual, expectedResult); + }); + }, + title: (providedTitle = "") => `findAndUpload - ${providedTitle}`, +}); + +test( + "no matching files", + findAndUploadMacro, + ["test.json"], + CodeScanning, + undefined, + undefined, +); + +test( + "matching files for Code Scanning with directory path", + findAndUploadMacro, + ["test.sarif"], + CodeScanning, + undefined, + { + statusReport: {}, + sarifID: "some-id", + }, +); + +test( + "matching files for Code Scanning with file path", + findAndUploadMacro, + ["test.sarif"], + CodeScanning, + (tempDir) => path.join(tempDir, "test.sarif"), + { + statusReport: {}, + sarifID: "some-id", + }, +); + +const uploadSarifMacro = test.macro({ + exec: async ( + t: ExecutionContext, + sarifFiles: string[], + sarifPath: (tempDir: string) => string = (tempDir) => tempDir, + expectedResult: UploadSarifResults, + ) => { + await util.withTmpDir(async (tempDir) => { + const logger = getRunnerLogger(true); + const testPath = sarifPath(tempDir); + const features = createFeatures([]); + const uploadSpecifiedFiles = sinon.stub( + uploadLib, + "uploadSpecifiedFiles", + ); + + for (const analysisKind of Object.keys(expectedResult)) { + uploadSpecifiedFiles + .withArgs( + sinon.match.any, + sinon.match.any, + sinon.match.any, + features, + logger, + analysisKind === AnalysisKind.CodeScanning + ? CodeScanning + : CodeQuality, + ) + .resolves(expectedResult[analysisKind as AnalysisKind]); + } + + for (const sarifFile of sarifFiles) { + fs.writeFileSync(path.join(tempDir, sarifFile), ""); + } + + const stats = fs.statSync(testPath); + const actual = await uploadSarif(logger, features, testPath, stats, ""); + + t.deepEqual(actual, expectedResult); + }); + }, + title: (providedTitle = "") => `uploadSarif - ${providedTitle}`, +}); + +test( + "SARIF file", + uploadSarifMacro, + ["test.sarif"], + (tempDir) => path.join(tempDir, "test.sarif"), + { + "code-scanning": { + statusReport: {}, + sarifID: "code-scanning-sarif", + }, + }, +); + +test( + "JSON file", + uploadSarifMacro, + ["test.json"], + (tempDir) => path.join(tempDir, "test.json"), + { + "code-scanning": { + statusReport: {}, + sarifID: "code-scanning-sarif", + }, + }, +); + +test( + "Code Scanning files", + uploadSarifMacro, + ["test.json", "test.sarif"], + undefined, + { + "code-scanning": { + statusReport: {}, + sarifID: "code-scanning-sarif", + }, + }, +); + +test( + "Code Quality file", + uploadSarifMacro, + ["test.quality.sarif"], + (tempDir) => path.join(tempDir, "test.quality.sarif"), + { + "code-quality": { + statusReport: {}, + sarifID: "code-quality-sarif", + }, + }, +); + +test( + "Mixed files", + uploadSarifMacro, + ["test.sarif", "test.quality.sarif"], + undefined, + { + "code-scanning": { + statusReport: {}, + sarifID: "code-scanning-sarif", + }, + "code-quality": { + statusReport: {}, + sarifID: "code-quality-sarif", + }, + }, +);