From c44f059e39ecf26b9ab1a1d065b4eb197a96b0ef Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Wed, 16 Jul 2025 15:29:53 +0530 Subject: [PATCH 01/15] upgraded fdk-client-javascript lib, new code and fix tests --- express/api_routes.js | 7 +- express/extension.js | 73 ++++++++++------ express/index.js | 8 +- express/routes.js | 34 ++++---- package-lock.json | 156 +++++----------------------------- package.json | 4 +- spec/global.spec.js | 2 +- spec/helpers/server.js | 8 +- spec/tests/webhooks.spec.js | 2 +- spec/tests/webhooksv1.spec.js | 2 +- 10 files changed, 98 insertions(+), 198 deletions(-) diff --git a/express/api_routes.js b/express/api_routes.js index e9dd91fc..0617fd9b 100644 --- a/express/api_routes.js +++ b/express/api_routes.js @@ -2,7 +2,7 @@ const { extension } = require('./extension'); const express = require('express'); const { sessionMiddleware, partnerSessionMiddleware } = require('./middleware/session_middleware'); -const { ApplicationConfig, ApplicationClient } = require("@gofynd/fdk-client-javascript"); +const { ApplicationClient } = require("@gofynd/fdk-client-javascript"); function setupProxyRoutes(configData) { @@ -18,13 +18,12 @@ function setupProxyRoutes(configData) { } if (req.headers["x-application-data"]) { req.application = JSON.parse(req.headers["x-application-data"]); - req.applicationConfig = new ApplicationConfig({ + req.applicationClient = new ApplicationClient({ applicationID: req.application._id, applicationToken: req.application.token, domain: extension.cluster, - logLevel: configData.debug === true? "debug": null + logLevel: configData.debug === true ? "debug" : null }); - req.applicationClient = new ApplicationClient(req.applicationConfig); } next(); } catch (error) { diff --git a/express/extension.js b/express/extension.js index 4a8cf357..00a21706 100644 --- a/express/extension.js +++ b/express/extension.js @@ -2,7 +2,7 @@ const validator = require('validator'); const { FdkInvalidExtensionConfig } = require("./error_code"); const urljoin = require('url-join'); -const { PlatformConfig, PlatformClient, PartnerConfig, PartnerClient } = require("@gofynd/fdk-client-javascript"); +const { PlatformClient, PartnerClient } = require("@gofynd/fdk-client-javascript"); const { WebhookRegistry } = require('./webhook'); const logger = require('./logger'); const { fdkAxios } = require('@gofynd/fdk-client-javascript/sdk/common/AxiosHelper'); @@ -106,11 +106,13 @@ class Extension { return this.access_mode === 'online'; } - async getPlatformConfig(companyId) { + async getPlatformOAuth(companyId) { if (!this._isInitialized){ await this.initialize(this.configData); } - let platformConfig = new PlatformConfig({ + + // Create client without session for OAuth operations only + let platformClient = new PlatformClient({ companyId: parseInt(companyId), domain: this.cluster, apiKey: this.api_key, @@ -118,8 +120,8 @@ class Extension { useAutoRenewTimer: false, logLevel: this.configData.debug === true? "debug": null }); - return platformConfig; - + + return platformClient.config.oauthClient; // Return just the oauthClient } async getPlatformClient(companyId, session) { @@ -127,43 +129,51 @@ class Extension { await this.initialize(this.configData); } const SessionStorage = require('./session/session_storage'); - - let platformConfig = await this.getPlatformConfig(companyId); - platformConfig.oauthClient.setToken(session); - platformConfig.oauthClient.token_expires_at = session.access_token_validity; + let platformClient = new PlatformClient({ + companyId: parseInt(companyId), + domain: this.cluster, + apiKey: this.api_key, + apiSecret: this.api_secret, + useAutoRenewTimer: false, + logLevel: this.configData.debug === true? "debug": null + }); + + platformClient.config.oauthClient.setToken(session); + platformClient.config.oauthClient.token_expires_at = session.access_token_validity; if (!session.access_token_validity || session.refresh_token) { let ac_nr_expired = !session.access_token_validity? true: ((session.access_token_validity - new Date().getTime()) / 1000) <= 120; if (ac_nr_expired) { - logger.debug(`Renewing access token for company ${companyId} with platform config ${logger.safeStringify(platformConfig)}`); - const renewTokenRes = await platformConfig.oauthClient.renewAccessToken(session.access_mode === 'offline'); - renewTokenRes.access_token_validity = platformConfig.oauthClient.token_expires_at; + logger.debug(`Renewing access token for company ${companyId}`); + const renewTokenRes = await platformClient.config.oauthClient.renewAccessToken(session.access_mode === 'offline'); + renewTokenRes.access_token_validity = platformClient.config.oauthClient.token_expires_at; session.updateToken(renewTokenRes); await SessionStorage.saveSession(session); - logger.debug(`Access token renewed for company ${companyId} with response ${logger.safeStringify(renewTokenRes)}`); + logger.debug(`Access token renewed for company ${companyId}`); } } - let platformClient = new PlatformClient(platformConfig); platformClient.setExtraHeaders({ 'x-ext-lib-version': `js/${version}` }) return platformClient; } - getPartnerConfig(organizationId) { + getPartnerOAuth(organizationId) { if (!this._isInitialized) { throw new FdkInvalidExtensionConfig("Extension not initialized due to invalid data"); } - - let partnerConfig = new PartnerConfig({ + + // Create client without session for OAuth operations only + let partnerClient = new PartnerClient({ organizationId: organizationId, domain: this.cluster, apiKey: this.api_key, apiSecret: this.api_secret, useAutoRenewTimer: false, - logLevel: this.configData.debug === true? "debug": null - }) - return partnerConfig; + logLevel: this.configData.debug === true? "debug": null + }); + + return partnerClient.config.oauthClient; // Return just the oauthClient } async getPartnerClient(organizationId, session) { @@ -172,22 +182,29 @@ class Extension { } const SessionStorage = require('./session/session_storage'); - let partnerConfig = this.getPartnerConfig(organizationId); - partnerConfig.oauthClient.setToken(session); - partnerConfig.oauthClient.token_expires_at = session.access_token_validity; + let partnerClient = new PartnerClient({ + organizationId: organizationId, + domain: this.cluster, + apiKey: this.api_key, + apiSecret: this.api_secret, + useAutoRenewTimer: false, + logLevel: this.configData.debug === true? "debug": null + }); + + partnerClient.config.oauthClient.setToken(session); + partnerClient.config.oauthClient.token_expires_at = session.access_token_validity; if (!session.access_token_validity || session.refresh_token) { let ac_nr_expired = ((session.access_token_validity - new Date().getTime()) / 1000) <= 120; if (ac_nr_expired) { - logger.debug(`Renewing access token for organization ${organizationId} with platform config ${logger.safeStringify(partnerConfig)}`); - const renewTokenRes = await partnerConfig.oauthClient.renewAccessToken(session.access_mode === 'offline'); - renewTokenRes.access_token_validity = partnerConfig.oauthClient.token_expires_at; + logger.debug(`Renewing access token for organization ${organizationId}`); + const renewTokenRes = await partnerClient.config.oauthClient.renewAccessToken(session.access_mode === 'offline'); + renewTokenRes.access_token_validity = partnerClient.config.oauthClient.token_expires_at; session.updateToken(renewTokenRes); await SessionStorage.saveSession(session); - logger.debug(`Access token renewed for organization ${organizationId} with response ${logger.safeStringify(renewTokenRes)}`); + logger.debug(`Access token renewed for organization ${organizationId}`); } } - let partnerClient = new PartnerClient(partnerConfig); partnerClient.setExtraHeaders({ 'x-ext-lib-version': `js/${version}` }) diff --git a/express/index.js b/express/index.js index 6a3e1969..b9ef5376 100644 --- a/express/index.js +++ b/express/index.js @@ -5,7 +5,7 @@ const setupRoutes = require("./routes"); const { setupProxyRoutes } = require("./api_routes"); const Session = require("./session/session"); const SessionStorage = require("./session/session_storage"); -const { ApplicationConfig, ApplicationClient } = require("@gofynd/fdk-client-javascript"); +const { ApplicationClient } = require("@gofynd/fdk-client-javascript"); const logger = require('./logger'); function setupFdk(data, syncInitialization) { @@ -34,14 +34,12 @@ function setupFdk(data, syncInitialization) { } async function getApplicationClient(applicationId, applicationToken) { - let applicationConfig = new ApplicationConfig({ + return new ApplicationClient({ applicationID: applicationId, applicationToken: applicationToken, domain: extension.cluster, - logLevel: data.debug === true? "debug": null + logLevel: data.debug === true ? "debug" : null }); - let applicationClient = new ApplicationClient(applicationConfig); - return applicationClient; } async function getPartnerClient(organizationId) { diff --git a/express/routes.js b/express/routes.js index da708673..de6c6ecc 100644 --- a/express/routes.js +++ b/express/routes.js @@ -20,7 +20,7 @@ function setupRoutes(ext) { // ?company_id=1&client_id=123313112122 try { let companyId = parseInt(req.query.company_id); - let platformConfig = await ext.getPlatformConfig(companyId); + let platformOAuth = await ext.getPlatformOAuth(companyId); let session; let redirectPath = req.query.redirect_path; @@ -66,7 +66,7 @@ function setupRoutes(ext) { } // start authorization flow - redirectUrl = platformConfig.oauthClient.startAuthorization({ + redirectUrl = platformOAuth.startAuthorization({ scope: session.scope, redirectUri: authCallback, state: session.state, @@ -95,10 +95,10 @@ function setupRoutes(ext) { } const companyId = req.fdkSession.company_id - const platformConfig = await ext.getPlatformConfig(req.fdkSession.company_id); - await platformConfig.oauthClient.verifyCallback(req.query); + const platformOAuth = await ext.getPlatformOAuth(req.fdkSession.company_id); + await platformOAuth.verifyCallback(req.query); - let token = platformConfig.oauthClient.raw_token; + let token = platformOAuth.raw_token; let sessionExpires = new Date(Date.now() + token.expires_in * 1000); req.fdkSession.expires = sessionExpires; @@ -121,13 +121,13 @@ function setupRoutes(ext) { session = new Session(sid); } - let offlineTokenRes = await platformConfig.oauthClient.getOfflineAccessToken(ext.scopes, req.query.code); + let offlineTokenRes = await platformOAuth.getOfflineAccessToken(ext.scopes, req.query.code); session.company_id = companyId; session.scope = ext.scopes; session.state = req.fdkSession.state; session.extension_id = ext.api_key; - offlineTokenRes.access_token_validity = platformConfig.oauthClient.token_expires_at; + offlineTokenRes.access_token_validity = platformOAuth.token_expires_at; offlineTokenRes.access_mode = 'offline'; session.updateToken(offlineTokenRes); @@ -172,7 +172,7 @@ function setupRoutes(ext) { logger.debug(`Extension auto install started for company: ${company_id} on company creation.`); - let platformConfig = await ext.getPlatformConfig(company_id); + let platformOAuth = await ext.getPlatformOAuth(company_id); let sid = Session.generateSessionId(false, { cluster: ext.cluster, id: company_id @@ -185,13 +185,13 @@ function setupRoutes(ext) { session = new Session(sid); } - let offlineTokenRes = await platformConfig.oauthClient.getOfflineAccessToken(ext.scopes, code); + let offlineTokenRes = await platformOAuth.getOfflineAccessToken(ext.scopes, code); session.company_id = company_id; session.scope = ext.scopes; session.state = uuidv4(); session.extension_id = ext.api_key; - offlineTokenRes.access_token_validity = platformConfig.oauthClient.token_expires_at; + offlineTokenRes.access_token_validity = platformOAuth.token_expires_at; offlineTokenRes.access_mode = 'offline'; session.updateToken(offlineTokenRes); @@ -239,7 +239,7 @@ function setupRoutes(ext) { FdkRoutes.get("/adm/install", async (req, res, next) => { try { let organizationId = req.query.organization_id; - let partnerConfig = ext.getPartnerConfig(organizationId); + let partnerOAuth = ext.getPartnerOAuth(organizationId); let session; session = new Session(Session.generateSessionId(true)); @@ -274,7 +274,7 @@ function setupRoutes(ext) { let authCallback = urljoin(ext.base_url, "/adm/auth"); - let redirectUrl = partnerConfig.oauthClient.startAuthorization({ + let redirectUrl = partnerOAuth.startAuthorization({ scope: session.scope, redirectUri: authCallback, state: session.state, @@ -303,10 +303,10 @@ function setupRoutes(ext) { const organizationId = req.fdkSession.organization_id; - const partnerConfig = ext.getPartnerConfig(req.fdkSession.organization_id); - await partnerConfig.oauthClient.verifyCallback(req.query); + const partnerOAuth = ext.getPartnerOAuth(req.fdkSession.organization_id); + await partnerOAuth.verifyCallback(req.query); - let token = partnerConfig.oauthClient.raw_token; + let token = partnerOAuth.raw_token; let sessionExpires = new Date(Date.now() + token.expires_in * 1000); req.fdkSession.expires = sessionExpires; @@ -330,13 +330,13 @@ function setupRoutes(ext) { session = new Session(sid); } - let offlineTokenRes = await partnerConfig.oauthClient.getOfflineAccessToken(ext.scopes, req.query.code); + let offlineTokenRes = await partnerOAuth.getOfflineAccessToken(ext.scopes, req.query.code); session.organization_id = organizationId; session.scope = ext.scopes; session.state = req.fdkSession.state; session.extension_id = ext.api_key; - offlineTokenRes.access_token_validity = partnerConfig.oauthClient.token_expires_at; + offlineTokenRes.access_token_validity = partnerOAuth.token_expires_at; offlineTokenRes.access_mode = 'offline'; session.updateToken(offlineTokenRes); diff --git a/package-lock.json b/package-lock.json index 3790b7e9..6d07fcde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@gofynd/fdk-client-javascript": "^1.4.13", + "@gofynd/fdk-client-javascript": "^3.4.2", "axios-mock-adapter": "^1.18.1", "body-parser": "^1.19.0", "cookie-parser": "^1.4.5", @@ -34,7 +34,7 @@ "supertest": "^4.0.2" }, "peerDependencies": { - "@gofynd/fdk-client-javascript": ">=1.4.13" + "@gofynd/fdk-client-javascript": ">=3.4.2" } }, "node_modules/@ampproject/remapping": { @@ -409,12 +409,12 @@ } }, "node_modules/@gofynd/fdk-client-javascript": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@gofynd/fdk-client-javascript/-/fdk-client-javascript-1.4.13.tgz", - "integrity": "sha512-r+Yhp4gBd8GDG74CB+GAeqae3cwIc/gvECuzmDYQiTA3nkPuMVM/SCRcsHDxoYVqdh/rbrfykJM9se4L4RCT6w==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@gofynd/fdk-client-javascript/-/fdk-client-javascript-3.4.2.tgz", + "integrity": "sha512-I6teienJceCx3JQJVhUnv4gqsT93X74IE+fOk8zk71O8kmnaMnhscPrYL64XDIOMNC/QXQQItLV7OQ6XnKhs+A==", "dev": true, + "license": "ISC", "dependencies": { - "@gofynd/flick": "^1.0.9", "@gofynd/fp-signature": "^1.0.1", "axios": "^1.6.4", "camelcase": "^6.3.0", @@ -423,27 +423,12 @@ "query-string": "^7.1.3" } }, - "node_modules/@gofynd/flick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@gofynd/flick/-/flick-1.1.0.tgz", - "integrity": "sha512-aUvFCaCPrDjH+NIn3v2XXDWiaeC6KjWnD8Bt/IBjxO7Bz2lH4383vX9FlfGW99X0OBAa5TbcDe4o5yZ/zDfLNg==", - "dev": true, - "dependencies": { - "@gofynd/fp-signature": "^1.0.1", - "@types/es6-promise": "^3.3.0", - "@types/ua-parser-js": "0.7.36", - "@types/uuid": "9.0.1", - "axios": "^1.6.7", - "query-string": "^7.1.3", - "ua-parser-js": "^1.0.2", - "uuid": "^8.3.2" - } - }, "node_modules/@gofynd/fp-signature": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@gofynd/fp-signature/-/fp-signature-1.0.1.tgz", - "integrity": "sha512-fcBeJ/+z4Dg3zqS9xFouM9L3ZNd1RI1yGJGJ8PI6YDaS0Hpi4bVIadYuRtLHASGez7vydBcC+hTcpRyOxiqzVw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@gofynd/fp-signature/-/fp-signature-1.0.2.tgz", + "integrity": "sha512-7cDq9nzfHyxAanV3g5MYcDvLwzYIdrzSz5TOpyHfneFvbrYYjkB6+7OktsY8IErHdS+TKt1Emoo9ES/C7eZZpw==", "dev": true, + "license": "ISC", "dependencies": { "crypto-js": "^4.2.0" } @@ -607,16 +592,6 @@ "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", "dev": true }, - "node_modules/@types/es6-promise": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@types/es6-promise/-/es6-promise-3.3.0.tgz", - "integrity": "sha512-ixCIAEkLUKv9movnHKCzx2rzAJgEnSALDXPrOSSwOjWwXFs0ssSZKan+O2e3FExPPCbX+DfA9NcKsbvLuyUlNA==", - "deprecated": "This is a stub types definition for es6-promise (https://github.com/jakearchibald/ES6-Promise). es6-promise provides its own type definitions, so you don't need @types/es6-promise installed!", - "dev": true, - "dependencies": { - "es6-promise": "*" - } - }, "node_modules/@types/node": { "version": "8.10.66", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", @@ -660,18 +635,6 @@ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, - "node_modules/@types/ua-parser-js": { - "version": "0.7.36", - "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz", - "integrity": "sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==", - "dev": true - }, - "node_modules/@types/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", - "dev": true - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -1360,6 +1323,7 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } @@ -1605,12 +1569,6 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -1754,6 +1712,7 @@ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3381,6 +3340,7 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", "dev": true, + "license": "MIT", "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", @@ -3868,6 +3828,7 @@ "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3940,6 +3901,7 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -4282,32 +4244,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/ua-parser-js": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.39.tgz", - "integrity": "sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -4951,12 +4887,11 @@ } }, "@gofynd/fdk-client-javascript": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@gofynd/fdk-client-javascript/-/fdk-client-javascript-1.4.13.tgz", - "integrity": "sha512-r+Yhp4gBd8GDG74CB+GAeqae3cwIc/gvECuzmDYQiTA3nkPuMVM/SCRcsHDxoYVqdh/rbrfykJM9se4L4RCT6w==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@gofynd/fdk-client-javascript/-/fdk-client-javascript-3.4.2.tgz", + "integrity": "sha512-I6teienJceCx3JQJVhUnv4gqsT93X74IE+fOk8zk71O8kmnaMnhscPrYL64XDIOMNC/QXQQItLV7OQ6XnKhs+A==", "dev": true, "requires": { - "@gofynd/flick": "^1.0.9", "@gofynd/fp-signature": "^1.0.1", "axios": "^1.6.4", "camelcase": "^6.3.0", @@ -4965,26 +4900,10 @@ "query-string": "^7.1.3" } }, - "@gofynd/flick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@gofynd/flick/-/flick-1.1.0.tgz", - "integrity": "sha512-aUvFCaCPrDjH+NIn3v2XXDWiaeC6KjWnD8Bt/IBjxO7Bz2lH4383vX9FlfGW99X0OBAa5TbcDe4o5yZ/zDfLNg==", - "dev": true, - "requires": { - "@gofynd/fp-signature": "^1.0.1", - "@types/es6-promise": "^3.3.0", - "@types/ua-parser-js": "0.7.36", - "@types/uuid": "9.0.1", - "axios": "^1.6.7", - "query-string": "^7.1.3", - "ua-parser-js": "^1.0.2", - "uuid": "^8.3.2" - } - }, "@gofynd/fp-signature": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@gofynd/fp-signature/-/fp-signature-1.0.1.tgz", - "integrity": "sha512-fcBeJ/+z4Dg3zqS9xFouM9L3ZNd1RI1yGJGJ8PI6YDaS0Hpi4bVIadYuRtLHASGez7vydBcC+hTcpRyOxiqzVw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@gofynd/fp-signature/-/fp-signature-1.0.2.tgz", + "integrity": "sha512-7cDq9nzfHyxAanV3g5MYcDvLwzYIdrzSz5TOpyHfneFvbrYYjkB6+7OktsY8IErHdS+TKt1Emoo9ES/C7eZZpw==", "dev": true, "requires": { "crypto-js": "^4.2.0" @@ -5133,15 +5052,6 @@ "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", "dev": true }, - "@types/es6-promise": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@types/es6-promise/-/es6-promise-3.3.0.tgz", - "integrity": "sha512-ixCIAEkLUKv9movnHKCzx2rzAJgEnSALDXPrOSSwOjWwXFs0ssSZKan+O2e3FExPPCbX+DfA9NcKsbvLuyUlNA==", - "dev": true, - "requires": { - "es6-promise": "*" - } - }, "@types/node": { "version": "8.10.66", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", @@ -5184,18 +5094,6 @@ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, - "@types/ua-parser-js": { - "version": "0.7.36", - "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz", - "integrity": "sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==", - "dev": true - }, - "@types/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", - "dev": true - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -5925,12 +5823,6 @@ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, "escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -7968,12 +7860,6 @@ "is-typedarray": "^1.0.0" } }, - "ua-parser-js": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.39.tgz", - "integrity": "sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==", - "dev": true - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index a4f0fd05..ca7b4157 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@gofynd/fdk-client-javascript": "^1.4.13", + "@gofynd/fdk-client-javascript": "^3.4.2", "axios-mock-adapter": "^1.18.1", "body-parser": "^1.19.0", "cookie-parser": "^1.4.5", @@ -53,7 +53,7 @@ "report-dir": "./coverage" }, "peerDependencies": { - "@gofynd/fdk-client-javascript": ">=1.4.13" + "@gofynd/fdk-client-javascript": ">=3.4.2" }, "name": "@gofynd/fdk-extension-javascript", "description": "FDK Extension Helper Library", diff --git a/spec/global.spec.js b/spec/global.spec.js index ec9cdea1..77619dbe 100644 --- a/spec/global.spec.js +++ b/spec/global.spec.js @@ -22,7 +22,7 @@ afterAll(async () => { logger.info("afterAll:started"); // globalMock.restore(); await db.clearData(); - server.app.close(); + // server.app.close(); await db.disconnect(); logger.info("afterAll:completed"); // done(); diff --git a/spec/helpers/server.js b/spec/helpers/server.js index e1814668..811b640f 100644 --- a/spec/helpers/server.js +++ b/spec/helpers/server.js @@ -4,15 +4,15 @@ const express = require('express'); const cookieParser = require('cookie-parser'); const logger = require('../utils/logger'); const bodyParser = require('body-parser'); -const PORT = 5070; +// const PORT = 5070; -module.exports = function listen(){ +module.exports = function listen(port = 5070){ const app = express(); app.use(cookieParser("ext.session")); app.use(bodyParser.json({ limit: '2mb' })); - const server = app.listen(PORT , async () => { - logger.info("Server started at http://localhost:" + PORT); + const server = app.listen(port , async () => { + logger.info("Server started at http://localhost:" + port); }); server.restApp = app; server.shutdown = function(cb) { diff --git a/spec/tests/webhooks.spec.js b/spec/tests/webhooks.spec.js index d5c34c38..688738a7 100644 --- a/spec/tests/webhooks.spec.js +++ b/spec/tests/webhooks.spec.js @@ -2,7 +2,7 @@ const fdkHelper = require("../helpers/fdk"); const { clearData } = require("../helpers/setup_db"); -const request = require("../helpers/server")(); +const request = require("../helpers/server")(5071); const axiosMock = require("./../mocks/axios.mock.js"); const { SESSION_COOKIE_NAME } = require("../../express/constants"); const hmacSHA256 = require("crypto-js/hmac-sha256"); diff --git a/spec/tests/webhooksv1.spec.js b/spec/tests/webhooksv1.spec.js index ffcca213..13303619 100644 --- a/spec/tests/webhooksv1.spec.js +++ b/spec/tests/webhooksv1.spec.js @@ -2,7 +2,7 @@ const fdkHelper = require("../helpers/fdk"); const { clearData } = require("../helpers/setup_db"); -const request = require("../helpers/server")(); +const request = require("../helpers/server")(5072); const axiosMock = require("./../mocks/axiosv1.mock.js"); const { SESSION_COOKIE_NAME } = require("../../express/constants"); const hmacSHA256 = require("crypto-js/hmac-sha256"); From e1c01506295f0a4b9e6ed71e01f169b33be3b932 Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Thu, 17 Jul 2025 15:00:45 +0530 Subject: [PATCH 02/15] changed func names back to old --- express/extension.js | 4 ++-- express/routes.js | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/express/extension.js b/express/extension.js index 00a21706..0396b857 100644 --- a/express/extension.js +++ b/express/extension.js @@ -106,7 +106,7 @@ class Extension { return this.access_mode === 'online'; } - async getPlatformOAuth(companyId) { + async getPlatformConfig(companyId) { if (!this._isInitialized){ await this.initialize(this.configData); } @@ -158,7 +158,7 @@ class Extension { return platformClient; } - getPartnerOAuth(organizationId) { + getPartnerConfig(organizationId) { if (!this._isInitialized) { throw new FdkInvalidExtensionConfig("Extension not initialized due to invalid data"); } diff --git a/express/routes.js b/express/routes.js index de6c6ecc..ca2f3f8c 100644 --- a/express/routes.js +++ b/express/routes.js @@ -20,7 +20,7 @@ function setupRoutes(ext) { // ?company_id=1&client_id=123313112122 try { let companyId = parseInt(req.query.company_id); - let platformOAuth = await ext.getPlatformOAuth(companyId); + let platformOAuth = await ext.getPlatformConfig(companyId); let session; let redirectPath = req.query.redirect_path; @@ -95,7 +95,7 @@ function setupRoutes(ext) { } const companyId = req.fdkSession.company_id - const platformOAuth = await ext.getPlatformOAuth(req.fdkSession.company_id); + const platformOAuth = await ext.getPlatformConfig(req.fdkSession.company_id); await platformOAuth.verifyCallback(req.query); let token = platformOAuth.raw_token; @@ -172,7 +172,7 @@ function setupRoutes(ext) { logger.debug(`Extension auto install started for company: ${company_id} on company creation.`); - let platformOAuth = await ext.getPlatformOAuth(company_id); + let platformOAuth = await ext.getPlatformConfig(company_id); let sid = Session.generateSessionId(false, { cluster: ext.cluster, id: company_id @@ -239,7 +239,7 @@ function setupRoutes(ext) { FdkRoutes.get("/adm/install", async (req, res, next) => { try { let organizationId = req.query.organization_id; - let partnerOAuth = ext.getPartnerOAuth(organizationId); + let partnerOAuth = ext.getPartnerConfig(organizationId); let session; session = new Session(Session.generateSessionId(true)); @@ -303,7 +303,7 @@ function setupRoutes(ext) { const organizationId = req.fdkSession.organization_id; - const partnerOAuth = ext.getPartnerOAuth(req.fdkSession.organization_id); + const partnerOAuth = ext.getPartnerConfig(req.fdkSession.organization_id); await partnerOAuth.verifyCallback(req.query); let token = partnerOAuth.raw_token; From 9b1c693514d69c54a013e1745a94eab0fd23167b Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Thu, 17 Jul 2025 16:27:35 +0530 Subject: [PATCH 03/15] added return config approach back --- express/extension.js | 4 ++-- express/routes.js | 34 +++++++++++++++++----------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/express/extension.js b/express/extension.js index 0396b857..d04217cb 100644 --- a/express/extension.js +++ b/express/extension.js @@ -121,7 +121,7 @@ class Extension { logLevel: this.configData.debug === true? "debug": null }); - return platformClient.config.oauthClient; // Return just the oauthClient + return platformClient.config; // Return just the config } async getPlatformClient(companyId, session) { @@ -173,7 +173,7 @@ class Extension { logLevel: this.configData.debug === true? "debug": null }); - return partnerClient.config.oauthClient; // Return just the oauthClient + return partnerClient.config; // Return just the config } async getPartnerClient(organizationId, session) { diff --git a/express/routes.js b/express/routes.js index ca2f3f8c..da708673 100644 --- a/express/routes.js +++ b/express/routes.js @@ -20,7 +20,7 @@ function setupRoutes(ext) { // ?company_id=1&client_id=123313112122 try { let companyId = parseInt(req.query.company_id); - let platformOAuth = await ext.getPlatformConfig(companyId); + let platformConfig = await ext.getPlatformConfig(companyId); let session; let redirectPath = req.query.redirect_path; @@ -66,7 +66,7 @@ function setupRoutes(ext) { } // start authorization flow - redirectUrl = platformOAuth.startAuthorization({ + redirectUrl = platformConfig.oauthClient.startAuthorization({ scope: session.scope, redirectUri: authCallback, state: session.state, @@ -95,10 +95,10 @@ function setupRoutes(ext) { } const companyId = req.fdkSession.company_id - const platformOAuth = await ext.getPlatformConfig(req.fdkSession.company_id); - await platformOAuth.verifyCallback(req.query); + const platformConfig = await ext.getPlatformConfig(req.fdkSession.company_id); + await platformConfig.oauthClient.verifyCallback(req.query); - let token = platformOAuth.raw_token; + let token = platformConfig.oauthClient.raw_token; let sessionExpires = new Date(Date.now() + token.expires_in * 1000); req.fdkSession.expires = sessionExpires; @@ -121,13 +121,13 @@ function setupRoutes(ext) { session = new Session(sid); } - let offlineTokenRes = await platformOAuth.getOfflineAccessToken(ext.scopes, req.query.code); + let offlineTokenRes = await platformConfig.oauthClient.getOfflineAccessToken(ext.scopes, req.query.code); session.company_id = companyId; session.scope = ext.scopes; session.state = req.fdkSession.state; session.extension_id = ext.api_key; - offlineTokenRes.access_token_validity = platformOAuth.token_expires_at; + offlineTokenRes.access_token_validity = platformConfig.oauthClient.token_expires_at; offlineTokenRes.access_mode = 'offline'; session.updateToken(offlineTokenRes); @@ -172,7 +172,7 @@ function setupRoutes(ext) { logger.debug(`Extension auto install started for company: ${company_id} on company creation.`); - let platformOAuth = await ext.getPlatformConfig(company_id); + let platformConfig = await ext.getPlatformConfig(company_id); let sid = Session.generateSessionId(false, { cluster: ext.cluster, id: company_id @@ -185,13 +185,13 @@ function setupRoutes(ext) { session = new Session(sid); } - let offlineTokenRes = await platformOAuth.getOfflineAccessToken(ext.scopes, code); + let offlineTokenRes = await platformConfig.oauthClient.getOfflineAccessToken(ext.scopes, code); session.company_id = company_id; session.scope = ext.scopes; session.state = uuidv4(); session.extension_id = ext.api_key; - offlineTokenRes.access_token_validity = platformOAuth.token_expires_at; + offlineTokenRes.access_token_validity = platformConfig.oauthClient.token_expires_at; offlineTokenRes.access_mode = 'offline'; session.updateToken(offlineTokenRes); @@ -239,7 +239,7 @@ function setupRoutes(ext) { FdkRoutes.get("/adm/install", async (req, res, next) => { try { let organizationId = req.query.organization_id; - let partnerOAuth = ext.getPartnerConfig(organizationId); + let partnerConfig = ext.getPartnerConfig(organizationId); let session; session = new Session(Session.generateSessionId(true)); @@ -274,7 +274,7 @@ function setupRoutes(ext) { let authCallback = urljoin(ext.base_url, "/adm/auth"); - let redirectUrl = partnerOAuth.startAuthorization({ + let redirectUrl = partnerConfig.oauthClient.startAuthorization({ scope: session.scope, redirectUri: authCallback, state: session.state, @@ -303,10 +303,10 @@ function setupRoutes(ext) { const organizationId = req.fdkSession.organization_id; - const partnerOAuth = ext.getPartnerConfig(req.fdkSession.organization_id); - await partnerOAuth.verifyCallback(req.query); + const partnerConfig = ext.getPartnerConfig(req.fdkSession.organization_id); + await partnerConfig.oauthClient.verifyCallback(req.query); - let token = partnerOAuth.raw_token; + let token = partnerConfig.oauthClient.raw_token; let sessionExpires = new Date(Date.now() + token.expires_in * 1000); req.fdkSession.expires = sessionExpires; @@ -330,13 +330,13 @@ function setupRoutes(ext) { session = new Session(sid); } - let offlineTokenRes = await partnerOAuth.getOfflineAccessToken(ext.scopes, req.query.code); + let offlineTokenRes = await partnerConfig.oauthClient.getOfflineAccessToken(ext.scopes, req.query.code); session.organization_id = organizationId; session.scope = ext.scopes; session.state = req.fdkSession.state; session.extension_id = ext.api_key; - offlineTokenRes.access_token_validity = partnerOAuth.token_expires_at; + offlineTokenRes.access_token_validity = partnerConfig.oauthClient.token_expires_at; offlineTokenRes.access_mode = 'offline'; session.updateToken(offlineTokenRes); From 535b67214abc8cb44386a71cbd942a4d02483377 Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Thu, 17 Jul 2025 18:03:04 +0530 Subject: [PATCH 04/15] added test cases workflows --- .github/workflows/run_test_cases.yml | 9 ++++ .github/workflows/test_cases.yml | 74 ++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 .github/workflows/run_test_cases.yml create mode 100644 .github/workflows/test_cases.yml diff --git a/.github/workflows/run_test_cases.yml b/.github/workflows/run_test_cases.yml new file mode 100644 index 00000000..5f1249b1 --- /dev/null +++ b/.github/workflows/run_test_cases.yml @@ -0,0 +1,9 @@ +name: PR Tests + +on: + pull_request: + branches: [ main ] + +jobs: + test: + uses: ./.github/workflows/test_cases.yml \ No newline at end of file diff --git a/.github/workflows/test_cases.yml b/.github/workflows/test_cases.yml new file mode 100644 index 00000000..6bc728c3 --- /dev/null +++ b/.github/workflows/test_cases.yml @@ -0,0 +1,74 @@ +name: Run test cases + +on: workflow_call + +jobs: + run-test-cases: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + node-version: [18.x, 20.x] + fail-fast: false + + # Redis service only for Linux (Windows/macOS need different setup) + services: + redis: + image: redis:6-alpine + ports: + - 6379:6379 + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + # Only run Redis service on Linux + if: matrix.os == 'ubuntu-latest' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + + # Setup Redis for Windows + - name: Setup Redis (Windows) + if: matrix.os == 'windows-latest' + run: | + choco install redis-64 -y + redis-server --service-install + redis-server --service-start + + # Setup Redis for macOS + - name: Setup Redis (macOS) + if: matrix.os == 'macos-latest' + run: | + brew install redis + brew services start redis + + - name: Install dependencies + run: npm ci + + - name: Wait for Redis (Linux) + if: matrix.os == 'ubuntu-latest' + run: | + until redis-cli -h localhost -p 6379 ping; do + echo "Waiting for Redis..." + sleep 2 + done + + - name: Run tests + run: npm test + env: + NODE_ENV: test + + - name: Upload coverage (Ubuntu + Node 18 only) + if: matrix.os == 'ubuntu-latest' && matrix.node-version == '18.x' && github.ref == 'refs/heads/main' + uses: coverallsapp/github-action@v2 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 78ca5bcef3bcadcdaab749fa2b5389224e01e6bb Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Thu, 17 Jul 2025 18:08:44 +0530 Subject: [PATCH 05/15] fix test cases workflow --- .github/workflows/test_cases.yml | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/.github/workflows/test_cases.yml b/.github/workflows/test_cases.yml index 6bc728c3..ab6bf2b3 100644 --- a/.github/workflows/test_cases.yml +++ b/.github/workflows/test_cases.yml @@ -12,20 +12,6 @@ jobs: node-version: [18.x, 20.x] fail-fast: false - # Redis service only for Linux (Windows/macOS need different setup) - services: - redis: - image: redis:6-alpine - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 5 - # Only run Redis service on Linux - if: matrix.os == 'ubuntu-latest' - steps: - name: Checkout code uses: actions/checkout@v4 @@ -36,6 +22,11 @@ jobs: node-version: ${{ matrix.node-version }} cache: 'npm' + # Setup Redis for Ubuntu (pre-installed) + - name: Start Redis (Ubuntu) + if: matrix.os == 'ubuntu-latest' + run: sudo systemctl start redis-server + # Setup Redis for Windows - name: Setup Redis (Windows) if: matrix.os == 'windows-latest' @@ -54,13 +45,18 @@ jobs: - name: Install dependencies run: npm ci - - name: Wait for Redis (Linux) - if: matrix.os == 'ubuntu-latest' + - name: Wait for Redis to be ready run: | - until redis-cli -h localhost -p 6379 ping; do + for i in {1..10}; do + if redis-cli ping | grep PONG; then + echo "Redis is ready" + exit 0 + fi echo "Waiting for Redis..." sleep 2 done + echo "Redis did not start in time" + exit 1 - name: Run tests run: npm test @@ -71,4 +67,4 @@ jobs: if: matrix.os == 'ubuntu-latest' && matrix.node-version == '18.x' && github.ref == 'refs/heads/main' uses: coverallsapp/github-action@v2 with: - github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + github-token: ${{ secrets.GITHUB_TOKEN }} From 8b0e987eb9bab98209167e18feab840221259bb9 Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Fri, 18 Jul 2025 10:14:02 +0530 Subject: [PATCH 06/15] fix windows redis workflow --- .github/workflows/test_cases.yml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test_cases.yml b/.github/workflows/test_cases.yml index ab6bf2b3..10d2063d 100644 --- a/.github/workflows/test_cases.yml +++ b/.github/workflows/test_cases.yml @@ -22,20 +22,23 @@ jobs: node-version: ${{ matrix.node-version }} cache: 'npm' - # Setup Redis for Ubuntu (pre-installed) - - name: Start Redis (Ubuntu) + # Setup Redis on Ubuntu + - name: Setup Redis (Ubuntu) if: matrix.os == 'ubuntu-latest' - run: sudo systemctl start redis-server + run: | + sudo apt-get update + sudo apt-get install -y redis-server + sudo systemctl enable redis-server + sudo systemctl start redis-server - # Setup Redis for Windows + # Setup Redis on Windows using Memurai - name: Setup Redis (Windows) if: matrix.os == 'windows-latest' run: | - choco install redis-64 -y - redis-server --service-install - redis-server --service-start + choco install memurai -y + Start-Process -NoNewWindow -FilePath "C:\Program Files\Memurai\memurai.exe" - # Setup Redis for macOS + # Setup Redis on macOS - name: Setup Redis (macOS) if: matrix.os == 'macos-latest' run: | From 2e694ca5aef8cc1963ab8e9e363f3f0a1792635b Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Fri, 18 Jul 2025 10:17:38 +0530 Subject: [PATCH 07/15] redis for windows using docker --- .github/workflows/test_cases.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test_cases.yml b/.github/workflows/test_cases.yml index 10d2063d..021284f1 100644 --- a/.github/workflows/test_cases.yml +++ b/.github/workflows/test_cases.yml @@ -31,12 +31,11 @@ jobs: sudo systemctl enable redis-server sudo systemctl start redis-server - # Setup Redis on Windows using Memurai - - name: Setup Redis (Windows) + # Setup Redis on Windows via Docker + - name: Setup Redis (Windows via Docker) if: matrix.os == 'windows-latest' run: | - choco install memurai -y - Start-Process -NoNewWindow -FilePath "C:\Program Files\Memurai\memurai.exe" + docker run -d -p 6379:6379 --name redis redis:6 # Setup Redis on macOS - name: Setup Redis (macOS) From 0d5eec91c6d2f97fce5538f73d90c47c1d59317f Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Fri, 18 Jul 2025 10:19:49 +0530 Subject: [PATCH 08/15] remove windows test cases --- .github/workflows/test_cases.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/test_cases.yml b/.github/workflows/test_cases.yml index 021284f1..c130fe06 100644 --- a/.github/workflows/test_cases.yml +++ b/.github/workflows/test_cases.yml @@ -31,12 +31,6 @@ jobs: sudo systemctl enable redis-server sudo systemctl start redis-server - # Setup Redis on Windows via Docker - - name: Setup Redis (Windows via Docker) - if: matrix.os == 'windows-latest' - run: | - docker run -d -p 6379:6379 --name redis redis:6 - # Setup Redis on macOS - name: Setup Redis (macOS) if: matrix.os == 'macos-latest' From a0702583e36f597550682ec3425e9b96ac148f38 Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Fri, 18 Jul 2025 10:20:44 +0530 Subject: [PATCH 09/15] remove windows os from array --- .github/workflows/test_cases.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_cases.yml b/.github/workflows/test_cases.yml index c130fe06..0d2a9f8e 100644 --- a/.github/workflows/test_cases.yml +++ b/.github/workflows/test_cases.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + os: [ubuntu-latest, macos-latest] node-version: [18.x, 20.x] fail-fast: false From b5ac1209f715f65b563e3fcbcc572ca502e64a3d Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Fri, 18 Jul 2025 10:53:05 +0530 Subject: [PATCH 10/15] remove redis dependency from test cases --- .github/workflows/test_cases.yml | 29 ----------------------------- spec/global.spec.js | 17 ++--------------- spec/helpers/fdk.js | 5 ++--- spec/helpers/setup_db.js | 21 +++++++++++---------- 4 files changed, 15 insertions(+), 57 deletions(-) diff --git a/.github/workflows/test_cases.yml b/.github/workflows/test_cases.yml index 0d2a9f8e..6858312a 100644 --- a/.github/workflows/test_cases.yml +++ b/.github/workflows/test_cases.yml @@ -22,38 +22,9 @@ jobs: node-version: ${{ matrix.node-version }} cache: 'npm' - # Setup Redis on Ubuntu - - name: Setup Redis (Ubuntu) - if: matrix.os == 'ubuntu-latest' - run: | - sudo apt-get update - sudo apt-get install -y redis-server - sudo systemctl enable redis-server - sudo systemctl start redis-server - - # Setup Redis on macOS - - name: Setup Redis (macOS) - if: matrix.os == 'macos-latest' - run: | - brew install redis - brew services start redis - - name: Install dependencies run: npm ci - - name: Wait for Redis to be ready - run: | - for i in {1..10}; do - if redis-cli ping | grep PONG; then - echo "Redis is ready" - exit 0 - fi - echo "Waiting for Redis..." - sleep 2 - done - echo "Redis did not start in time" - exit 1 - - name: Run tests run: npm test env: diff --git a/spec/global.spec.js b/spec/global.spec.js index 77619dbe..933ec361 100644 --- a/spec/global.spec.js +++ b/spec/global.spec.js @@ -1,29 +1,16 @@ 'use strict'; -// require('../init'); -// global mock import should be always first to work mocking. -// const globalMock = require("./mocks/global.mock"); const logger = require("./utils/logger"); - const db = require("./helpers/setup_db"); -const server = require("./helpers/server"); beforeAll(async () => { logger.info("beforeAll:started"); - //jasmine.addMatchers(jsonSchemaMatcher); - console.log(db.redisConnection.status); - if (db.redisConnection.status !== "connecting" && db.redisConnection.status !== "connected") { - await db.connect(); - } + await db.connect(); // This is now a no-op but keeps interface consistent logger.info("beforeAll:completed"); - // done(); }, 50000); afterAll(async () => { logger.info("afterAll:started"); - // globalMock.restore(); await db.clearData(); - // server.app.close(); - await db.disconnect(); + await db.disconnect(); // This is now a no-op but keeps interface consistent logger.info("afterAll:completed"); - // done(); }, 20000); \ No newline at end of file diff --git a/spec/helpers/fdk.js b/spec/helpers/fdk.js index 6a664057..4154c3f6 100644 --- a/spec/helpers/fdk.js +++ b/spec/helpers/fdk.js @@ -1,6 +1,5 @@ const { setupFdk } = require("../../express"); -const { RedisStorage } = require("../../express/storage"); -const { redisConnection } = require("../helpers/setup_db"); +const { MemoryStorage } = require("../../express/storage"); module.exports = (settings) => { return setupFdk({ @@ -12,7 +11,7 @@ module.exports = (settings) => { auth: ()=>{}, uninstall: ()=>{} }, - storage: new RedisStorage(redisConnection, "test_fdk"), + storage: new MemoryStorage("test_fdk"), access_mode: "online", cluster: "http://localdev.fyndx0.de", ...settings diff --git a/spec/helpers/setup_db.js b/spec/helpers/setup_db.js index 4acc498d..7271e394 100644 --- a/spec/helpers/setup_db.js +++ b/spec/helpers/setup_db.js @@ -1,25 +1,26 @@ -const Redis = require('ioredis'); -const redisConnection = new Redis("localhost"); +// Simple mock for memory storage - no Redis needed +const storage = new Map(); async function clearData() { - const keys = await redisConnection.keys("test_fdk*"); - const promises = []; - for(let key of keys) { - promises.push(redisConnection.del(key)); + // Clear all test data from memory storage + for (const key of storage.keys()) { + if (key.startsWith("test_fdk")) { + storage.delete(key); + } } - await Promise.all(promises); } function connect() { - return redisConnection.connect(); + // No connection needed for memory storage + return Promise.resolve(); } function disconnect() { - return redisConnection.disconnect(); + // No disconnection needed for memory storage + return Promise.resolve(); } module.exports = { - redisConnection, connect, disconnect, clearData From 924ff6d5787221ed67563c2be469e47fcf03d167 Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Fri, 18 Jul 2025 10:55:52 +0530 Subject: [PATCH 11/15] added windwos os testing again --- .github/workflows/test_cases.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_cases.yml b/.github/workflows/test_cases.yml index 6858312a..9ed0a5a8 100644 --- a/.github/workflows/test_cases.yml +++ b/.github/workflows/test_cases.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest, macos-latest, windows-latest] node-version: [18.x, 20.x] fail-fast: false From b7751880d468c845d5fb14cd36e64960be74156f Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Fri, 18 Jul 2025 12:09:02 +0530 Subject: [PATCH 12/15] added check fo unix style path --- .github/workflows/test_cases.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test_cases.yml b/.github/workflows/test_cases.yml index 9ed0a5a8..a8fa8dae 100644 --- a/.github/workflows/test_cases.yml +++ b/.github/workflows/test_cases.yml @@ -26,7 +26,15 @@ jobs: run: npm ci - name: Run tests - run: npm test + shell: bash + run: | + if [[ "$RUNNER_OS" == "Windows" ]]; then + echo "Running test with npx on Windows..." + npx nyc node spec.js + else + echo "Running test with npm test on $RUNNER_OS..." + npm test + fi env: NODE_ENV: test From 13cba4477f0e95146be0c7b8cde0ed333edccd3f Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Mon, 21 Jul 2025 10:54:08 +0530 Subject: [PATCH 13/15] removed redis connections and global logging --- spec/global.spec.js | 16 ---------------- spec/helpers/setup_db.js | 12 ------------ 2 files changed, 28 deletions(-) delete mode 100644 spec/global.spec.js diff --git a/spec/global.spec.js b/spec/global.spec.js deleted file mode 100644 index 933ec361..00000000 --- a/spec/global.spec.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; -const logger = require("./utils/logger"); -const db = require("./helpers/setup_db"); - -beforeAll(async () => { - logger.info("beforeAll:started"); - await db.connect(); // This is now a no-op but keeps interface consistent - logger.info("beforeAll:completed"); -}, 50000); - -afterAll(async () => { - logger.info("afterAll:started"); - await db.clearData(); - await db.disconnect(); // This is now a no-op but keeps interface consistent - logger.info("afterAll:completed"); -}, 20000); \ No newline at end of file diff --git a/spec/helpers/setup_db.js b/spec/helpers/setup_db.js index 7271e394..1affdc66 100644 --- a/spec/helpers/setup_db.js +++ b/spec/helpers/setup_db.js @@ -10,18 +10,6 @@ async function clearData() { } } -function connect() { - // No connection needed for memory storage - return Promise.resolve(); -} - -function disconnect() { - // No disconnection needed for memory storage - return Promise.resolve(); -} - module.exports = { - connect, - disconnect, clearData }; \ No newline at end of file From b9f8aa50dab6a0cca5a3f2d88d469529943f9359 Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Mon, 21 Jul 2025 11:27:12 +0530 Subject: [PATCH 14/15] updated run test command --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ca7b4157..bd08daec 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "example": "examples" }, "scripts": { - "test": "./node_modules/.bin/nyc node spec.js" + "test": "npx nyc node spec.js" }, "repository": { "type": "git", From d9f3810eaeac6ec939251e27b3ba1f3b3351ee20 Mon Sep 17 00:00:00 2001 From: Chinmay Sonawane Date: Mon, 21 Jul 2025 12:05:10 +0530 Subject: [PATCH 15/15] removed windows conditional logic --- .github/workflows/test_cases.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/workflows/test_cases.yml b/.github/workflows/test_cases.yml index a8fa8dae..6009589c 100644 --- a/.github/workflows/test_cases.yml +++ b/.github/workflows/test_cases.yml @@ -27,14 +27,7 @@ jobs: - name: Run tests shell: bash - run: | - if [[ "$RUNNER_OS" == "Windows" ]]; then - echo "Running test with npx on Windows..." - npx nyc node spec.js - else - echo "Running test with npm test on $RUNNER_OS..." - npm test - fi + run: npm test env: NODE_ENV: test