91 lines
3.4 KiB
TypeScript
91 lines
3.4 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { parseSoraRawTokens } from '@/utils/soraTokenParser'
|
|
|
|
describe('parseSoraRawTokens', () => {
|
|
it('parses sessionToken and accessToken from JSON payload', () => {
|
|
const payload = JSON.stringify({
|
|
user: { id: 'u1' },
|
|
accessToken: 'at-json-1',
|
|
sessionToken: 'st-json-1'
|
|
})
|
|
|
|
const result = parseSoraRawTokens(payload)
|
|
|
|
expect(result.sessionTokens).toEqual(['st-json-1'])
|
|
expect(result.accessTokens).toEqual(['at-json-1'])
|
|
})
|
|
|
|
it('supports plain session tokens (one per line)', () => {
|
|
const result = parseSoraRawTokens('st-1\nst-2')
|
|
|
|
expect(result.sessionTokens).toEqual(['st-1', 'st-2'])
|
|
expect(result.accessTokens).toEqual([])
|
|
})
|
|
|
|
it('supports non-standard object snippets via regex', () => {
|
|
const raw = "sessionToken: 'st-snippet', access_token: \"at-snippet\""
|
|
const result = parseSoraRawTokens(raw)
|
|
|
|
expect(result.sessionTokens).toEqual(['st-snippet'])
|
|
expect(result.accessTokens).toEqual(['at-snippet'])
|
|
})
|
|
|
|
it('keeps unique tokens and extracts JWT-like plain line as AT too', () => {
|
|
const jwt = 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIn0.signature'
|
|
const raw = `st-dup\nst-dup\n${jwt}\n${JSON.stringify({ sessionToken: 'st-json', accessToken: jwt })}`
|
|
const result = parseSoraRawTokens(raw)
|
|
|
|
expect(result.sessionTokens).toEqual(['st-json', 'st-dup'])
|
|
expect(result.accessTokens).toEqual([jwt])
|
|
})
|
|
|
|
it('parses session token from Set-Cookie line and strips cookie attributes', () => {
|
|
const raw =
|
|
'__Secure-next-auth.session-token.0=st-cookie-part-0; Domain=.chatgpt.com; Path=/; Expires=Thu, 28 May 2026 11:43:36 GMT; HttpOnly; Secure; SameSite=Lax'
|
|
const result = parseSoraRawTokens(raw)
|
|
|
|
expect(result.sessionTokens).toEqual(['st-cookie-part-0'])
|
|
expect(result.accessTokens).toEqual([])
|
|
})
|
|
|
|
it('merges chunked session-token cookies by numeric suffix order', () => {
|
|
const raw = [
|
|
'Set-Cookie: __Secure-next-auth.session-token.1=part-1; Path=/; HttpOnly',
|
|
'Set-Cookie: __Secure-next-auth.session-token.0=part-0; Path=/; HttpOnly'
|
|
].join('\n')
|
|
const result = parseSoraRawTokens(raw)
|
|
|
|
expect(result.sessionTokens).toEqual(['part-0part-1'])
|
|
expect(result.accessTokens).toEqual([])
|
|
})
|
|
|
|
it('prefers latest duplicate chunk values when multiple cookie groups exist', () => {
|
|
const raw = [
|
|
'Set-Cookie: __Secure-next-auth.session-token.0=old-0; Path=/; HttpOnly',
|
|
'Set-Cookie: __Secure-next-auth.session-token.1=old-1; Path=/; HttpOnly',
|
|
'Set-Cookie: __Secure-next-auth.session-token.0=new-0; Path=/; HttpOnly',
|
|
'Set-Cookie: __Secure-next-auth.session-token.1=new-1; Path=/; HttpOnly'
|
|
].join('\n')
|
|
const result = parseSoraRawTokens(raw)
|
|
|
|
expect(result.sessionTokens).toEqual(['new-0new-1'])
|
|
expect(result.accessTokens).toEqual([])
|
|
})
|
|
|
|
it('uses latest complete chunk group and ignores incomplete latest group', () => {
|
|
const raw = [
|
|
'set-cookie',
|
|
'__Secure-next-auth.session-token.0=ok-0; Domain=.chatgpt.com; Path=/',
|
|
'set-cookie',
|
|
'__Secure-next-auth.session-token.1=ok-1; Domain=.chatgpt.com; Path=/',
|
|
'set-cookie',
|
|
'__Secure-next-auth.session-token.0=partial-0; Domain=.chatgpt.com; Path=/'
|
|
].join('\n')
|
|
|
|
const result = parseSoraRawTokens(raw)
|
|
|
|
expect(result.sessionTokens).toEqual(['ok-0ok-1'])
|
|
expect(result.accessTokens).toEqual([])
|
|
})
|
|
})
|