-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move xmldom parsing to internal interface (#19)
* Move xmldom parsing to internal interface * fix lint errors * add changelog update
- Loading branch information
Showing
5 changed files
with
89 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
import { DOMParser } from 'xmldom'; | ||
|
||
export const ERR_INVALID_XML = 'XMLToReact: Unable to parse invalid XML input. Please input valid XML.'; | ||
|
||
const throwError = (m) => { throw new Error(m); }; | ||
|
||
const parser = new DOMParser({ | ||
errorHandler: throwError, | ||
fatalError: throwError, | ||
warning: throwError, | ||
}); | ||
|
||
|
||
/** | ||
* Parse an xml string | ||
* | ||
* @param {string} xml - xml to convert | ||
* @returns {Object} - xml tree | ||
* @public | ||
*/ | ||
export function parse(xml) { | ||
if (typeof xml !== 'string') { | ||
return null; | ||
} | ||
|
||
try { | ||
return parser.parseFromString(xml, 'text/xml'); | ||
} catch (e) { | ||
console.warn(ERR_INVALID_XML); | ||
} | ||
|
||
return null; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
import { DOMParser } from 'xmldom'; | ||
import { expect } from 'chai'; | ||
import sinon from 'sinon'; | ||
|
||
import { parse, ERR_INVALID_XML } from '../src/parser'; | ||
|
||
describe('XML parser', () => { | ||
let sandbox; | ||
|
||
before(() => { | ||
sandbox = sinon.sandbox.create(); | ||
}); | ||
|
||
afterEach(() => { | ||
sandbox.restore(); | ||
}); | ||
|
||
describe('parse', () => { | ||
it('should export a function', () => { | ||
expect(parse).to.be.a('function'); | ||
}); | ||
|
||
it('should return `null` when no text is passed', () => { | ||
expect(parse()).to.equal(null); | ||
expect(parse('foo')).not.to.equal(null); | ||
}); | ||
|
||
it('should parse XML from a string', () => { | ||
const mockXMLTree = {}; | ||
sandbox.stub(DOMParser.prototype, 'parseFromString').returns(mockXMLTree); | ||
expect(parse('foo')).to.equal(mockXMLTree); | ||
sinon.assert.calledWith(DOMParser.prototype.parseFromString, 'foo', 'text/xml'); | ||
}); | ||
|
||
describe('When an invalid XML string is passed', () => { | ||
beforeEach(() => { | ||
sandbox.stub(console, 'warn'); | ||
sandbox.stub(DOMParser.prototype, 'parseFromString').throws(new Error('boom')); | ||
}); | ||
|
||
it('should return `null`', () => { | ||
expect(parse('foo')).to.equal(null); | ||
}); | ||
|
||
it('should log a warning', () => { | ||
parse('foo'); | ||
sinon.assert.calledWith(console.warn, ERR_INVALID_XML); | ||
}); | ||
}); | ||
}); | ||
}); |