2022-03-05 22:57:23 +04:00
|
|
|
|
import { expect } from 'chai';
|
|
|
|
|
import fs from 'fs';
|
|
|
|
|
import path from 'path';
|
|
|
|
|
import config from 'config';
|
2022-08-24 17:05:40 +03:00
|
|
|
|
import Page from '../../backend/models/page.js';
|
|
|
|
|
import translateString from '../../backend/utils/translation.js';
|
|
|
|
|
import database from '../../backend/utils/database/index.js';
|
|
|
|
|
import { fileURLToPath } from 'url';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The __dirname CommonJS variables are not available in ES modules.
|
|
|
|
|
* https://nodejs.org/api/esm.html#no-__filename-or-__dirname
|
|
|
|
|
*/
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
|
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
|
const pages = database['pages'];
|
2019-01-25 02:23:00 +03:00
|
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
|
describe('Page model', () => {
|
|
|
|
|
const transformToUri = (text: string): string => {
|
|
|
|
|
return translateString(text
|
2019-01-25 02:23:00 +03:00
|
|
|
|
.replace(/ /g, ' ')
|
|
|
|
|
.replace(/[^a-zA-Z0-9А-Яа-яЁё ]/g, ' ')
|
|
|
|
|
.replace(/ +/g, ' ')
|
|
|
|
|
.trim()
|
|
|
|
|
.toLowerCase()
|
|
|
|
|
.split(' ')
|
|
|
|
|
.join('-'));
|
|
|
|
|
};
|
|
|
|
|
|
2018-10-07 19:15:10 +03:00
|
|
|
|
after(() => {
|
2022-03-05 22:57:23 +04:00
|
|
|
|
const pathToDB = path.resolve(__dirname, '../../../', config.get('database'), './pages.db');
|
2018-10-07 19:15:10 +03:00
|
|
|
|
|
|
|
|
|
if (fs.existsSync(pathToDB)) {
|
|
|
|
|
fs.unlinkSync(pathToDB);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2018-08-17 13:58:44 +03:00
|
|
|
|
it('Working with empty model', async () => {
|
|
|
|
|
let page = new Page();
|
|
|
|
|
|
|
|
|
|
expect(page.data).to.be.a('object');
|
|
|
|
|
|
|
|
|
|
let {data} = page;
|
|
|
|
|
|
|
|
|
|
expect(data._id).to.be.undefined;
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(data.title).to.be.empty;
|
2019-01-25 02:23:00 +03:00
|
|
|
|
expect(data.uri).to.be.empty;
|
2018-08-17 13:58:44 +03:00
|
|
|
|
expect(data.body).to.be.undefined;
|
2019-01-25 06:19:37 +03:00
|
|
|
|
expect(data.parent).to.be.equal('0');
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
|
page = new Page();
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
|
|
|
|
data = page.data;
|
|
|
|
|
|
|
|
|
|
expect(data._id).to.be.undefined;
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(data.title).to.be.empty;
|
2019-01-25 02:23:00 +03:00
|
|
|
|
expect(data.uri).to.be.empty;
|
2018-08-17 13:58:44 +03:00
|
|
|
|
expect(data.body).to.be.undefined;
|
2019-01-25 06:19:37 +03:00
|
|
|
|
expect(data.parent).to.be.equal('0');
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
2018-10-04 22:08:21 +03:00
|
|
|
|
const initialData = {
|
|
|
|
|
_id: 'page_id',
|
|
|
|
|
body: {
|
|
|
|
|
blocks: [
|
|
|
|
|
{
|
|
|
|
|
type: 'header',
|
|
|
|
|
data: {
|
|
|
|
|
text: 'Page header'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
};
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
|
|
|
|
page = new Page(initialData);
|
|
|
|
|
|
|
|
|
|
const json = page.toJSON();
|
|
|
|
|
|
|
|
|
|
data = page.data;
|
|
|
|
|
|
|
|
|
|
expect(data._id).to.equal(initialData._id);
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(data.title).to.equal(initialData.body.blocks[0].data.text);
|
2019-01-25 02:23:00 +03:00
|
|
|
|
expect(data.uri).to.be.empty;
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(data.body).to.deep.equal(initialData.body);
|
2019-01-25 06:19:37 +03:00
|
|
|
|
expect(data.parent).to.be.equal('0');
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
|
|
|
|
expect(json._id).to.equal(initialData._id);
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(json.title).to.equal(initialData.body.blocks[0].data.text);
|
2019-01-25 02:23:00 +03:00
|
|
|
|
expect(json.title).to.equal(initialData.body.blocks[0].data.text);
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(json.body).to.deep.equal(initialData.body);
|
2019-01-25 06:19:37 +03:00
|
|
|
|
expect(json.parent).to.be.equal('0');
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
|
|
|
|
const update = {
|
2022-03-05 22:57:23 +04:00
|
|
|
|
_id: '12345',
|
2018-10-04 22:08:21 +03:00
|
|
|
|
body: {
|
|
|
|
|
blocks: [
|
|
|
|
|
{
|
|
|
|
|
type: 'header',
|
|
|
|
|
data: {
|
|
|
|
|
text: 'Updated page header'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
2018-08-17 13:58:44 +03:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
page.data = update;
|
|
|
|
|
|
|
|
|
|
data = page.data;
|
|
|
|
|
|
|
|
|
|
expect(data._id).to.equal(initialData._id);
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(data.title).to.equal(update.body.blocks[0].data.text);
|
2019-01-25 02:23:00 +03:00
|
|
|
|
expect(data.uri).to.be.empty;
|
2018-08-17 13:58:44 +03:00
|
|
|
|
expect(data.body).to.equal(update.body);
|
2019-01-25 06:19:37 +03:00
|
|
|
|
expect(data.parent).to.be.equal('0');
|
2018-08-17 13:58:44 +03:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('Saving, updating and deleting model in the database', async () => {
|
2018-10-04 22:08:21 +03:00
|
|
|
|
const initialData = {
|
|
|
|
|
body: {
|
|
|
|
|
blocks: [
|
|
|
|
|
{
|
|
|
|
|
type: 'header',
|
|
|
|
|
data: {
|
2019-01-25 02:23:00 +03:00
|
|
|
|
text: 'New page header'
|
2018-10-04 22:08:21 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
};
|
2018-08-17 13:58:44 +03:00
|
|
|
|
const page = new Page(initialData);
|
|
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
|
const savedPage = await page.save();
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
|
|
|
|
expect(savedPage._id).not.be.undefined;
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(savedPage.title).to.equal(initialData.body.blocks[0].data.text);
|
2019-01-25 02:23:00 +03:00
|
|
|
|
expect(savedPage.uri).to.equal(transformToUri(initialData.body.blocks[0].data.text));
|
2018-08-17 13:58:44 +03:00
|
|
|
|
expect(savedPage.body).to.equal(initialData.body);
|
|
|
|
|
expect(page._id).not.be.undefined;
|
|
|
|
|
|
|
|
|
|
const insertedPage = await pages.findOne({_id: page._id});
|
|
|
|
|
|
|
|
|
|
expect(insertedPage._id).to.equal(page._id);
|
|
|
|
|
expect(insertedPage.title).to.equal(page.title);
|
2019-01-25 02:23:00 +03:00
|
|
|
|
expect(insertedPage.uri).to.equal(page.uri);
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(insertedPage.body).to.deep.equal(page.body);
|
|
|
|
|
|
|
|
|
|
const updateData = {
|
|
|
|
|
body: {
|
|
|
|
|
blocks: [
|
|
|
|
|
{
|
|
|
|
|
type: 'header',
|
|
|
|
|
data: {
|
|
|
|
|
text: 'Updated page header'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
2019-01-25 02:23:00 +03:00
|
|
|
|
},
|
|
|
|
|
uri: 'updated-uri'
|
2018-10-04 22:08:21 +03:00
|
|
|
|
};
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
|
|
|
|
page.data = updateData;
|
|
|
|
|
await page.save();
|
|
|
|
|
|
|
|
|
|
expect(page._id).to.equal(insertedPage._id);
|
|
|
|
|
|
|
|
|
|
const updatedPage = await pages.findOne({_id: page._id});
|
|
|
|
|
|
|
|
|
|
expect(updatedPage._id).to.equal(savedPage._id);
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(updatedPage.title).to.equal(updateData.body.blocks[0].data.text);
|
2019-01-25 02:23:00 +03:00
|
|
|
|
expect(updatedPage.uri).to.equal(updateData.uri);
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(updatedPage.body).to.deep.equal(updateData.body);
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
|
|
|
|
await page.destroy();
|
|
|
|
|
|
|
|
|
|
expect(page._id).to.be.undefined;
|
|
|
|
|
|
|
|
|
|
const removedPage = await pages.findOne({_id: updatedPage._id});
|
|
|
|
|
|
|
|
|
|
expect(removedPage).to.be.null;
|
|
|
|
|
});
|
|
|
|
|
|
2019-01-25 02:23:00 +03:00
|
|
|
|
it('Handle multiple page creation with the same uri', async () => {
|
|
|
|
|
const initialData = {
|
|
|
|
|
body: {
|
|
|
|
|
blocks: [
|
|
|
|
|
{
|
|
|
|
|
type: 'header',
|
|
|
|
|
data: {
|
|
|
|
|
text: 'New page header'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const firstPage = new Page(initialData);
|
|
|
|
|
let firstSavedPage = await firstPage.save();
|
|
|
|
|
const secondPage = new Page(initialData);
|
2022-03-05 22:57:23 +04:00
|
|
|
|
const secondSavedPage = await secondPage.save();
|
2019-01-25 02:23:00 +03:00
|
|
|
|
|
|
|
|
|
expect(secondSavedPage.uri).to.equal(transformToUri(initialData.body.blocks[0].data.text) + '-1');
|
|
|
|
|
|
|
|
|
|
const newUri = 'new-uri';
|
|
|
|
|
|
|
|
|
|
firstPage.data = {...firstPage.data, uri: newUri};
|
|
|
|
|
firstSavedPage = await firstPage.save();
|
|
|
|
|
|
|
|
|
|
expect(firstSavedPage.uri).to.equal(newUri);
|
|
|
|
|
|
|
|
|
|
const thirdPage = new Page(initialData);
|
2022-03-05 22:57:23 +04:00
|
|
|
|
const thirdSavedPage = await thirdPage.save();
|
2019-01-25 02:23:00 +03:00
|
|
|
|
|
|
|
|
|
expect(thirdSavedPage.uri).to.equal(transformToUri(initialData.body.blocks[0].data.text));
|
|
|
|
|
});
|
|
|
|
|
|
2018-08-17 13:58:44 +03:00
|
|
|
|
it('Static get method', async () => {
|
2018-10-04 22:08:21 +03:00
|
|
|
|
const initialData = {
|
|
|
|
|
body: {
|
|
|
|
|
blocks: [
|
|
|
|
|
{
|
|
|
|
|
type: 'header',
|
|
|
|
|
data: {
|
|
|
|
|
text: 'Test Page header'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
};
|
2018-08-17 13:58:44 +03:00
|
|
|
|
const page = new Page(initialData);
|
|
|
|
|
|
|
|
|
|
const savedPage = await page.save();
|
|
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
|
if (savedPage._id == undefined) {
|
|
|
|
|
await page.destroy();
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2018-08-17 13:58:44 +03:00
|
|
|
|
const foundPage = await Page.get(savedPage._id);
|
|
|
|
|
|
|
|
|
|
const {data} = foundPage;
|
|
|
|
|
|
|
|
|
|
expect(data._id).to.equal(savedPage._id);
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(data.title).to.equal(initialData.body.blocks[0].data.text);
|
2019-01-25 02:23:00 +03:00
|
|
|
|
expect(data.uri).to.equal(transformToUri(initialData.body.blocks[0].data.text));
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(data.body).to.deep.equal(initialData.body);
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
|
|
|
|
await page.destroy();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('Static getAll method', async () => {
|
|
|
|
|
const pagesToSave = [
|
2018-10-04 22:08:21 +03:00
|
|
|
|
new Page({
|
|
|
|
|
body: {
|
|
|
|
|
blocks: [
|
|
|
|
|
{
|
|
|
|
|
type: 'header',
|
|
|
|
|
data: {
|
|
|
|
|
text: 'Page 1 header'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
}),
|
|
|
|
|
new Page({
|
|
|
|
|
body: {
|
|
|
|
|
blocks: [
|
|
|
|
|
{
|
|
|
|
|
type: 'header',
|
|
|
|
|
data: {
|
|
|
|
|
text: 'Page 2 header'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
})
|
2018-08-17 13:58:44 +03:00
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const savedPages = await Promise.all(pagesToSave.map(page => page.save()));
|
|
|
|
|
|
|
|
|
|
const foundPages = await Page.getAll({_id: {$in: savedPages.map(page => page._id)}});
|
|
|
|
|
|
|
|
|
|
expect(foundPages.length).to.equal(2);
|
|
|
|
|
foundPages.forEach((page, i) => {
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(page.title).to.equal(pagesToSave[i].body.blocks[0].data.text);
|
2019-01-25 02:23:00 +03:00
|
|
|
|
expect(page.uri).to.equal(transformToUri(pagesToSave[i].body.blocks[0].data.text));
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(page.body).to.deep.equal(pagesToSave[i].body);
|
2018-08-17 13:58:44 +03:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('Parent pages', async () => {
|
2018-10-04 22:08:21 +03:00
|
|
|
|
const parent = new Page(
|
|
|
|
|
{
|
|
|
|
|
body: {
|
|
|
|
|
blocks: [
|
|
|
|
|
{
|
|
|
|
|
type: 'header',
|
|
|
|
|
data: {
|
|
|
|
|
text: 'Parent page header'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
);
|
2018-08-17 13:58:44 +03:00
|
|
|
|
const {_id: parentId} = await parent.save();
|
|
|
|
|
|
2018-10-04 22:08:21 +03:00
|
|
|
|
const child = new Page(
|
|
|
|
|
{
|
|
|
|
|
body: {
|
|
|
|
|
blocks: [
|
|
|
|
|
{
|
|
|
|
|
type: 'header',
|
|
|
|
|
data: {
|
|
|
|
|
text: 'Child page header'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
2022-03-05 22:57:23 +04:00
|
|
|
|
},
|
|
|
|
|
parent: parentId,
|
2018-10-04 22:08:21 +03:00
|
|
|
|
}
|
|
|
|
|
);
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
|
|
|
|
const {_id: childId} = await child.save();
|
|
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
|
const testedParent = await child.getParent();
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
|
expect(testedParent).to.be.not.null;
|
|
|
|
|
if (testedParent) {
|
|
|
|
|
expect(testedParent._id).to.equal(parentId);
|
|
|
|
|
expect(testedParent.title).to.equal(parent.body.blocks[0].data.text);
|
|
|
|
|
expect(testedParent.uri).to.equal(transformToUri(parent.body.blocks[0].data.text));
|
|
|
|
|
expect(testedParent.body).to.deep.equal(parent.body);
|
|
|
|
|
}
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
|
|
|
|
const children = await parent.children;
|
|
|
|
|
|
|
|
|
|
expect(children.length).to.equal(1);
|
|
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
|
const temp: Page|undefined = children.pop();
|
|
|
|
|
const testedChild: Page = !temp ? new Page({}) : temp;
|
2018-08-17 13:58:44 +03:00
|
|
|
|
|
|
|
|
|
expect(testedChild._id).to.equal(childId);
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(testedChild.title).to.equal(child.body.blocks[0].data.text);
|
2019-01-25 02:23:00 +03:00
|
|
|
|
expect(testedChild.uri).to.equal(transformToUri(child.body.blocks[0].data.text));
|
2018-10-04 22:08:21 +03:00
|
|
|
|
expect(testedChild.body).to.deep.equal(child.body);
|
2018-08-17 13:58:44 +03:00
|
|
|
|
expect(testedChild._parent).to.equal(child._parent);
|
|
|
|
|
expect(testedChild._parent).to.equal(parent._id);
|
|
|
|
|
|
|
|
|
|
parent.destroy();
|
|
|
|
|
child.destroy();
|
|
|
|
|
});
|
2018-10-04 22:08:21 +03:00
|
|
|
|
|
|
|
|
|
it('Extracting title from page body', async () => {
|
|
|
|
|
const pageData = {
|
|
|
|
|
body: {
|
|
|
|
|
blocks: [
|
|
|
|
|
{
|
|
|
|
|
type: 'header',
|
|
|
|
|
data: {
|
|
|
|
|
text: 'Page header'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const page = new Page(pageData);
|
|
|
|
|
|
|
|
|
|
expect(page.title).to.equal(pageData.body.blocks[0].data.text);
|
|
|
|
|
});
|
2019-01-25 06:19:37 +03:00
|
|
|
|
|
|
|
|
|
it('test deletion', async () => {
|
2022-03-05 22:57:23 +04:00
|
|
|
|
const pageIndexes = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
|
2019-01-25 06:19:37 +03:00
|
|
|
|
const orders = {
|
|
|
|
|
'0' : ['1', '2', '3'],
|
|
|
|
|
'1' : ['4', '5'],
|
|
|
|
|
'5' : ['6', '7', '8'],
|
2022-03-05 22:57:23 +04:00
|
|
|
|
'3' : ['9'],
|
|
|
|
|
} as { [key: string]: string[] };
|
|
|
|
|
|
|
|
|
|
function deleteRecursively(startFrom: string): void {
|
|
|
|
|
const order: string[] = orders[startFrom];
|
2019-01-25 06:19:37 +03:00
|
|
|
|
|
|
|
|
|
if (!order) {
|
2022-03-05 22:57:23 +04:00
|
|
|
|
const found = pageIndexes.indexOf(startFrom);
|
|
|
|
|
|
|
|
|
|
pageIndexes.splice(found, 1);
|
|
|
|
|
|
2019-01-25 06:19:37 +03:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
order.forEach(id => {
|
|
|
|
|
deleteRecursively(id);
|
|
|
|
|
});
|
|
|
|
|
|
2022-03-05 22:57:23 +04:00
|
|
|
|
const found = pageIndexes.indexOf(startFrom);
|
|
|
|
|
pageIndexes.splice(found, 1);
|
2019-01-25 06:19:37 +03:00
|
|
|
|
}
|
|
|
|
|
});
|
2018-08-17 13:58:44 +03:00
|
|
|
|
});
|