271 lines
5.5 KiB
TypeScript
271 lines
5.5 KiB
TypeScript
import fs from 'fs'
|
|
import 'mocha'
|
|
import should from 'should'
|
|
import stream from 'stream'
|
|
import zlib from 'zlib'
|
|
|
|
import { XmlParser } from '../src/parser'
|
|
describe('should respect explicitArray constructor option', () => {
|
|
it('should properly parse a simple file with explicitArray set to false.', (done) => {
|
|
const xml = fs.readFileSync('./test/TestFiles/item.xml')
|
|
const parser = new XmlParser({ resourcePath: '/items/item', explicitArray: false })
|
|
const expectedData = [
|
|
{
|
|
$: { id: '1', test: 'hello' },
|
|
subitem: { $: { sub: '2' }, _: 'two' }
|
|
},
|
|
{
|
|
$: { id: '2' },
|
|
subitem: { _: 'five' }
|
|
}
|
|
]
|
|
|
|
parser.parse(xml.toString(), (err, data) => {
|
|
if (err) {
|
|
done(err)
|
|
}
|
|
// console.log('data=', JSON.stringify(data))
|
|
should(data).deepEqual(expectedData)
|
|
done()
|
|
})
|
|
})
|
|
|
|
it('should properly parse a medium size file with explicitArray set to false.', (done) => {
|
|
const xml = fs.readFileSync('./test/TestFiles/medium.xml')
|
|
const parser = new XmlParser({ resourcePath: '/items/item', explicitArray: false })
|
|
const expectedData = [
|
|
{
|
|
$: {
|
|
id: '1',
|
|
test: 'hello'
|
|
},
|
|
subitem: {
|
|
$: {
|
|
sub: '2'
|
|
},
|
|
_: 'two'
|
|
}
|
|
},
|
|
{
|
|
$: {
|
|
id: '2'
|
|
},
|
|
subitem: {
|
|
_: 'five'
|
|
}
|
|
},
|
|
{
|
|
$: {
|
|
id: '3',
|
|
test: 'hello'
|
|
},
|
|
subitem: {
|
|
$: {
|
|
sub: '2'
|
|
},
|
|
_: 'two'
|
|
}
|
|
},
|
|
{
|
|
$: {
|
|
id: '4',
|
|
test: 'hello'
|
|
},
|
|
subitem: {
|
|
$: {
|
|
sub: '2'
|
|
},
|
|
_: 'two'
|
|
}
|
|
},
|
|
{
|
|
$: {
|
|
id: '5',
|
|
test: 'hello'
|
|
},
|
|
subitem: {
|
|
$: {
|
|
sub: '2'
|
|
},
|
|
_: 'two'
|
|
}
|
|
},
|
|
{
|
|
$: {
|
|
id: '6',
|
|
test: 'hello'
|
|
},
|
|
subitem: {
|
|
$: {
|
|
sub: '2'
|
|
},
|
|
_: 'two'
|
|
}
|
|
},
|
|
{
|
|
$: {
|
|
id: '7',
|
|
test: 'hello'
|
|
},
|
|
subitem: {
|
|
$: {
|
|
sub: '2'
|
|
},
|
|
_: 'two'
|
|
}
|
|
},
|
|
{
|
|
$: {
|
|
id: '8',
|
|
test: 'hello'
|
|
},
|
|
subitem: {
|
|
$: {
|
|
sub: '2'
|
|
},
|
|
_: 'two'
|
|
}
|
|
},
|
|
{
|
|
$: {
|
|
id: '9',
|
|
test: 'hello'
|
|
},
|
|
subitem: {
|
|
$: {
|
|
sub: '2'
|
|
},
|
|
_: 'two'
|
|
}
|
|
},
|
|
{
|
|
$: {
|
|
id: '10',
|
|
test: 'hello'
|
|
},
|
|
subitem: {
|
|
$: {
|
|
sub: '2'
|
|
},
|
|
_: 'two'
|
|
}
|
|
}
|
|
]
|
|
parser.parse(xml, (err, data) => {
|
|
if (err) {
|
|
done(err)
|
|
}
|
|
|
|
should(data).deepEqual(expectedData)
|
|
should(data.length).equal(10)
|
|
done()
|
|
})
|
|
})
|
|
|
|
it('should properly parse a file containing many nodes when explicitArray set to false.', (done) => {
|
|
const xml = fs.readFileSync('./test/TestFiles/manyItems.xml')
|
|
const parser = new XmlParser({ resourcePath: '/items/item', explicitArray: false })
|
|
|
|
parser.parse(xml, (err, data) => {
|
|
if (err) {
|
|
done(err)
|
|
}
|
|
|
|
should(data.length).equal(296)
|
|
done()
|
|
})
|
|
})
|
|
|
|
it('should properly parse a xml simple file in which nodes contain text values randomly when explicitArray set to false.', (done) => {
|
|
const xml = fs.readFileSync('./test/TestFiles/randomText.xml')
|
|
const parser = new XmlParser({ resourcePath: '/items/item', explicitArray: false })
|
|
const expectedData = [
|
|
{
|
|
$: { id: '1', test: 'hello' },
|
|
_: 'item one two',
|
|
subitem: { $: { sub: '2' }, _: 'two' }
|
|
},
|
|
{
|
|
$: { id: '2' },
|
|
_: 'item one two three four',
|
|
subitem: { _: 'five' }
|
|
}
|
|
]
|
|
|
|
parser.parse(xml, (err, data) => {
|
|
if (err) {
|
|
done(err)
|
|
}
|
|
|
|
should(data).deepEqual(expectedData)
|
|
should(data.length).equal(2)
|
|
done()
|
|
})
|
|
})
|
|
|
|
it('should properly parse a huge file with explicitArray set to false.', (done) => {
|
|
const xml = fs.readFileSync('./test/TestFiles/hugeFile.xml')
|
|
const parser = new XmlParser({ resourcePath: '/items/item', explicitArray: false })
|
|
// console.log(parser)
|
|
parser.parse(xml, (err, data) => {
|
|
if (err) {
|
|
done(err)
|
|
}
|
|
should(data.length).equal(2072)
|
|
done()
|
|
})
|
|
})
|
|
|
|
it('should properly return error if the xml file is corrupted.', (done) => {
|
|
const xml = fs.readFileSync('./test/TestFiles/corrupted.xml')
|
|
const parser = new XmlParser({ resourcePath: '/items/item', explicitArray: false })
|
|
|
|
parser.parse(xml, (err, data) => {
|
|
// console.log(err)
|
|
should(err.message).equal('mismatched tag at line no: 12')
|
|
should(data).not.be.ok()
|
|
done()
|
|
})
|
|
})
|
|
|
|
it('should properly generate objects when special symbols are passed as attrs and text keys and explicitArray is false in the options.', (done) => {
|
|
const xmlStream = fs.createReadStream('./test/TestFiles/item.xml')
|
|
const parser = new XmlParser({
|
|
resourcePath: '/items/item',
|
|
attrsKey: '!',
|
|
textKey: '%',
|
|
explicitArray: false
|
|
})
|
|
const expectedData = [
|
|
{
|
|
'!': { id: '1', test: 'hello' },
|
|
subitem: { '!': { sub: '2' }, '%': 'two' }
|
|
},
|
|
{
|
|
'!': { id: '2' },
|
|
subitem: { '%': 'five' }
|
|
}
|
|
]
|
|
const actualData: string[] = []
|
|
let dataEventCount = 0
|
|
|
|
parser.on('data', (data) => {
|
|
actualData.push(data)
|
|
dataEventCount++
|
|
})
|
|
|
|
parser.on('error', (err) => {
|
|
done(err)
|
|
})
|
|
|
|
parser.on('end', () => {
|
|
// console.log('actualData=', JSON.stringify(actualData, null, 1))
|
|
// console.log('dataEventCount=', dataEventCount)
|
|
should(actualData).deepEqual(expectedData)
|
|
should(dataEventCount).equal(2)
|
|
done()
|
|
})
|
|
xmlStream.pipe(parser)
|
|
})
|
|
})
|