import { describe, it, expect } from 'vitest'
import { parseSoapXml, extractCwmpMessage, buildSoapEnvelope } from '../../../app/protocol/soap.js'
describe('parseSoapXml', () => {
it('parses a basic Inform SOAP envelope', () => {
const xml = `
0001
Test
`
const result = parseSoapXml(xml)
expect(result.header.id).toBe('0001')
expect(result.body).toBeDefined()
expect(result.cwmpVersion).toBe('1.0')
})
it('parses soapenv prefix variant', () => {
const xml = `
42
1
`
const result = parseSoapXml(xml)
expect(String(result.header.id)).toBe('42')
})
it('handles missing header gracefully', () => {
const xml = `
`
const result = parseSoapXml(xml)
expect(result.header.id).toBeUndefined()
})
})
describe('extractCwmpMessage', () => {
it('extracts Inform message', () => {
const body = { 'cwmp:Inform': { DeviceId: { Manufacturer: 'Test' } } }
const msg = extractCwmpMessage(body)
expect(msg).not.toBeNull()
expect(msg!.type).toBe('Inform')
expect(msg!.data.DeviceId.Manufacturer).toBe('Test')
})
it('extracts GetParameterValuesResponse', () => {
const body = { 'cwmp:GetParameterValuesResponse': { ParameterList: [] } }
const msg = extractCwmpMessage(body)
expect(msg!.type).toBe('GetParameterValuesResponse')
})
it('returns null for empty body', () => {
expect(extractCwmpMessage({})).toBeNull()
})
it('returns null for non-cwmp keys', () => {
expect(extractCwmpMessage({ 'other:Thing': {} })).toBeNull()
})
})
describe('buildSoapEnvelope', () => {
it('builds valid XML envelope', () => {
const xml = buildSoapEnvelope('id-123', '')
expect(xml).toContain('soap-env:Envelope')
expect(xml).toContain('id-123')
expect(xml).toContain('')
})
it('builds envelope without id', () => {
const xml = buildSoapEnvelope(undefined, '')
expect(xml).toContain('')
})
})