Files
shields/services/dynamic/dynamic-xml.spec.js
Marcin Mielnicki 4c159eff00 Support for XPath functions in [dynamicxml] badge (#4153)
* Support XPath query with type convertion

* Support XPath query with node function

* Parametrized tests for transform function

* Handle unusual values returned by 'select'
2019-10-12 17:23:17 +02:00

133 lines
3.2 KiB
JavaScript

'use strict'
const { expect } = require('chai')
const sinon = require('sinon')
const xpath = require('xpath')
const { test, given } = require('sazerac')
const DynamicXml = require('./dynamic-xml.service')
const { InvalidResponse } = require('..')
const exampleXml = `<?xml version="1.0"?>
<catalog>
<book id="bk101">
<title>XML Developer's Guide</title>
<price>44.95</price>
<genre>Computer</genre>
</book>
<book id="bk102">
<title>Midnight Rain</title>
<price>5.95</price>
<genre></genre>
</book>
</catalog>
`
describe('DynamicXml', function() {
describe('transform()', function() {
beforeEach(function() {
sinon.stub(xpath, 'select').returns(undefined)
})
afterEach(function() {
sinon.restore()
})
it('throws InvalidResponse on unsupported query', function() {
expect(() =>
DynamicXml.prototype.transform({
pathExpression: '//book/title',
buffer: exampleXml,
})
)
.to.throw(InvalidResponse)
.with.property('prettyMessage', 'unsupported query')
})
})
test(DynamicXml.prototype.transform, () => {
given({
pathExpression: '//book[1]/title/text()',
buffer: exampleXml,
}).expect({
values: ["XML Developer's Guide"],
})
given({ pathExpression: '//book/title/text()', buffer: exampleXml }).expect(
{
values: ["XML Developer's Guide", 'Midnight Rain'],
}
)
given({
pathExpression: 'string(//book[1]/title)',
buffer: exampleXml,
}).expect({
values: ["XML Developer's Guide"],
})
given({
pathExpression: 'string(//book/title)',
buffer: exampleXml,
}).expect({
values: ["XML Developer's Guide"],
})
given({
pathExpression: 'string(//book[1]/@id)',
buffer: exampleXml,
}).expect({
values: ['bk101'],
})
given({
pathExpression: 'substring(//book[1]/title, 5, 9)',
buffer: exampleXml,
}).expect({
values: ['Developer'],
})
given({
pathExpression: 'number(//book[1]/price)',
buffer: exampleXml,
}).expect({
values: [44.95],
})
given({
pathExpression: 'boolean(string(//book[1]/genre))',
buffer: exampleXml,
}).expect({
values: [true],
})
given({
pathExpression: 'boolean(string(//book[2]/genre))',
buffer: exampleXml,
}).expect({
values: [false],
})
given({
pathExpression: 'count(//book)',
buffer: exampleXml,
}).expect({
values: [2],
})
given({
pathExpression: 'floor(//book[1]/price)',
buffer: exampleXml,
}).expect({
values: [44],
})
given({
pathExpression: "//p[lang('en')]",
buffer: '<p xml:lang="en">Midnight Rain</p>',
}).expect({
values: ['Midnight Rain'],
})
given({
pathExpression: 'normalize-space(string(/title))',
buffer: '<title> Midnight Rain </title>',
}).expect({
values: ['Midnight Rain'],
})
given({
pathExpression: '//book[1]/title | //book[1]/price',
buffer: exampleXml,
}).expect({
values: ["XML Developer's Guide", '44.95'],
})
})
})