0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-03 23:00:14 -05:00
ghost/core/test/unit/api/oembed_spec.js
Fabien O'Carroll 8ccf27340b Oembed meta tag fallback for unknown providers (#9827)
closes #9786

- Make GET request when url has no provider match
  - The HEAD request was made in order to send less data over the wire when
checking for redirects for urls that do not have an oembed provider
match. We are now going to look for provider metatags withing the
response of the request - rather than making a HEAD followed by a GET if
no redirect is found, this condenses that to a single request.

- Try to get OEmbed data from tag if no provider
  - Here we parse the HTML response of the resource and look for a link tag
that will give us the oembed resource url which we can use to fetch the
embed html
2018-08-27 15:02:03 +01:00

142 lines
5.4 KiB
JavaScript

const common = require('../../../server/lib/common');
const nock = require('nock');
const OembedAPI = require('../../../server/api/oembed');
const should = require('should');
describe('API: oembed', function () {
describe('fn: read', function () {
// https://oembed.com/providers.json only has schemes for https://reddit.com
it('finds match for unlisted http scheme', function (done) {
let requestMock = nock('https://www.reddit.com')
.get('/oembed')
.query(true)
.reply(200, {
html: 'test'
});
OembedAPI.read({url: 'http://www.reddit.com/r/pics/comments/8qi5oq/breathtaking_picture_of_jupiter_with_its_moon_io/'})
.then((results) => {
should.exist(results);
should.exist(results.html);
done();
}).catch(done);
});
it('finds match for schema-less urls', function (done) {
let requestMock = nock('https://www.reddit.com')
.get('/oembed')
.query(true)
.reply(200, {
html: 'test'
});
OembedAPI.read({url: '//www.reddit.com/r/pics/comments/8qi5oq/breathtaking_picture_of_jupiter_with_its_moon_io/'})
.then((results) => {
requestMock.isDone().should.be.true;
should.exist(results);
should.exist(results.html);
done();
}).catch(done);
});
it('follows redirects to get base url', function (done) {
let redirectMock = nock('https://youtu.be')
.intercept('/yHohwmrxrto', 'GET')
.reply(302, undefined, {
// eslint-disable-next-line
'Location': 'https://www.youtube.com/watch?v=yHohwmrxrto&feature=youtu.be'
});
let videoMock = nock('https://www.youtube.com')
.intercept('/watch', 'GET')
.query({v: 'yHohwmrxrto', feature: 'youtu.be'})
.reply(200);
let requestMock = nock('https://www.youtube.com')
.get('/oembed')
.query(true)
.reply(200, {
html: 'test'
});
OembedAPI.read({url: 'https://youtu.be/yHohwmrxrto'})
.then((results) => {
redirectMock.isDone().should.be.true;
videoMock.isDone().should.be.true;
requestMock.isDone().should.be.true;
should.exist(results);
should.exist(results.html);
results.html.should.eql('test');
done();
}).catch(done);
});
it('returns error for missing url', function (done) {
OembedAPI.read({url: ''})
.then(() => {
done(new Error('Fetch oembed without url should error'));
}).catch((err) => {
(err instanceof common.errors.BadRequestError).should.eql(true);
done();
});
});
it('returns error for unsupported provider', function (done) {
nock('http://example.com')
.intercept('/unknown', 'GET')
.reply(200);
OembedAPI.read({url: 'http://example.com/unknown'})
.then(() => {
done(new Error('Fetch oembed with unknown url provider should error'));
}).catch((err) => {
(err instanceof common.errors.ValidationError).should.eql(true);
done();
});
});
it('returns match for unsupported provider but with oembed link tag', function (done) {
nock('https://host.tld')
.intercept('/page', 'GET')
.reply(200, `
<html>
<head>
<link rel="alternate" type="application/json+oembed"
href="https://host.tld/oembed" title="Oh embed"/>
</head>
</html>
`);
const requestMock = nock('https://host.tld')
.intercept('/oembed', 'GET')
.query(true)
.reply(200, {
html: 'test'
});
OembedAPI.read({url: 'https://host.tld/page'})
.then((results) => {
requestMock.isDone().should.be.true;
should.exist(results);
should.exist(results.html);
results.html.should.eql('test');
done();
}).catch(done);
});
it('returns error for fetch failure', function (done) {
let requestMock = nock('https://www.youtube.com')
.get('/oembed')
.query(true)
.reply(500);
OembedAPI.read({url: 'https://www.youtube.com/watch?v=E5yFcdPAGv0'})
.then(() => {
done(new Error('Fetch oembed with external failure should error'));
}).catch((err) => {
(err instanceof common.errors.InternalServerError).should.eql(true);
done();
});
});
});
});