diff --git a/src/schemaloader.js b/src/schemaloader.js index dd143b561..7488535bc 100644 --- a/src/schemaloader.js +++ b/src/schemaloader.js @@ -208,7 +208,7 @@ export class SchemaLoader { this.refs[url] = 'loading' waiting++ - const fetchUrl = this._isLocalUrl(fileBase, url) ? fileBase + url : url + const fetchUrl = this._isLocalUrl(url, fileBase) ? fileBase + url : url const r = new XMLHttpRequest() r.overrideMimeType('application/json') diff --git a/tests/unit/schemaloader.spec.js b/tests/unit/schemaloader.spec.js index 55ee05067..6af8ac3c0 100644 --- a/tests/unit/schemaloader.spec.js +++ b/tests/unit/schemaloader.spec.js @@ -51,15 +51,12 @@ describe('SchemaLoader', () => { }) describe('when external ref exists', () => { - let response - let server - - beforeAll(() => { - response = { + it('should set oprion { ajax: true }', done => { + const response = { type: 'string', minLength: 4 } - server = createFakeServer() + const server = createFakeServer() server.autoRespond = true window.XMLHttpRequest = server.xhr server.respondWith([ @@ -67,13 +64,6 @@ describe('SchemaLoader', () => { { 'Content-Type': 'application/json' }, JSON.stringify(response) ]) - }) - - afterAll(() => { - server.restore() - }) - - it('should set oprion { ajax: true }', done => { fetchUrl = document.location.origin + document.location.pathname.toString() loader = new SchemaLoader({ ajax: true }) @@ -92,6 +82,54 @@ describe('SchemaLoader', () => { const urls = Object.keys(loader.refs) expect(urls.length).toEqual(1) done() + server.restore() + }, + fetchUrl, + fileBase + ) + }) + }) + + describe('when external relative $ref exists', () => { + it('can get refs recursively', done => { + const schema1 = { + type: 'object', + properties: { + fname: { $ref: '/schema/main.json' }, + lname: { $ref: '/schema/main.json' } + } + } + const schema2 = { + $ref: 'registry/sub.json' + } + const schema3 = { + type: 'string', + minLength: 4 + } + const server = createFakeServer() + server.autoRespond = true + window.XMLHttpRequest = server.xhr + server.respondWith('/schema/main.json', [ + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(schema2) + ]) + server.respondWith('/schema/registry/sub.json', [ + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(schema3) + ]) + fetchUrl = + document.location.origin + document.location.pathname.toString() + loader = new SchemaLoader({ ajax: true }) + fileBase = loader._getFileBase(document.location.toString()) + loader.load( + schema1, + schema => { + console.log(loader.refs_with_info) + expect(Object.keys(loader.refs).length).toBe(2) + done() + server.restore() }, fetchUrl, fileBase