From 791d7ab655a3f5f3f3b2374fe129d9a2851541a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Cerm=C3=A1k?= Date: Fri, 15 Nov 2024 15:18:53 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20Fix=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc | 19 ++++++++-- packages/core/src/errors.ts | 16 -------- .../__tests__/spreadsheet-reader.test.ts | 37 +++++++------------ .../reader/__tests__/worksheet-reader.test.ts | 10 ++--- .../src/reader/__tests__/worksheet.test.ts | 2 +- .../core/src/reader/spreadsheet-reader.ts | 21 +++++------ .../src/__tests__/index.test.ts | 29 ++++++++++----- packages/plugin-fallback/src/index.ts | 2 +- vscode-extension/.eslintrc.json | 2 +- 9 files changed, 62 insertions(+), 76 deletions(-) diff --git a/.eslintrc b/.eslintrc index 807816fb..c7a77843 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,5 +1,9 @@ { - "extends": ["oclif", "oclif-typescript", "prettier"], + "extends": [ + "oclif", + "oclif-typescript", + "prettier" + ], "rules": { "unicorn/prefer-node-protocol": "off", "node/no-extraneous-import": "off", @@ -16,7 +20,14 @@ ], "no-warning-comments": [ "warn", - { "terms": ["fixme", "xxx"], "location": "start" } - ] + { + "terms": [ + "fixme", + "xxx" + ], + "location": "start" + } + ], + "@typescript-eslint/explicit-module-boundary-types": "off" } -} +} \ No newline at end of file diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index 4ce601f2..0704788d 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -1,21 +1,5 @@ -import * as dedent from "dedent"; - export class FatalError extends Error {} -export class MissingAuthError extends FatalError { - public name: string; - - constructor() { - super( - dedent` - Cannot authenticate to fetch Spreadsheet data. - Provide either Service account credentials or API key 🔑 See detail info at https://ackeecz.github.io/lokse/en/authentication/ - ` - ); - this.name = "MissingAuthError"; - } -} - export class KeyColumnNotFound extends Error { public key: string; diff --git a/packages/core/src/reader/__tests__/spreadsheet-reader.test.ts b/packages/core/src/reader/__tests__/spreadsheet-reader.test.ts index 62e426c8..27f9b5aa 100644 --- a/packages/core/src/reader/__tests__/spreadsheet-reader.test.ts +++ b/packages/core/src/reader/__tests__/spreadsheet-reader.test.ts @@ -2,11 +2,7 @@ import { GoogleSpreadsheet } from "google-spreadsheet"; import SpreadsheetReader from "../spreadsheet-reader"; import WorksheetReader from "../worksheet-reader"; -import { - LangColumnNotFound, - KeyColumnNotFound, - MissingAuthError, -} from "../../errors"; +import { LangColumnNotFound, KeyColumnNotFound } from "../../errors"; import Line from "../../line"; import Worksheet from "../worksheet"; import { PluginsRunner } from "../../plugins"; @@ -46,9 +42,9 @@ describe("SpreadsheetReader", () => { }); it("uses service account if available", async () => { - expect.assertions(2); const private_key = "this-is-dummy-private-key"; const client_email = "this-is@dummy-email"; + process.env.LOKSE_SERVICE_ACCOUNT_EMAIL = client_email; process.env.LOKSE_PRIVATE_KEY = private_key; @@ -57,19 +53,16 @@ describe("SpreadsheetReader", () => { new WorksheetReader("*"), noPlugins ); - await reader.authenticate(); - - const useServiceAccountAuthMock = - GoogleSpreadsheetMock.mock.instances[0].useServiceAccountAuth; - expect(useServiceAccountAuthMock).toHaveBeenCalledTimes(1); - expect(useServiceAccountAuthMock).toHaveBeenLastCalledWith({ - client_email, - private_key, - }); + + const client = await reader.authenticate(); + + // @ts-expect-error private property + expect(client._clientId).toEqual(client_email); + // @ts-expect-error private property + expect(client._clientSecret).toEqual(private_key); }); it("uses api key if available", async () => { - expect.assertions(2); const dummyApiKey = "dummy-api-key"; process.env.LOKSE_API_KEY = dummyApiKey; @@ -78,17 +71,13 @@ describe("SpreadsheetReader", () => { new WorksheetReader("*"), noPlugins ); - await reader.authenticate(); - const useApiKeyMock = GoogleSpreadsheetMock.mock.instances[0].useApiKey; - expect(useApiKeyMock).toHaveBeenCalledTimes(1); - expect(useApiKeyMock).toHaveBeenLastCalledWith(dummyApiKey); + const client = await reader.authenticate(); + + expect(client.apiKey).toEqual(dummyApiKey); }); it("throw if service account nor api key found", async () => { - expect.assertions(1); - const expectedError = new MissingAuthError(); - const reader = new SpreadsheetReader( "test-sheet-id", new WorksheetReader("*"), @@ -97,7 +86,7 @@ describe("SpreadsheetReader", () => { await expect(reader.authenticate()).rejects.toHaveProperty( "message", - expectedError.message + "Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information." ); }); }); diff --git a/packages/core/src/reader/__tests__/worksheet-reader.test.ts b/packages/core/src/reader/__tests__/worksheet-reader.test.ts index d073a87b..1bbafa9c 100644 --- a/packages/core/src/reader/__tests__/worksheet-reader.test.ts +++ b/packages/core/src/reader/__tests__/worksheet-reader.test.ts @@ -73,13 +73,9 @@ describe("WorksheetReader - filter normalization", () => { }); it("throws when unsupported filter type provided", () => { - expect(() => new WorksheetReader(true as any)).toThrowError( - InvalidFilterError - ); - expect(() => new WorksheetReader(3 as any)).toThrowError( - InvalidFilterError - ); - expect(() => new WorksheetReader(new Date() as any)).toThrowError( + expect(() => new WorksheetReader(true as any)).toThrow(InvalidFilterError); + expect(() => new WorksheetReader(3 as any)).toThrow(InvalidFilterError); + expect(() => new WorksheetReader(new Date() as any)).toThrow( InvalidFilterError ); }); diff --git a/packages/core/src/reader/__tests__/worksheet.test.ts b/packages/core/src/reader/__tests__/worksheet.test.ts index e7ca4c41..1f4088b2 100644 --- a/packages/core/src/reader/__tests__/worksheet.test.ts +++ b/packages/core/src/reader/__tests__/worksheet.test.ts @@ -3,7 +3,7 @@ import { KeyColumnNotFound, LangColumnNotFound } from "../../errors"; import { PluginsRunner } from "../../plugins"; import Worksheet from "../worksheet"; -const createRow = (rowIndex: number, values: { [key: string]: any }) => +export const createRow = (rowIndex: number, values: { [key: string]: any }) => ({ rowIndex, ...values, diff --git a/packages/core/src/reader/spreadsheet-reader.ts b/packages/core/src/reader/spreadsheet-reader.ts index c7449bc3..5207f988 100644 --- a/packages/core/src/reader/spreadsheet-reader.ts +++ b/packages/core/src/reader/spreadsheet-reader.ts @@ -1,5 +1,5 @@ import { GoogleSpreadsheet } from "google-spreadsheet"; -import { AnyAuthClient, GoogleAuth, JWT } from "google-auth-library"; +import { GoogleAuth, JWT } from "google-auth-library"; import Line from "../line"; import { FatalError, getErrorMessage } from "../errors"; @@ -35,7 +35,7 @@ export class SpreadsheetReader { this.worksheets = null; } - async authenticate(): Promise { + createAuthClient() { const { LOKSE_API_KEY, LOKSE_SERVICE_ACCOUNT_EMAIL, LOKSE_PRIVATE_KEY } = process.env; @@ -47,33 +47,30 @@ export class SpreadsheetReader { clientSecret: LOKSE_PRIVATE_KEY, }); - const auth = new GoogleAuth(); - - auth.setGapicJWTValues(jwt); - - return auth.getClient(); + return new GoogleAuth({ authClient: jwt }); } if (LOKSE_API_KEY) { this.logger.log("🔑 Authenticating with API key..."); - const auth = new GoogleAuth({ - apiKey: LOKSE_API_KEY, - }); - return auth.getClient(); + return new GoogleAuth({ apiKey: LOKSE_API_KEY }); } this.logger.log( "🔑 Authenticating with Application Default Credentials..." ); - const auth = new GoogleAuth({ + return new GoogleAuth({ scopes: [ "https://www.googleapis.com/auth/spreadsheets.readonly", "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive.file", ], }); + } + + async authenticate() { + const auth = this.createAuthClient(); return auth.getClient(); } diff --git a/packages/plugin-fallback/src/__tests__/index.test.ts b/packages/plugin-fallback/src/__tests__/index.test.ts index a2fed528..1184db75 100644 --- a/packages/plugin-fallback/src/__tests__/index.test.ts +++ b/packages/plugin-fallback/src/__tests__/index.test.ts @@ -4,6 +4,15 @@ import { Line } from "@lokse/core"; import fallbackPluginFactory from ".."; import type { PluginOptions } from ".."; +export const createRow = (rowIndex: number, values: { [key: string]: any }) => + ({ + rowIndex, + ...values, + get: (key: string) => values[key], + save: () => null, + delete: () => null, + } as unknown as GoogleSpreadsheetRow); + describe("Fallback plugin", () => { const logger = { warn: jest.fn(), log: jest.fn() }; const factoryMeta = { languages: ["cs", "mng"] }; @@ -36,11 +45,11 @@ describe("Fallback plugin", () => { it("should keep translation as it is when filled", async () => { const line = new Line("test.key", "Ukama bugama"); - const row = { + const row = createRow(0, { key: "test.key", mng: "Ukama bugama", cs: "Nejakej nesmysl", - } as unknown as GoogleSpreadsheetRow; + }); const meta = { row, key: line.key, language: "mng" }; await expect(plugin.readTranslation(line, meta)).resolves.toHaveProperty( @@ -52,11 +61,11 @@ describe("Fallback plugin", () => { it("should log missing fallback translation in default", async () => { const line = new Line("test.key", ""); - const row = { + const row = createRow(0, { key: "test.key", mng: "", cs: "", - } as unknown as GoogleSpreadsheetRow; + }); const meta = { row, key: line.key, language: "mng" }; await expect(plugin.readTranslation(line, meta)).resolves.toHaveProperty( @@ -77,11 +86,11 @@ describe("Fallback plugin", () => { factoryMeta ); const line = new Line("test.key", ""); - const row = { + const row = createRow(0, { key: "test.key", mng: "", cs: "", - } as unknown as GoogleSpreadsheetRow; + }); const meta = { row, key: line.key, language: "mng" }; await expect(plugin2.readTranslation(line, meta)).resolves.toHaveProperty( @@ -93,11 +102,11 @@ describe("Fallback plugin", () => { it("should fallback to default language translation when translation is empty", async () => { const line = new Line("test.key", ""); - const row = { + const row = createRow(0, { key: "test.key", mng: "", cs: "Nejakej nesmysl", - } as unknown as GoogleSpreadsheetRow; + }); const meta = { row, key: line.key, language: "mng" }; await expect(plugin.readTranslation(line, meta)).resolves.toHaveProperty( @@ -109,11 +118,11 @@ describe("Fallback plugin", () => { it("should fallback to default language case insensivly", async () => { const line = new Line("test.key", ""); - const row = { + const row = createRow(0, { key: "test.key", MNG: "", CS: "Nejakej nesmysl", - } as unknown as GoogleSpreadsheetRow; + }); const meta = { row, key: line.key, language: "mng" }; await expect(plugin.readTranslation(line, meta)).resolves.toHaveProperty( diff --git a/packages/plugin-fallback/src/index.ts b/packages/plugin-fallback/src/index.ts index d27d2578..5bd2484f 100644 --- a/packages/plugin-fallback/src/index.ts +++ b/packages/plugin-fallback/src/index.ts @@ -42,7 +42,7 @@ export default function ( Object.keys(meta.row).find((key) => isDefaultLang(key)) ?? NOT_FOUND_KEY; - const fallbackLanguageValue = meta.row[defaultLanguageKey] ?? ""; + const fallbackLanguageValue = meta.row.get(defaultLanguageKey) ?? ""; if (logMissingFallback && !fallbackLanguageValue) { logger.warn(`Fallback translation of key "${meta.key}" not found`); diff --git a/vscode-extension/.eslintrc.json b/vscode-extension/.eslintrc.json index f9b22b79..08243cfd 100644 --- a/vscode-extension/.eslintrc.json +++ b/vscode-extension/.eslintrc.json @@ -21,4 +21,4 @@ "dist", "**/*.d.ts" ] -} +} \ No newline at end of file