Ghost/ghost/oembed-service/test/oembed-service.test.js
Kevin Ansfield 3bc5eb8cf9
🐛 Fixed Bluesky URLs creating bookmarks rather than embeds (#20435)
closes https://github.com/TryGhost/Ghost/issues/20028

It's fairly common practice for oembed providers to skip some of the "required" fields from the oembed spec such as `height` when it doesn't make sense for the embeddable content, this was the case with Bluesky embeds which return `height: null`

- removed validation for `height` being present in the response for it to be recognised as an embed because we don't use it anywhere and the validation is blocking otherwise valid embeds
2024-06-20 20:41:24 +00:00

136 lines
5.0 KiB
JavaScript

const assert = require('assert/strict');
const nock = require('nock');
const got = require('got');
const OembedService = require('../');
describe('oembed-service', function () {
/** @type {OembedService} */
let oembedService;
before(function () {
oembedService = new OembedService({
config: {get() {
return true;
}},
externalRequest: got
});
nock.disableNetConnect();
});
afterEach(function () {
nock.cleanAll();
});
describe('known provider', function () {
it('should return data if successful', async function () {
nock('https://www.youtube.com')
.get('/oembed')
.query(true)
.reply(200, {
title: 'Test Title',
author_name: 'Test Author',
author_url: 'https://www.youtube.com/user/testauthor',
html: '<iframe src="https://www.youtube.com/embed/1234"></iframe>'
});
const response = await oembedService.knownProvider('https://www.youtube.com/watch?v=1234');
assert.equal(response.title, 'Test Title');
assert.equal(response.author_name, 'Test Author');
assert.equal(response.author_url, 'https://www.youtube.com/user/testauthor');
assert.equal(response.html, '<iframe src="https://www.youtube.com/embed/1234"></iframe>');
});
it('should return a ValidationError if upstream 401s', async function () {
nock('https://www.youtube.com')
.get('/oembed')
.query(true)
.reply(401);
try {
await oembedService.knownProvider('https://www.youtube.com/watch?v=1234');
} catch (error) {
assert.equal(error.name, 'ValidationError');
assert.equal(error.statusCode, 422);
assert.equal(error.context, 'URL contains a private resource.');
}
});
it('should return a ValidationError if upstream 403s', async function () {
nock('https://www.youtube.com')
.get('/oembed')
.query(true)
.reply(403);
try {
await oembedService.knownProvider('https://www.youtube.com/watch?v=1234');
} catch (error) {
assert.equal(error.name, 'ValidationError');
assert.equal(error.statusCode, 422);
assert.equal(error.context, 'URL contains a private resource.');
}
});
it('should return a ValidationError if upstream 404s', async function () {
nock('https://www.youtube.com')
.get('/oembed')
.query(true)
.reply(404);
try {
await oembedService.knownProvider('https://www.youtube.com/watch?v=1234');
} catch (error) {
assert.equal(error.name, 'ValidationError');
assert.equal(error.statusCode, 422);
assert.equal(error.context, 'Request failed with error code 404');
}
});
it('should return a ValidationError if upstream 500s', async function () {
nock('https://www.youtube.com')
.get('/oembed')
.query(true)
.reply(500);
try {
await oembedService.knownProvider('https://www.youtube.com/watch?v=1234');
} catch (error) {
assert.equal(error.name, 'ValidationError');
assert.equal(error.statusCode, 422);
assert.equal(error.context, 'Request failed with error code 500');
}
});
});
describe('fetchOembedDataFromUrl', function () {
it('allows rich embeds to skip height field', async function () {
nock('https://www.example.com')
.get('/')
.query(true)
.reply(200, `<html><head><link type="application/json+oembed" href="https://www.example.com/oembed"></head></html>`);
nock('https://www.example.com')
.get('/oembed')
.query(true)
.reply(200, {
type: 'rich',
version: '1.0',
title: 'Test Title',
author_name: 'Test Author',
author_url: 'https://example.com/user/testauthor',
html: '<iframe src="https://www.example.com/embed"></iframe>',
width: 640,
height: null
});
const response = await oembedService.fetchOembedDataFromUrl('https://www.example.com');
assert.equal(response.title, 'Test Title');
assert.equal(response.author_name, 'Test Author');
assert.equal(response.author_url, 'https://example.com/user/testauthor');
assert.equal(response.html, '<iframe src="https://www.example.com/embed"></iframe>');
});
});
});