mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-01-06 02:44:33 +03:00
9eadeb9fbb
refs #5942, #6150 There were a few key problems I was looking to solve with this: - Introduce a single point of truth for what the URL for accessing the API should be - Provide a simple way to configure the utility (much like a true SDK) As of this commit, this utility is still automatically available in a Ghost theme. To use it on an external site, the code would look like: ``` <script type="text/javascript" src="http://my-ghost-blog.com/shared/ghost-url.min.js"></script> <script type="text/javascript"> ghost.init({ clientId: "<your-client-id>", clientSecret: "<your-client-secret>" }); </script> ``` To achieve this, there have been a number of changes: - A new `apiUrl` function has been added to config, which calculates the correct URL. This needs to be unified with the other url generation functions as a separate piece of work. - The serveSharedFile middleware has been updated, so that it can serve files from / or /shared and to substitute `{{api-url}}` as it does `{{blog-url}}`. - ghost-url.js and ghost-url.min.js have been updated to be served via the serveSharedFile middleware - ghost-url.js has been changed slightly, to take the url from an inline variable which is substituted the first time it is served - `{{ghost_head}}` has been updated, removing the api url handling which is now in config/url.js and removing the configuration of the utility in favour of calling `init()` after the script is required - `{{ghost_head}}` has also had the meta tags for client id and secret removed - tests have been updated
106 lines
3.5 KiB
JavaScript
106 lines
3.5 KiB
JavaScript
/*globals describe, it, beforeEach, afterEach */
|
|
/*jshint expr:true*/
|
|
var fs = require('fs'),
|
|
sinon = require('sinon'),
|
|
serveSharedFile = require('../../../server/middleware/serve-shared-file'),
|
|
|
|
sandbox = sinon.sandbox.create();
|
|
|
|
describe('serveSharedFile', function () {
|
|
var res, req, next;
|
|
|
|
beforeEach(function () {
|
|
res = sinon.spy();
|
|
req = sinon.spy();
|
|
next = sinon.spy();
|
|
});
|
|
|
|
afterEach(function () {
|
|
sandbox.restore();
|
|
});
|
|
|
|
it('should return a middleware', function () {
|
|
var result = serveSharedFile('robots.txt', 'text/plain', 3600);
|
|
|
|
result.should.be.a.Function;
|
|
});
|
|
|
|
it('should skip if the request does NOT match the file', function () {
|
|
var middleware = serveSharedFile('robots.txt', 'text/plain', 3600);
|
|
req.path = '/favicon.ico';
|
|
middleware(req, res, next);
|
|
next.called.should.be.true;
|
|
});
|
|
|
|
it('should load the file and send it', function () {
|
|
var middleware = serveSharedFile('robots.txt', 'text/plain', 3600),
|
|
body = 'User-agent: * Disallow: /';
|
|
req.path = '/robots.txt';
|
|
|
|
sandbox.stub(fs, 'readFile', function (file, cb) {
|
|
cb(null, body);
|
|
});
|
|
|
|
res = {
|
|
writeHead: sinon.spy(),
|
|
end: sinon.spy()
|
|
};
|
|
|
|
middleware(req, res, next);
|
|
next.called.should.be.false;
|
|
res.writeHead.called.should.be.true;
|
|
res.writeHead.args[0][0].should.equal(200);
|
|
res.writeHead.calledWith(200, sinon.match.has('Content-Type')).should.be.true;
|
|
res.writeHead.calledWith(200, sinon.match.has('Content-Length')).should.be.true;
|
|
res.writeHead.calledWith(200, sinon.match.has('ETag')).should.be.true;
|
|
res.writeHead.calledWith(200, sinon.match.has('Cache-Control', 'public, max-age=3600')).should.be.true;
|
|
|
|
res.end.calledWith(body).should.be.true;
|
|
});
|
|
|
|
it('should send the correct headers', function () {
|
|
var middleware = serveSharedFile('robots.txt', 'text/plain', 3600),
|
|
body = 'User-agent: * Disallow: /';
|
|
req.path = '/robots.txt';
|
|
|
|
sandbox.stub(fs, 'readFile', function (file, cb) {
|
|
cb(null, body);
|
|
});
|
|
|
|
res = {
|
|
writeHead: sinon.spy(),
|
|
end: sinon.spy()
|
|
};
|
|
|
|
middleware(req, res, next);
|
|
next.called.should.be.false;
|
|
res.writeHead.called.should.be.true;
|
|
res.writeHead.args[0][0].should.equal(200);
|
|
res.writeHead.calledWith(200, sinon.match.has('Content-Type')).should.be.true;
|
|
res.writeHead.calledWith(200, sinon.match.has('Content-Length')).should.be.true;
|
|
res.writeHead.calledWith(200, sinon.match.has('ETag')).should.be.true;
|
|
res.writeHead.calledWith(200, sinon.match.has('Cache-Control', 'public, max-age=3600')).should.be.true;
|
|
});
|
|
|
|
it('should replace {{blog-url}} in text/plain', function () {
|
|
var middleware = serveSharedFile('robots.txt', 'text/plain', 3600),
|
|
body = 'User-agent: {{blog-url}}';
|
|
req.path = '/robots.txt';
|
|
|
|
sandbox.stub(fs, 'readFile', function (file, cb) {
|
|
cb(null, body);
|
|
});
|
|
|
|
res = {
|
|
writeHead: sinon.spy(),
|
|
end: sinon.spy()
|
|
};
|
|
|
|
middleware(req, res, next);
|
|
next.called.should.be.false;
|
|
res.writeHead.called.should.be.true;
|
|
|
|
res.end.calledWith('User-agent: http://127.0.0.1:2369').should.be.true;
|
|
});
|
|
});
|