|
19 | 19 | * - utils/socket/sdk.mts (implementation) |
20 | 20 | */ |
21 | 21 |
|
22 | | -import { beforeEach, describe, expect, it, vi } from 'vitest' |
| 22 | +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' |
23 | 23 |
|
24 | 24 | // Mock the config utility. |
25 | 25 | const mockGetConfigValueOrUndef = vi.hoisted(() => vi.fn()) |
@@ -87,9 +87,11 @@ import { |
87 | 87 | getDefaultApiBaseUrl, |
88 | 88 | getDefaultApiToken, |
89 | 89 | getDefaultProxyUrl, |
| 90 | + getExtraCaCerts, |
90 | 91 | getPublicApiToken, |
91 | 92 | getVisibleTokenPrefix, |
92 | 93 | hasDefaultApiToken, |
| 94 | + invalidateDefaultApiToken, |
93 | 95 | setupSdk, |
94 | 96 | } from '../../../../src/utils/socket/sdk.mts' |
95 | 97 |
|
@@ -211,6 +213,69 @@ describe('SDK Utilities', () => { |
211 | 213 | }) |
212 | 214 | }) |
213 | 215 |
|
| 216 | + describe('invalidateDefaultApiToken', () => { |
| 217 | + it('clears the cached default token', () => { |
| 218 | + mockGetSocketCliApiToken.mockReturnValue('cached-token') |
| 219 | + // Populate the cache. |
| 220 | + expect(getDefaultApiToken()).toBe('cached-token') |
| 221 | + // Now invalidate — and have the underlying source return undefined. |
| 222 | + invalidateDefaultApiToken() |
| 223 | + mockGetSocketCliApiToken.mockReturnValue(undefined) |
| 224 | + mockGetConfigValueOrUndef.mockReturnValue(undefined) |
| 225 | + expect(getDefaultApiToken()).toBeUndefined() |
| 226 | + }) |
| 227 | + }) |
| 228 | + |
| 229 | + describe('getExtraCaCerts', () => { |
| 230 | + const realNodeExtraCaCerts = process.env['NODE_EXTRA_CA_CERTS'] |
| 231 | + const realSslCertFile = process.env['SSL_CERT_FILE'] |
| 232 | + |
| 233 | + afterEach(() => { |
| 234 | + // Restore original env vars after each test. |
| 235 | + if (realNodeExtraCaCerts === undefined) { |
| 236 | + delete process.env['NODE_EXTRA_CA_CERTS'] |
| 237 | + } else { |
| 238 | + process.env['NODE_EXTRA_CA_CERTS'] = realNodeExtraCaCerts |
| 239 | + } |
| 240 | + if (realSslCertFile === undefined) { |
| 241 | + delete process.env['SSL_CERT_FILE'] |
| 242 | + } else { |
| 243 | + process.env['SSL_CERT_FILE'] = realSslCertFile |
| 244 | + } |
| 245 | + }) |
| 246 | + |
| 247 | + it('returns undefined when NODE_EXTRA_CA_CERTS is set (Node already loaded)', async () => { |
| 248 | + // Use a fresh module import to bypass the module-level cache |
| 249 | + // (`_extraCaCertsResolved`) that the rest of the test suite has |
| 250 | + // already populated. |
| 251 | + vi.resetModules() |
| 252 | + process.env['NODE_EXTRA_CA_CERTS'] = '/some/path/ca.pem' |
| 253 | + delete process.env['SSL_CERT_FILE'] |
| 254 | + const fresh = await import('../../../../src/utils/socket/sdk.mts') |
| 255 | + const result = fresh.getExtraCaCerts() |
| 256 | + expect(result).toBeUndefined() |
| 257 | + }) |
| 258 | + |
| 259 | + it('returns undefined when neither env var is set', async () => { |
| 260 | + vi.resetModules() |
| 261 | + delete process.env['NODE_EXTRA_CA_CERTS'] |
| 262 | + delete process.env['SSL_CERT_FILE'] |
| 263 | + const fresh = await import('../../../../src/utils/socket/sdk.mts') |
| 264 | + const result = fresh.getExtraCaCerts() |
| 265 | + expect(result).toBeUndefined() |
| 266 | + }) |
| 267 | + |
| 268 | + it('caches the resolved value across calls', async () => { |
| 269 | + vi.resetModules() |
| 270 | + delete process.env['NODE_EXTRA_CA_CERTS'] |
| 271 | + delete process.env['SSL_CERT_FILE'] |
| 272 | + const fresh = await import('../../../../src/utils/socket/sdk.mts') |
| 273 | + // Two calls — second hits the cache early-return. |
| 274 | + expect(fresh.getExtraCaCerts()).toBeUndefined() |
| 275 | + expect(fresh.getExtraCaCerts()).toBeUndefined() |
| 276 | + }) |
| 277 | + }) |
| 278 | + |
214 | 279 | describe('setupSdk', () => { |
215 | 280 | it('returns error when no token and not interactive', () => { |
216 | 281 | mockIsInteractive.mockReturnValue(false) |
|
0 commit comments