Merge pull request #3640 from cdr/jsjoeio/add-test-nlsConfig

refactor: add func and tests for getNlsConfiguration
This commit is contained in:
Joe Previte 2021-06-28 11:40:43 -07:00 committed by GitHub
commit df01808d4d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 128 additions and 21 deletions

View File

@ -5,9 +5,56 @@ const options = getOptions()
// TODO: Add proper types.
/* eslint-disable @typescript-eslint/no-explicit-any */
let nlsConfig: any
// NOTE@jsjoeio
// This lives here ../../../lib/vscode/src/vs/base/common/platform.ts#L106
export const nlsConfigElementId = "vscode-remote-nls-configuration"
type NlsConfiguration = {
locale: string
availableLanguages: { [key: string]: string } | {}
_languagePackId?: string
_translationsConfigFile?: string
_cacheRoot?: string
_resolvedLanguagePackCoreLocation?: string
_corruptedFile?: string
_languagePackSupport?: boolean
loadBundle?: any
}
/**
* A helper function to get the NLS Configuration settings.
*
* This is used by VSCode for localizations (i.e. changing
* the display language).
*
* Make sure to wrap this in a try/catch block when you call it.
**/
export function getNlsConfiguration(document: Document) {
const errorMsgPrefix = "[vscode]"
const nlsConfigElement = document?.getElementById(nlsConfigElementId)
const nlsConfig = nlsConfigElement?.getAttribute("data-settings")
if (!document) {
throw new Error(`${errorMsgPrefix} Could not parse NLS configuration. document is undefined.`)
}
if (!nlsConfigElement) {
throw new Error(
`${errorMsgPrefix} Could not parse NLS configuration. Could not find nlsConfigElement with id: ${nlsConfigElementId}`,
)
}
if (!nlsConfig) {
throw new Error(
`${errorMsgPrefix} Could not parse NLS configuration. Found nlsConfigElement but missing data-settings attribute.`,
)
}
return JSON.parse(nlsConfig) as NlsConfiguration
}
try {
nlsConfig = JSON.parse(document.getElementById("vscode-remote-nls-configuration")!.getAttribute("data-settings")!)
const nlsConfig = getNlsConfiguration(document)
if (nlsConfig._resolvedLanguagePackCoreLocation) {
const bundles = Object.create(null)
nlsConfig.loadBundle = (bundle: any, _language: any, cb: any): void => {
@ -26,11 +73,7 @@ try {
.catch(cb)
}
}
} catch (error) {
/* Probably fine. */
}
;(self.require as any) = {
;(self.require as any) = {
// Without the full URL VS Code will try to load file://.
baseUrl: `${window.location.origin}${options.csStaticBase}/lib/vscode/out`,
recordStats: true,
@ -46,6 +89,9 @@ try {
jschardet: `../node_modules/jschardet/dist/jschardet.min.js`,
},
"vs/nls": nlsConfig,
}
} catch (error) {
console.error(error)
}
try {

View File

@ -0,0 +1,61 @@
/**
* @jest-environment jsdom
*/
import { JSDOM } from "jsdom"
import { getNlsConfiguration, nlsConfigElementId } from "../../../src/browser/pages/vscode"
describe("vscode", () => {
describe("getNlsConfiguration", () => {
beforeEach(() => {
const { window } = new JSDOM()
global.document = window.document
})
it("should throw an error if Document is undefined", () => {
const errorMsgPrefix = "[vscode]"
const errorMessage = `${errorMsgPrefix} Could not parse NLS configuration. document is undefined.`
expect(() => {
getNlsConfiguration(undefined as any as Document)
}).toThrowError(errorMessage)
})
it("should throw an error if no nlsConfigElement", () => {
const errorMsgPrefix = "[vscode]"
const errorMessage = `${errorMsgPrefix} Could not parse NLS configuration. Could not find nlsConfigElement with id: ${nlsConfigElementId}`
expect(() => {
getNlsConfiguration(document)
}).toThrowError(errorMessage)
})
it("should throw an error if no nlsConfig", () => {
const mockElement = document.createElement("div")
mockElement.setAttribute("id", nlsConfigElementId)
document.body.appendChild(mockElement)
const errorMsgPrefix = "[vscode]"
const errorMessage = `${errorMsgPrefix} Could not parse NLS configuration. Found nlsConfigElement but missing data-settings attribute.`
expect(() => {
getNlsConfiguration(document)
}).toThrowError(errorMessage)
document.body.removeChild(mockElement)
})
it("should return the correct configuration", () => {
const mockElement = document.createElement("div")
const dataSettings = {
first: "Jane",
last: "Doe",
}
mockElement.setAttribute("id", nlsConfigElementId)
mockElement.setAttribute("data-settings", JSON.stringify(dataSettings))
document.body.appendChild(mockElement)
const actual = getNlsConfiguration(global.document)
expect(actual).toStrictEqual(dataSettings)
document.body.removeChild(mockElement)
})
})
})