aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/formats.test.ts10
-rw-r--r--src/formats.ts6
-rw-r--r--src/routes.ts107
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(