Files
wei-shaw--claude-relay-service/tests/metadataUserIdHelper.test.js
T
2026-07-13 12:48:39 +08:00

194 lines
6.6 KiB
JavaScript

const { parse, extractSessionId, build, isValid } = require('../src/utils/metadataUserIdHelper')
const OLD_FORMAT =
'user_d98385411c93cd074b2cefd5c9831fe77f24a53e4ecdcd1f830bba586fe62cb9_account__session_17cf0fd3-d51b-4b59-977d-b899dafb3022'
const OLD_FORMAT_WITH_UUID =
'user_d98385411c93cd074b2cefd5c9831fe77f24a53e4ecdcd1f830bba586fe62cb9_account_abc-123_session_17cf0fd3-d51b-4b59-977d-b899dafb3022'
const JSON_FORMAT = JSON.stringify({
device_id: 'd61f8a2c3b4e5f6071829a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f70810169',
account_uuid: '',
session_id: 'c72554f2-d198-4fd4-99c8-81e46410a1c5'
})
const JSON_FORMAT_WITH_UUID = JSON.stringify({
device_id: 'd61f8a2c3b4e5f6071829a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f70810169',
account_uuid: 'some-uuid-value',
session_id: 'c72554f2-d198-4fd4-99c8-81e46410a1c5'
})
describe('metadataUserIdHelper', () => {
describe('parse()', () => {
it('should parse old format with empty accountUuid', () => {
const result = parse(OLD_FORMAT)
expect(result).toEqual({
deviceId: 'd98385411c93cd074b2cefd5c9831fe77f24a53e4ecdcd1f830bba586fe62cb9',
accountUuid: '',
sessionId: '17cf0fd3-d51b-4b59-977d-b899dafb3022',
isJsonFormat: false
})
})
it('should parse old format with non-empty accountUuid', () => {
const result = parse(OLD_FORMAT_WITH_UUID)
expect(result).toEqual({
deviceId: 'd98385411c93cd074b2cefd5c9831fe77f24a53e4ecdcd1f830bba586fe62cb9',
accountUuid: 'abc-123',
sessionId: '17cf0fd3-d51b-4b59-977d-b899dafb3022',
isJsonFormat: false
})
})
it('should parse JSON format', () => {
const result = parse(JSON_FORMAT)
expect(result).toEqual({
deviceId: 'd61f8a2c3b4e5f6071829a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f70810169',
accountUuid: '',
sessionId: 'c72554f2-d198-4fd4-99c8-81e46410a1c5',
isJsonFormat: true
})
})
it('should parse JSON format with accountUuid', () => {
const result = parse(JSON_FORMAT_WITH_UUID)
expect(result).toEqual({
deviceId: 'd61f8a2c3b4e5f6071829a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f70810169',
accountUuid: 'some-uuid-value',
sessionId: 'c72554f2-d198-4fd4-99c8-81e46410a1c5',
isJsonFormat: true
})
})
it('should tolerate extra fields in JSON format', () => {
const extended = JSON.stringify({
device_id: 'aabbccdd' + '0'.repeat(56),
account_uuid: '',
session_id: '11111111-2222-3333-4444-555555555555',
some_future_field: 'value'
})
const result = parse(extended)
expect(result).not.toBeNull()
expect(result.sessionId).toBe('11111111-2222-3333-4444-555555555555')
expect(result.isJsonFormat).toBe(true)
})
it('should return null for invalid JSON (missing device_id)', () => {
const invalid = JSON.stringify({ account_uuid: '', session_id: 'abc' })
expect(parse(invalid)).toBeNull()
})
it('should return null for invalid JSON (missing session_id)', () => {
const invalid = JSON.stringify({ device_id: 'abc', account_uuid: '' })
expect(parse(invalid)).toBeNull()
})
it('should return null for empty string', () => {
expect(parse('')).toBeNull()
})
it('should return null for random string', () => {
expect(parse('some-random-string')).toBeNull()
})
it('should return null for malformed JSON', () => {
expect(parse('{garbage')).toBeNull()
})
it('should return null for null/undefined/number', () => {
expect(parse(null)).toBeNull()
expect(parse(undefined)).toBeNull()
expect(parse(123)).toBeNull()
})
})
describe('extractSessionId()', () => {
it('should extract sessionId from old format', () => {
expect(extractSessionId(OLD_FORMAT)).toBe('17cf0fd3-d51b-4b59-977d-b899dafb3022')
})
it('should extract sessionId from JSON format', () => {
expect(extractSessionId(JSON_FORMAT)).toBe('c72554f2-d198-4fd4-99c8-81e46410a1c5')
})
it('should return null for invalid input', () => {
expect(extractSessionId('invalid')).toBeNull()
expect(extractSessionId(null)).toBeNull()
})
})
describe('build()', () => {
it('should build old format string', () => {
const result = build({
deviceId: 'd98385411c93cd074b2cefd5c9831fe77f24a53e4ecdcd1f830bba586fe62cb9',
accountUuid: '',
sessionId: '17cf0fd3-d51b-4b59-977d-b899dafb3022',
isJsonFormat: false
})
expect(result).toBe(OLD_FORMAT)
})
it('should build old format with accountUuid', () => {
const result = build({
deviceId: 'd98385411c93cd074b2cefd5c9831fe77f24a53e4ecdcd1f830bba586fe62cb9',
accountUuid: 'abc-123',
sessionId: '17cf0fd3-d51b-4b59-977d-b899dafb3022',
isJsonFormat: false
})
expect(result).toBe(OLD_FORMAT_WITH_UUID)
})
it('should build JSON format string', () => {
const result = build({
deviceId: 'd61f8a2c3b4e5f6071829a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f70810169',
accountUuid: '',
sessionId: 'c72554f2-d198-4fd4-99c8-81e46410a1c5',
isJsonFormat: true
})
const parsed = JSON.parse(result)
expect(parsed.device_id).toBe(
'd61f8a2c3b4e5f6071829a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f70810169'
)
expect(parsed.account_uuid).toBe('')
expect(parsed.session_id).toBe('c72554f2-d198-4fd4-99c8-81e46410a1c5')
})
})
describe('roundtrip consistency', () => {
it('old format parse → build should produce identical string', () => {
const parsed = parse(OLD_FORMAT)
expect(build(parsed)).toBe(OLD_FORMAT)
})
it('old format with uuid parse → build should produce identical string', () => {
const parsed = parse(OLD_FORMAT_WITH_UUID)
expect(build(parsed)).toBe(OLD_FORMAT_WITH_UUID)
})
it('JSON format parse → build should produce equivalent JSON', () => {
const parsed = parse(JSON_FORMAT)
const rebuilt = build(parsed)
expect(JSON.parse(rebuilt)).toEqual(JSON.parse(JSON_FORMAT))
})
})
describe('isValid()', () => {
it('should return true for old format', () => {
expect(isValid(OLD_FORMAT)).toBe(true)
})
it('should return true for JSON format', () => {
expect(isValid(JSON_FORMAT)).toBe(true)
})
it('should return false for invalid inputs', () => {
expect(isValid('')).toBe(false)
expect(isValid('random-string')).toBe(false)
expect(isValid('{garbage')).toBe(false)
expect(isValid(null)).toBe(false)
expect(isValid(undefined)).toBe(false)
expect(isValid(42)).toBe(false)
})
})
})