From 0ac55719469cb2074debddfdf34997823f44ea9f Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Thu, 17 Feb 2022 12:03:30 +0300 Subject: [PATCH] Introduce BundledExtensionParser Signed-off-by: Alex Andreev --- .../__tests__/extension-parser.test.ts | 52 +++++++++++++++++ .../bundled-extension-parser.ts | 57 +++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 src/main/extension-updater/__tests__/extension-parser.test.ts create mode 100644 src/main/extension-updater/bundled-extension-parser.ts diff --git a/src/main/extension-updater/__tests__/extension-parser.test.ts b/src/main/extension-updater/__tests__/extension-parser.test.ts new file mode 100644 index 0000000000..e6741f429a --- /dev/null +++ b/src/main/extension-updater/__tests__/extension-parser.test.ts @@ -0,0 +1,52 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { BundledExtensionParser } from "../bundled-extension-parser"; +import fetchMock from "fetch-mock"; + +fetchMock.config.overwriteRoutes = true; + +describe("BundledExtensionParser", () => { + afterAll(() => { + fetchMock.reset(); + }); + + it("Should return empty arrays if no url passed", async () => { + const lists = await new BundledExtensionParser("5.4.0-latest12345", "").getExtensionLists(); + + expect(lists).toEqual({ + release: [], + available: [], + }); + }); + + it("Should return empty releases array if no release json found", async () => { + fetchMock + .get("http://my-example-url.com/versions.json", [ { "node-menu": "0.0.1" } ] ) + .get("http://my-example-url.com/5.4.0-latest12345.json", 408 ); + + + const lists = await new BundledExtensionParser("5.4.0-latest12345", "http://my-example-url.com").getExtensionLists(); + + expect(lists).toEqual({ + release: [], + available: [{ "node-menu": "0.0.1" }], + }); + }); + + it("Should return empty available array if no versions json found", async () => { + fetchMock + .get("http://my-example-url.com/versions.json", 408 ) + .get("http://my-example-url.com/5.4.0-latest12345.json", [ { "node-menu": "0.0.1" } ]); + + + const lists = await new BundledExtensionParser("5.4.0-latest12345", "http://my-example-url.com").getExtensionLists(); + + expect(lists).toEqual({ + release: [{ "node-menu": "0.0.1" }], + available: [], + }); + }); +}); diff --git a/src/main/extension-updater/bundled-extension-parser.ts b/src/main/extension-updater/bundled-extension-parser.ts new file mode 100644 index 0000000000..84d1caf625 --- /dev/null +++ b/src/main/extension-updater/bundled-extension-parser.ts @@ -0,0 +1,57 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import logger from "../logger"; + +type Extensions = Record[]; + +interface ExtensionList { + release: Extensions, + available: Extensions +} + +export class BundledExtensionParser { + constructor(private lensVersion: string, private url: string) { + } + + get releaseJsonUrl() { + return `${this.url}/${this.lensVersion}.json`; + } + + get availableJsonUrl() { + return `${this.url}/versions.json`; + } + + fetchJsonList(path: string): Promise { + return fetch(path, { method: "GET" }).then(response => { + if (response.ok) { + return response.json(); + } + + return []; + }).catch(error => { + logger.error(`[EXTENSION-PARSER]: Failed to download and parse extension list: ${error}`); + + return []; + }); + } + + public async getExtensionLists(): Promise { + if (!this.url) { + return { + release: [], + available: [], + }; + } + + const release = await this.fetchJsonList(this.releaseJsonUrl); + const available = await this.fetchJsonList(this.availableJsonUrl); + + return { + release, + available, + }; + } +}