const should = require('should');
const sinon = require('sinon');
const supertest = require('supertest');
const testUtils = require('../utils');
const configUtils = require('../utils/configUtils');
const urlUtils = require('../utils/urlUtils');
const settings = require('../../core/shared/settings-cache');
let request;
/**
* This file contains extra e2e tests for complex URL configurations
* Examples of e2e tests that belong here:
* - subdirectories
* - https
* - (maybe) admin + frontend URL are different
* - etc
*/
describe('Advanced URL Configurations', function () {
describe('Subdirectory config', function () {
before(async function () {
configUtils.set('url', 'http://localhost/blog/');
urlUtils.stubUrlUtilsFromConfig();
await testUtils.startGhost({forceStart: true});
request = supertest.agent(configUtils.config.get('server:host') + ':' + configUtils.config.get('server:port'));
});
after(function () {
configUtils.restore();
urlUtils.restore();
});
afterEach(function () {
sinon.restore();
});
it('http://localhost should 404', async function () {
await request.get('/')
.expect(404);
});
it('/blog should 301 to /blog/', async function () {
await request.get('/blog')
.expect(301)
.expect('Location', '/blog/');
});
it('/blog/ should 200', async function () {
await request.get('/blog/')
.expect(200);
});
it('/blog/welcome/ should 200', async function () {
await request.get('/blog/welcome/')
.expect(200);
});
it('/welcome/ should 404', async function () {
await request.get('/welcome/')
.expect(404);
});
it('/blog/tag/getting-started/ should 200', async function () {
await request.get('/blog/tag/getting-started/')
.expect(200);
});
it('/tag/getting-started/ should 404', async function () {
await request.get('/tag/getting-started/')
.expect(404);
});
it('/blog/welcome/amp/ should 200 if amp is enabled', async function () {
sinon.stub(settings, 'get').callsFake(function (key, ...rest) {
if (key === 'amp') {
return true;
}
return settings.get.wrappedMethod.call(settings, key, ...rest);
});
await request.get('/blog/welcome/amp/')
.expect(200);
});
it('/blog/welcome/amp/ should 301', async function () {
await request.get('/blog/welcome/amp/')
.expect(301);
});
it('/welcome/amp/ should 404', async function () {
await request.get('/welcome/amp/')
.expect(404);
});
});
// we'll use X-Forwarded-Proto: https to simulate an 'https://' request behind a proxy
describe('HTTPS', function () {
before(async function () {
configUtils.set('url', 'http://localhost:2370/');
urlUtils.stubUrlUtilsFromConfig();
await testUtils.startGhost({forceStart: true});
request = supertest.agent(configUtils.config.get('server:host') + ':' + configUtils.config.get('server:port'));
});
after(function () {
configUtils.restore();
urlUtils.restore();
});
it('should set links to url over non-HTTPS', async function () {
await request.get('/')
.expect(200)
.expect(//)
.expect(/Ghost<\/a\>/);
});
it('should set links over HTTPS besides canonical', async function () {
await request.get('/')
.set('X-Forwarded-Proto', 'https')
.expect(200)
.expect(//)
.expect(/Ghost<\/a\>/);
});
});
});