const path = require('path'); const should = require('should'); const supertest = require('supertest'); const sinon = require('sinon'); const config = require('../../../core/shared/config'); const {events} = require('../../../core/server/lib/common'); const testUtils = require('../../utils'); const localUtils = require('./utils'); describe('DB API', function () { let request; let eventsTriggered; before(async function () { await testUtils.startGhost(); request = supertest.agent(config.get('url')); await localUtils.doAuth(request); }); beforeEach(function () { eventsTriggered = {}; sinon.stub(events, 'emit').callsFake((eventName, eventObj) => { if (!eventsTriggered[eventName]) { eventsTriggered[eventName] = []; } eventsTriggered[eventName].push(eventObj); }); }); afterEach(function () { sinon.restore(); }); it('Can export a JSON database', async function () { const res = await request.get(localUtils.API.getApiQuery(`db/`)) .set('Origin', config.get('url')) .expect('Content-Type', /json/) .expect('Cache-Control', testUtils.cacheRules.private) .expect(200) .expect('Content-Disposition', /Attachment; filename="[A-Za-z0-9._-]+\.json"/); should.not.exist(res.headers['x-cache-invalidate']); should.exist(res.headers['content-disposition']); const jsonResponse = res.body; should.exist(jsonResponse.db); jsonResponse.db.should.have.length(1); Object.keys(jsonResponse.db[0].data).length.should.eql(34); }); it('Can import a JSON database', async function () { await request.delete(localUtils.API.getApiQuery('db/')) .set('Origin', config.get('url')) .set('Accept', 'application/json') .expect(204); const res = await request.post(localUtils.API.getApiQuery('db/')) .set('Origin', config.get('url')) .set('Accept', 'application/json') .expect('Content-Type', /json/) .attach('importfile', path.join(__dirname, '/../../utils/fixtures/export/default_export.json')) .expect(200); const jsonResponse = res.body; should.exist(jsonResponse.db); should.exist(jsonResponse.problems); jsonResponse.problems.should.have.length(3); const res2 = await request.get(localUtils.API.getApiQuery('posts/')) .set('Origin', config.get('url')) .expect('Content-Type', /json/) .expect('Cache-Control', testUtils.cacheRules.private) .expect(200); res2.body.posts.should.have.length(7); }); it('Can delete all content', async function () { const res = await request .get(localUtils.API.getApiQuery('posts/')) .set('Origin', config.get('url')) .expect('Content-Type', /json/) .expect('Cache-Control', testUtils.cacheRules.private) .expect(200); let jsonResponse = res.body; jsonResponse.posts.should.have.length(7); await request.delete(localUtils.API.getApiQuery('db/')) .set('Origin', config.get('url')) .set('Accept', 'application/json') .expect(204); const res2 = await request.get(localUtils.API.getApiQuery('posts/')) .set('Origin', config.get('url')) .expect('Content-Type', /json/) .expect('Cache-Control', testUtils.cacheRules.private) .expect(200); res2.body.posts.should.have.length(0); eventsTriggered['post.unpublished'].length.should.eql(7); eventsTriggered['post.deleted'].length.should.eql(7); eventsTriggered['tag.deleted'].length.should.eql(1); }); });