From 2dae3adf4c3c76a27307c523b9e0521e3db4d306 Mon Sep 17 00:00:00 2001 From: Facundo Rodriguez Date: Fri, 6 Feb 2026 15:48:41 -0300 Subject: [PATCH] chore: remove auth and user-setup feature flags (always-on) --- .envrc.example | 2 -- e2e/setup/mock-auth-hooks.mjs | 28 ++++++++++++++++++++++++++++ e2e/setup/register-mock-auth.mjs | 3 +++ package.json | 2 +- src/api/nes.client.ts | 6 ++---- src/commands/auth/login.ts | 4 ---- src/commands/scan/eol.ts | 4 +--- src/config/constants.ts | 11 ----------- test/api/nes.client.test.ts | 5 +++++ test/api/user-setup.client.test.ts | 6 ++++++ test/commands/auth/login.test.ts | 17 +---------------- 11 files changed, 47 insertions(+), 41 deletions(-) create mode 100644 e2e/setup/mock-auth-hooks.mjs create mode 100644 e2e/setup/register-mock-auth.mjs diff --git a/.envrc.example b/.envrc.example index 65624cc0..ccbd5e8c 100644 --- a/.envrc.example +++ b/.envrc.example @@ -6,8 +6,6 @@ export GRAPHQL_PATH='/graphql'; export EOL_REPORT_URL='https://eol-report-card.apps.herodevs.com/reports'; export ANALYTICS_URL='https://eol-api.herodevs.com/track'; -# Authentication (set to 'true' to enable auth requirement for scans) -export ENABLE_AUTH='false'; export OAUTH_CONNECT_URL=''; export OAUTH_CLIENT_ID=''; diff --git a/e2e/setup/mock-auth-hooks.mjs b/e2e/setup/mock-auth-hooks.mjs new file mode 100644 index 00000000..e43e741e --- /dev/null +++ b/e2e/setup/mock-auth-hooks.mjs @@ -0,0 +1,28 @@ +/** + * ESM loader hooks that replace auth.svc.ts with a mock during E2E tests. + * This avoids hitting the system keyring (unavailable in CI). + */ +export async function load(url, context, nextLoad) { + if (url.endsWith('/service/auth.svc.ts') || url.endsWith('/service/auth.svc.js')) { + return { + format: 'module', + shortCircuit: true, + source: ` + export class AuthError extends Error { + constructor(message, code) { + super(message); + this.name = 'AuthError'; + this.code = code; + } + } + export function persistTokenResponse() { return Promise.resolve(); } + export function getAccessToken() { return Promise.resolve('test-token'); } + export function requireAccessToken() { return Promise.resolve('test-token'); } + export function logoutLocally() { return Promise.resolve(); } + export function requireAccessTokenForScan() { return Promise.resolve('test-token'); } + `, + }; + } + + return nextLoad(url, context); +} diff --git a/e2e/setup/register-mock-auth.mjs b/e2e/setup/register-mock-auth.mjs new file mode 100644 index 00000000..6e1e110f --- /dev/null +++ b/e2e/setup/register-mock-auth.mjs @@ -0,0 +1,3 @@ +import { register } from 'node:module'; + +register('./mock-auth-hooks.mjs', import.meta.url); diff --git a/package.json b/package.json index dd2f9702..3655e9b7 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "readme": "npm run ci:fix && npm run build && oclif readme && sed -i '' 's|/plugin-help/blob/v|/plugin-help/blob/|; s|/plugin-update/blob/v|/plugin-update/blob/|' README.md", "test": "vitest run", "test:watch": "vitest watch", - "test:e2e": "globstar -- node --import tsx --test \"e2e/**/*.test.ts\"", + "test:e2e": "globstar -- node --import tsx --import ./e2e/setup/register-mock-auth.mjs --test \"e2e/**/*.test.ts\"", "typecheck": "tsc --noEmit", "version": "oclif manifest", "postversion": "node scripts/update-install-script-version.js && git add README.md" diff --git a/src/api/nes.client.ts b/src/api/nes.client.ts index ff12312c..3dc93d54 100644 --- a/src/api/nes.client.ts +++ b/src/api/nes.client.ts @@ -22,10 +22,8 @@ const createAuthorizedFetch = async (input, init) => { const headers = new Headers(init?.headers); - if (config.enableAuth) { - const token = await tokenProvider(); - headers.set('Authorization', `Bearer ${token}`); - } + const token = await tokenProvider(); + headers.set('Authorization', `Bearer ${token}`); return fetch(input, { ...init, headers }); }; diff --git a/src/commands/auth/login.ts b/src/commands/auth/login.ts index f97f5862..fff47088 100644 --- a/src/commands/auth/login.ts +++ b/src/commands/auth/login.ts @@ -4,7 +4,6 @@ import { createInterface } from 'node:readline'; import { URL } from 'node:url'; import { Command } from '@oclif/core'; import { ensureUserSetup } from '../../api/user-setup.client.ts'; -import { config } from '../../config/constants.ts'; import { persistTokenResponse } from '../../service/auth.svc.ts'; import { getClientId, getRealmUrl } from '../../service/auth-config.svc.ts'; import { getErrorMessage } from '../../service/log.svc.ts'; @@ -48,9 +47,6 @@ export default class AuthLogin extends Command { return; } - if (!config.enableUserSetup) { - return; - } try { await ensureUserSetup(); } catch (error) { diff --git a/src/commands/scan/eol.ts b/src/commands/scan/eol.ts index cf2de400..0d52b67f 100644 --- a/src/commands/scan/eol.ts +++ b/src/commands/scan/eol.ts @@ -88,9 +88,7 @@ export default class ScanEol extends Command { public async run(): Promise { const { flags } = await this.parse(ScanEol); - if (config.enableAuth) { - await requireAccessTokenForScan(); - } + await requireAccessTokenForScan(); track('CLI EOL Scan Started', (context) => ({ command: context.command, diff --git a/src/config/constants.ts b/src/config/constants.ts index bdc1e088..5505a2a3 100644 --- a/src/config/constants.ts +++ b/src/config/constants.ts @@ -10,15 +10,6 @@ export const GIT_OUTPUT_FORMAT = `"${['%h', '%an', '%ad'].join('|')}"`; export const DEFAULT_DATE_FORMAT = 'yyyy-MM-dd'; export const DEFAULT_DATE_COMMIT_FORMAT = 'MM/dd/yyyy, h:mm:ss a'; export const DEFAULT_DATE_COMMIT_MONTH_FORMAT = 'MMMM yyyy'; -export const ENABLE_AUTH = false; -export const ENABLE_USER_SETUP = false; - -const toBoolean = (value: string | undefined): boolean | undefined => { - if (value === 'true') return true; - if (value === 'false') return false; - return undefined; -}; - // Trackers - Constants export const DEFAULT_TRACKER_RUN_DATA_FILE = 'data.json'; export const TRACKER_GIT_OUTPUT_FORMAT = `"${['%H', '%an', '%ad'].join('|')}"`; @@ -40,8 +31,6 @@ export const config = { graphqlHost: process.env.GRAPHQL_HOST || GRAPHQL_HOST, graphqlPath: process.env.GRAPHQL_PATH || GRAPHQL_PATH, analyticsUrl: process.env.ANALYTICS_URL || ANALYTICS_URL, - enableAuth: toBoolean(process.env.ENABLE_AUTH) ?? ENABLE_AUTH, - enableUserSetup: toBoolean(process.env.ENABLE_USER_SETUP) ?? ENABLE_USER_SETUP, concurrentPageRequests, pageSize, }; diff --git a/test/api/nes.client.test.ts b/test/api/nes.client.test.ts index 775d9f3e..df9e6eaf 100644 --- a/test/api/nes.client.test.ts +++ b/test/api/nes.client.test.ts @@ -1,8 +1,13 @@ import type { CreateEolReportInput } from '@herodevs/eol-shared'; +import { vi } from 'vitest'; import { submitScan } from '../../src/api/nes.client.ts'; import { SCAN_ORIGIN_AUTOMATED, SCAN_ORIGIN_CLI } from '../../src/config/constants.ts'; import { FetchMock } from '../utils/mocks/fetch.mock.ts'; +vi.mock('../../src/service/auth.svc.ts', () => ({ + requireAccessTokenForScan: vi.fn().mockResolvedValue('test-token'), +})); + function getGraphQLVariables(fetchMock: FetchMock, callIndex = 0): Record { const calls = fetchMock.getCalls(); const init = calls[callIndex]?.init; diff --git a/test/api/user-setup.client.test.ts b/test/api/user-setup.client.test.ts index 213b41ce..3af26a20 100644 --- a/test/api/user-setup.client.test.ts +++ b/test/api/user-setup.client.test.ts @@ -1,7 +1,13 @@ +import { vi } from 'vitest'; import { ApiError } from '../../src/api/errors.ts'; import { completeUserSetup, ensureUserSetup, getUserSetupStatus } from '../../src/api/user-setup.client.ts'; import { FetchMock } from '../utils/mocks/fetch.mock.ts'; +vi.mock('../../src/service/auth.svc.ts', () => ({ + requireAccessTokenForScan: vi.fn().mockResolvedValue('test-token'), + requireAccessToken: vi.fn().mockResolvedValue('test-token'), +})); + describe('user-setup.client', () => { let fetchMock: FetchMock; diff --git a/test/commands/auth/login.test.ts b/test/commands/auth/login.test.ts index 021e9b4f..03b3c31d 100644 --- a/test/commands/auth/login.test.ts +++ b/test/commands/auth/login.test.ts @@ -70,18 +70,6 @@ vi.mock('http', () => ({ }, })); -vi.mock('../../../src/config/constants.ts', () => ({ - __esModule: true, - config: { - get enableAuth() { - return process.env.ENABLE_AUTH === 'true'; - }, - get enableUserSetup() { - return process.env.ENABLE_USER_SETUP === 'true'; - }, - }, -})); - vi.mock('../../../src/api/user-setup.client.ts', () => ({ __esModule: true, ensureUserSetup: vi.fn(), @@ -148,13 +136,11 @@ describe('AuthLogin', () => { closeMock.mockClear(); openMock.mockResolvedValue(undefined); ensureUserSetupMock.mockResolvedValue(undefined); - delete process.env.ENABLE_USER_SETUP; }); afterEach(() => { vi.clearAllMocks(); delete process.env.OAUTH_CALLBACK_PORT; - delete process.env.ENABLE_USER_SETUP; serverInstances.length = 0; persistTokenResponseMock.mockClear(); }); @@ -387,10 +373,10 @@ describe('AuthLogin', () => { await command.run(); expect(persistTokenResponseMock).toHaveBeenCalledWith(tokenResponse); + expect(ensureUserSetupMock).toHaveBeenCalledTimes(1); }); it('runs user setup after login', async () => { - process.env.ENABLE_USER_SETUP = 'true'; const command = createCommand(6001); const tokenResponse = { access_token: 'access', refresh_token: 'refresh' }; const commandWithInternals = command as unknown as { @@ -406,7 +392,6 @@ describe('AuthLogin', () => { }); it('fails login when user setup fails', async () => { - process.env.ENABLE_USER_SETUP = 'true'; ensureUserSetupMock.mockRejectedValueOnce(new Error('setup failed')); const command = createCommand(6002); const tokenResponse = { access_token: 'access', refresh_token: 'refresh' };