Archived
1
0

Merge pull request #2701 from cdr/add-unit-tests-constants

feat(testing): add unit tests for constants
This commit is contained in:
Joe Previte 2021-02-10 12:40:58 -07:00 committed by GitHub
commit 662b5b24e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 113 additions and 11 deletions

View File

@ -31,6 +31,7 @@
}, },
"main": "out/node/entry.js", "main": "out/node/entry.js",
"devDependencies": { "devDependencies": {
"@schemastore/package": "^0.0.6",
"@types/body-parser": "^1.19.0", "@types/body-parser": "^1.19.0",
"@types/cookie-parser": "^1.4.2", "@types/cookie-parser": "^1.4.2",
"@types/express": "^4.17.8", "@types/express": "^4.17.8",
@ -62,8 +63,8 @@
"stylelint": "^13.0.0", "stylelint": "^13.0.0",
"stylelint-config-recommended": "^3.0.0", "stylelint-config-recommended": "^3.0.0",
"ts-node": "^9.0.0", "ts-node": "^9.0.0",
"wtfnode": "^0.8.4", "typescript": "^4.1.3",
"typescript": "^4.1.3" "wtfnode": "^0.8.4"
}, },
"resolutions": { "resolutions": {
"@types/node": "^12.12.7", "@types/node": "^12.12.7",

View File

@ -1,13 +1,20 @@
import { logger } from "@coder/logger" import { logger } from "@coder/logger"
import { JSONSchemaForNPMPackageJsonFiles } from "@schemastore/package"
import * as path from "path" import * as path from "path"
let pkg: { version?: string; commit?: string } = {} export function getPackageJson(relativePath: string): JSONSchemaForNPMPackageJsonFiles {
try { let pkg = {}
pkg = require("../../package.json") try {
} catch (error) { pkg = require(relativePath)
logger.warn(error.message) } catch (error) {
logger.warn(error.message)
}
return pkg
} }
const pkg = getPackageJson("../../package.json")
export const version = pkg.version || "development" export const version = pkg.version || "development"
export const commit = pkg.commit || "development" export const commit = pkg.commit || "development"
export const rootPath = path.resolve(__dirname, "../..") export const rootPath = path.resolve(__dirname, "../..")

58
test/constants.test.ts Normal file
View File

@ -0,0 +1,58 @@
// Note: we need to import logger from the root
// because this is the logger used in logError in ../src/common/util
import { logger } from "../node_modules/@coder/logger"
import { commit, getPackageJson, version } from "../src/node/constants"
describe("constants", () => {
describe("getPackageJson", () => {
let spy: jest.SpyInstance
beforeEach(() => {
spy = jest.spyOn(logger, "warn")
})
afterEach(() => {
jest.clearAllMocks()
})
afterAll(() => {
jest.restoreAllMocks()
})
it("should log a warning if package.json not found", () => {
const expectedErrorMessage = "Cannot find module './package.json' from 'src/node/constants.ts'"
getPackageJson("./package.json")
expect(spy).toHaveBeenCalled()
expect(spy).toHaveBeenCalledWith(expectedErrorMessage)
})
it("should find the package.json", () => {
// the function calls require from src/node/constants
// so to get the root package.json we need to use ../../
const packageJson = getPackageJson("../../package.json")
expect(Object.keys(packageJson).length).toBeGreaterThan(0)
expect(packageJson.name).toBe("code-server")
expect(packageJson.description).toBe("Run VS Code on a remote server.")
expect(packageJson.repository).toBe("https://github.com/cdr/code-server")
})
})
describe("version", () => {
it("should return the package.json version", () => {
// Source: https://gist.github.com/jhorsman/62eeea161a13b80e39f5249281e17c39#gistcomment-2896416
const validSemVar = new RegExp("^(0|[1-9]d*).(0|[1-9]d*).(0|[1-9]d*)")
const isValidSemVar = validSemVar.test(version)
expect(version).not.toBe(null)
expect(isValidSemVar).toBe(true)
})
})
describe("commit", () => {
it("should return 'development' if commit is undefined", () => {
// In development, the commit is not stored in our package.json
// But when we build code-server and release it, it is
expect(commit).toBe("development")
})
})
})

35
test/http.test.ts Normal file
View File

@ -0,0 +1,35 @@
import { HttpCode, HttpError } from "../src/common/http"
describe("http", () => {
describe("HttpCode", () => {
it("should return the correct HTTP codes", () => {
expect(HttpCode.Ok).toBe(200)
expect(HttpCode.Redirect).toBe(302)
expect(HttpCode.NotFound).toBe(404)
expect(HttpCode.BadRequest).toBe(400)
expect(HttpCode.Unauthorized).toBe(401)
expect(HttpCode.LargePayload).toBe(413)
expect(HttpCode.ServerError).toBe(500)
})
})
describe("HttpError", () => {
it("should work as expected", () => {
const message = "Bad request from client"
const httpError = new HttpError(message, HttpCode.BadRequest)
expect(httpError.message).toBe(message)
expect(httpError.status).toBe(400)
expect(httpError.details).toBeUndefined()
})
it("should have details if provided", () => {
const details = {
message: "User needs to be signed-in in order to perform action",
}
const message = "Unauthorized"
const httpError = new HttpError(message, HttpCode.BadRequest, details)
expect(httpError.details).toStrictEqual(details)
})
})
})

View File

@ -125,10 +125,6 @@ describe("util", () => {
}) })
describe("getOptions", () => { describe("getOptions", () => {
// Things to mock
// logger
// location
// document
beforeEach(() => { beforeEach(() => {
const location: LocationLike = { const location: LocationLike = {
pathname: "/healthz", pathname: "/healthz",

View File

@ -980,6 +980,11 @@
"@parcel/utils" "^1.11.0" "@parcel/utils" "^1.11.0"
physical-cpu-count "^2.0.0" physical-cpu-count "^2.0.0"
"@schemastore/package@^0.0.6":
version "0.0.6"
resolved "https://registry.yarnpkg.com/@schemastore/package/-/package-0.0.6.tgz#9a76713da1c7551293b7e72e4f387f802bfd5d81"
integrity sha512-uNloNHoyHttSSdeuEkkSC+mdxJXMKlcUPOMb//qhQbIQijXg8x54VmAw3jm6GJZQ5DBtIqGBd66zEQCDCChQVA==
"@stylelint/postcss-css-in-js@^0.37.2": "@stylelint/postcss-css-in-js@^0.37.2":
version "0.37.2" version "0.37.2"
resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2" resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2"