Path: blob/main/extensions/copilot/src/extension/chatSessions/claude/node/test/extractSessionId.spec.ts
13406 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { assert, describe, it } from 'vitest';6import { extractSessionId, filterSupportedBetas } from '../claudeLanguageModelServer';78const NONCE = 'vscode-lm-test-nonce';910describe('extractSessionId', () => {11describe('Authorization Bearer header', () => {12it('extracts session ID from Bearer token with nonce.sessionId format', () => {13const result = extractSessionId({ 'authorization': `Bearer ${NONCE}.my-session` }, NONCE);14assert.deepStrictEqual(result, { valid: true, sessionId: 'my-session' });15});1617it('returns valid with no session ID for legacy Bearer format', () => {18const result = extractSessionId({ 'authorization': `Bearer ${NONCE}` }, NONCE);19assert.deepStrictEqual(result, { valid: true, sessionId: undefined });20});2122it('returns invalid for wrong Bearer nonce', () => {23const result = extractSessionId({ 'authorization': 'Bearer wrong-nonce.session' }, NONCE);24assert.deepStrictEqual(result, { valid: false, sessionId: undefined });25});2627it('ignores x-api-key and uses Authorization header when both are present', () => {28// Simulates the case where ANTHROPIC_API_KEY is set in the environment:29// the SDK sends both x-api-key (real API key) and Authorization: Bearer (nonce).30// Only the Authorization: Bearer header should be used for auth.31const result = extractSessionId({32'x-api-key': 'sk-ant-real-api-key',33'authorization': `Bearer ${NONCE}.my-session`,34}, NONCE);35assert.deepStrictEqual(result, { valid: true, sessionId: 'my-session' });36});37});3839describe('missing headers', () => {40it('returns invalid when no auth headers are present', () => {41const result = extractSessionId({}, NONCE);42assert.deepStrictEqual(result, { valid: false, sessionId: undefined });43});4445it('returns invalid for non-Bearer Authorization header', () => {46const result = extractSessionId({ 'authorization': `Basic ${NONCE}.session` }, NONCE);47assert.deepStrictEqual(result, { valid: false, sessionId: undefined });48});49});50});5152describe('filterSupportedBetas', () => {53it('allows exact match from supported list', () => {54assert.strictEqual(filterSupportedBetas('interleaved-thinking-2025-05-14'), 'interleaved-thinking-2025-05-14');55});5657it('allows prefix match for context-management', () => {58assert.strictEqual(filterSupportedBetas('context-management-2025-06-27'), 'context-management-2025-06-27');59});6061it('allows prefix match for advanced-tool-use', () => {62assert.strictEqual(filterSupportedBetas('advanced-tool-use-2025-11-20'), 'advanced-tool-use-2025-11-20');63});6465it('filters out unsupported betas', () => {66assert.strictEqual(filterSupportedBetas('unsupported-beta-123'), undefined);67});6869it('filters a comma-separated list to only supported betas', () => {70assert.strictEqual(71filterSupportedBetas('interleaved-thinking-2025-05-14,unsupported-beta,context-management-2025-06-27'),72'interleaved-thinking-2025-05-14,context-management-2025-06-27'73);74});7576it('handles whitespace around commas', () => {77assert.strictEqual(78filterSupportedBetas('interleaved-thinking-2025-05-14 , context-management-2025-06-27'),79'interleaved-thinking-2025-05-14,context-management-2025-06-27'80);81});8283it('returns undefined when all betas are unsupported', () => {84assert.strictEqual(filterSupportedBetas('foo,bar,baz'), undefined);85});8687it('returns undefined for empty string', () => {88assert.strictEqual(filterSupportedBetas(''), undefined);89});90});919293