194 lines
6.6 KiB
JavaScript
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)
|
|
})
|
|
})
|
|
})
|