diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/formats.test.ts | 10 | ||||
| -rw-r--r-- | src/formats.ts | 6 | ||||
| -rw-r--r-- | src/routes.ts | 107 |
3 files changed, 65 insertions, 58 deletions
diff --git a/src/formats.test.ts b/src/formats.test.ts index eb38ab1..1536b5d 100644 --- a/src/formats.test.ts +++ b/src/formats.test.ts @@ -1,7 +1,6 @@ import Formats, { defaultColorMatches } from "./formats"; import fs from "fs"; import path from "path"; -import { JSDOM } from "jsdom"; describe("Color matcher", () => { it.each` @@ -109,12 +108,11 @@ describe("Tarpaulin format", () => { it("should parse coverage from a normal tarpaulin file", () => { // Arrange const file = fs.readFileSync(reportPath("tarpaulin-report.html"), "utf-8"); - const document = new JSDOM(file).window.document; const format = Formats.getFormat("tarpaulin"); // Act - const result = format.parseCoverage(document); + const result = format.parseCoverage(file); // Assert expect(typeof result).toEqual("number"); @@ -127,12 +125,11 @@ describe("Tarpaulin format", () => { it("should parse coverage from an empty tarpaulin file", () => { // Arrange const file = fs.readFileSync(reportPath("tarpaulin-empty.html"), "utf-8"); - const document = new JSDOM(file).window.document; const format = Formats.getFormat("tarpaulin"); // Act - const result = format.parseCoverage(document); + const result = format.parseCoverage(file); // Assert expect(typeof result).toEqual("number"); @@ -144,12 +141,11 @@ describe("Tarpaulin format", () => { it("should return error when parsing coverage from invalid file", () => { // Arrange const file = fs.readFileSync(reportPath("tarpaulin-invalid.html"), "utf-8"); - const document = new JSDOM(file).window.document; const format = Formats.getFormat("tarpaulin"); // Act - const result = format.parseCoverage(document); + const result = format.parseCoverage(file); // Assert expect(typeof result).not.toEqual("number"); diff --git a/src/formats.ts b/src/formats.ts index 63d5f60..11113f0 100644 --- a/src/formats.ts +++ b/src/formats.ts @@ -1,10 +1,11 @@ +import { JSDOM } from "jsdom"; import { InvalidReportDocumentError } from "./errors"; type CoverageResult = number | InvalidReportDocumentError; export interface Format { // returns the coverage value as %: Number(90.0), Number(100.0), Number(89.5) - parseCoverage: (file: Document) => CoverageResult; + parseCoverage: (contents: string) => CoverageResult; matchColor: (coverage: number, style: GradientStyle) => string; fileName: string; } @@ -45,7 +46,8 @@ export const defaultColorMatches = ( const FormatsObj: FormatObj = { formats: { tarpaulin: { - parseCoverage: (file: Document): CoverageResult => { + parseCoverage: (contents: string): CoverageResult => { + const file = new JSDOM(contents).window.document; const scripts = file.getElementsByTagName("script"); if (scripts.length === 0) { return new InvalidReportDocumentError(); diff --git a/src/routes.ts b/src/routes.ts index 31bce07..634af7d 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,20 +1,58 @@ import express, { Router } from "express"; -import { JSDOM } from "jsdom"; import { badgen } from "badgen"; import winston from "winston"; import path from "path"; import fs from "fs"; -import formats from "./formats"; +import formats, { Format } from "./formats"; import Metadata, { HeadIdentity } from "./metadata"; import loggerConfig from "./util/logger"; -import { Messages } from "./errors"; +import { InvalidReportDocumentError, Messages } from "./errors"; const logger = winston.createLogger(loggerConfig("HTTP")); export default (metadata: Metadata): Router => { const router = Router(); + const commitFormatDocs = async ( + contents: string, + identity: HeadIdentity, + formatter: Format + ): Promise<boolean | InvalidReportDocumentError> => { + const reportPath = path.join( + metadata.getHostDir(), + identity.organization, + identity.repository, + identity.branch, + identity.head + ); + const coverage = formatter.parseCoverage(contents); + if (typeof coverage !== "number") { + return coverage; + } + + // Create report directory if not exists + await fs.promises.mkdir(reportPath, { recursive: true }); + + // Create report badge + const style = metadata.getGradientStyle(); + const badge = badgen({ + label: "coverage", + status: Math.floor(coverage).toString() + "%", + color: formatter.matchColor(coverage, style) + }); + + // Write report and badge to directory + await fs.promises.writeFile(path.join(reportPath, "badge.svg"), badge); + await fs.promises.writeFile( + path.join(reportPath, formatter.fileName), + contents + ); + + // Update (or create) given branch with commit info + return await metadata.updateBranch(identity); + }; + // serve landing page router.get("/", (_, res) => { res.sendFile(path.join(metadata.getHostDir(), "index.html")); @@ -68,57 +106,28 @@ export default (metadata: Metadata): Router => { return res.status(413).send(Messages.FileTooLarge); } - let coverage: number; - const doc = new JSDOM(contents).window.document; const formatter = formats.getFormat(format); - - const result = formatter.parseCoverage(doc); - if (typeof result === "number") { - coverage = result; - } else { - return res.status(400).send(result.message); - } - - const reportPath = path.join( - metadata.getHostDir(), - org, - repo, + const identity = { + organization: org, + repository: repo, branch, - commit - ); + head: commit + }; try { - // Create report directory if not exists - await fs.promises.mkdir(reportPath, { recursive: true }); - - // Create report badge - const style = metadata.getGradientStyle(); - const badge = badgen({ - label: "coverage", - status: Math.floor(coverage).toString() + "%", - color: formatter.matchColor(coverage, style) - }); - - // Write report and badge to directory - await fs.promises.writeFile(path.join(reportPath, "badge.svg"), badge); - await fs.promises.writeFile( - path.join(reportPath, formatter.fileName), - contents - ); - - // Update (or create) given branch with commit info - const branchUpdate = await metadata.updateBranch({ - organization: org, - repository: repo, - branch, - head: commit - }); - - if (branchUpdate) { - return res.status(200).send(); + const result = await commitFormatDocs(contents, identity, formatter); + + if (typeof result === "boolean") { + if (result) { + return res.status(200).send(); + } else { + logger.error( + "Unknown error while attempting to commit branch update" + ); + return res.status(500).send(Messages.UnknownError); + } } else { - logger.error("Branch update failed"); - return res.status(500).send(Messages.UnknownError); + return res.status(400).send(Messages.InvalidFormat); } } catch (err) { logger.error( |
