0b4e249037
closes https://linear.app/tryghost/issue/ENG-762 - nytimes.com and other sites return 403 responses when requests do not match typical browser user-agents - our bookmark fetching requests were using `Ghost(https://github.com/TryGhost/Ghost)` meaning bookmark creation failed for these user-agent-blocking sites - switched to using a standard browser user-agent string to avoid such blocks
151 lines
5.7 KiB
JavaScript
151 lines
5.7 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>');
|
|
});
|
|
|
|
it('uses a known user-agent for bookmark requests', async function () {
|
|
nock('https://www.example.com')
|
|
.get('/')
|
|
.query(true)
|
|
.matchHeader('User-Agent', /Mozilla\/.*/)
|
|
.reply(200, `<html><head><title>Example</title></head></html>`);
|
|
|
|
const response = await oembedService.fetchOembedDataFromUrl('https://www.example.com', 'bookmark');
|
|
|
|
assert.equal(response.version, '1.0');
|
|
assert.equal(response.type, 'bookmark');
|
|
assert.equal(response.url, 'https://www.example.com');
|
|
assert.equal(response.metadata.title, 'Example');
|
|
});
|
|
});
|
|
});
|