2018-10-05 00:50:45 +02:00
|
|
|
const should = require('should');
|
2020-03-30 16:26:47 +01:00
|
|
|
const serializers = require('../../../../../../../core/server/api/v2/utils/serializers');
|
2018-10-05 00:50:45 +02:00
|
|
|
|
|
|
|
describe('Unit: v2/utils/serializers/input/pages', function () {
|
2018-10-19 10:40:47 +02:00
|
|
|
describe('browse', function () {
|
|
|
|
it('default', function () {
|
|
|
|
const apiConfig = {};
|
|
|
|
const frame = {
|
2019-02-25 19:52:45 +01:00
|
|
|
apiType: 'content',
|
2018-11-06 19:09:16 +05:30
|
|
|
options: {
|
|
|
|
context: {}
|
2019-07-05 13:40:43 +02:00
|
|
|
}
|
2018-10-19 10:40:47 +02:00
|
|
|
};
|
2018-10-05 00:50:45 +02:00
|
|
|
|
2018-10-19 10:40:47 +02:00
|
|
|
serializers.input.pages.browse(apiConfig, frame);
|
2019-09-16 11:51:54 +01:00
|
|
|
frame.options.filter.should.eql('type:page');
|
2018-10-19 10:40:47 +02:00
|
|
|
});
|
2018-10-05 00:50:45 +02:00
|
|
|
|
2018-10-19 10:40:47 +02:00
|
|
|
it('combine filters', function () {
|
|
|
|
const apiConfig = {};
|
|
|
|
const frame = {
|
2019-02-25 19:52:45 +01:00
|
|
|
apiType: 'content',
|
2018-10-19 10:40:47 +02:00
|
|
|
options: {
|
2018-11-06 19:09:16 +05:30
|
|
|
filter: 'status:published+tag:eins',
|
|
|
|
context: {}
|
2018-10-19 10:40:47 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
serializers.input.pages.browse(apiConfig, frame);
|
2019-09-16 11:51:54 +01:00
|
|
|
frame.options.filter.should.eql('(status:published+tag:eins)+type:page');
|
2018-10-19 10:40:47 +02:00
|
|
|
});
|
|
|
|
|
🐛 Fixed all known filter limitations (#10159)
refs #10105, closes #10108, closes https://github.com/TryGhost/Ghost/issues/9950, refs https://github.com/TryGhost/Ghost/issues/9923, refs https://github.com/TryGhost/Ghost/issues/9916, refs https://github.com/TryGhost/Ghost/issues/9574, refs https://github.com/TryGhost/Ghost/issues/6345, refs https://github.com/TryGhost/Ghost/issues/6309, refs https://github.com/TryGhost/Ghost/issues/6158, refs https://github.com/TryGhost/GQL/issues/16
- removed GQL dependency
- replaced GQL with our brand new NQL implementation
- fixed all known filter limitations
- GQL suffered from some underlying filter bugs, which NQL tried to fix
- the bugs were mostly in how we query the database for relation filtering
- the underlying problem was caused by a too simple implementation of querying the relations
- mongo-knex has implemented a more robust and complex filtering mechanism for relations
- replaced logic in our bookshelf filter plugin
- we pass the custom, default and override filters from Ghost to NQL, which then are getting parsed and merged into a mongo JSON object. The mongo JSON is getting attached by mongo-knex.
NQL: https://github.com/NexesJS/NQL
mongo-knex: https://github.com/NexesJS/mongo-knex
2018-12-11 11:53:40 +01:00
|
|
|
it('combine filters', function () {
|
2018-10-19 10:40:47 +02:00
|
|
|
const apiConfig = {};
|
|
|
|
const frame = {
|
2019-02-25 19:52:45 +01:00
|
|
|
apiType: 'content',
|
2018-10-19 10:40:47 +02:00
|
|
|
options: {
|
2018-11-06 19:09:16 +05:30
|
|
|
filter: 'page:false+tag:eins',
|
|
|
|
context: {}
|
2018-10-19 10:40:47 +02:00
|
|
|
}
|
|
|
|
};
|
2018-10-05 00:50:45 +02:00
|
|
|
|
2018-10-19 10:40:47 +02:00
|
|
|
serializers.input.pages.browse(apiConfig, frame);
|
2019-09-16 11:51:54 +01:00
|
|
|
frame.options.filter.should.eql('(page:false+tag:eins)+type:page');
|
2018-10-19 10:40:47 +02:00
|
|
|
});
|
2018-10-05 00:50:45 +02:00
|
|
|
|
🐛 Fixed all known filter limitations (#10159)
refs #10105, closes #10108, closes https://github.com/TryGhost/Ghost/issues/9950, refs https://github.com/TryGhost/Ghost/issues/9923, refs https://github.com/TryGhost/Ghost/issues/9916, refs https://github.com/TryGhost/Ghost/issues/9574, refs https://github.com/TryGhost/Ghost/issues/6345, refs https://github.com/TryGhost/Ghost/issues/6309, refs https://github.com/TryGhost/Ghost/issues/6158, refs https://github.com/TryGhost/GQL/issues/16
- removed GQL dependency
- replaced GQL with our brand new NQL implementation
- fixed all known filter limitations
- GQL suffered from some underlying filter bugs, which NQL tried to fix
- the bugs were mostly in how we query the database for relation filtering
- the underlying problem was caused by a too simple implementation of querying the relations
- mongo-knex has implemented a more robust and complex filtering mechanism for relations
- replaced logic in our bookshelf filter plugin
- we pass the custom, default and override filters from Ghost to NQL, which then are getting parsed and merged into a mongo JSON object. The mongo JSON is getting attached by mongo-knex.
NQL: https://github.com/NexesJS/NQL
mongo-knex: https://github.com/NexesJS/mongo-knex
2018-12-11 11:53:40 +01:00
|
|
|
it('combine filters', function () {
|
2018-10-19 10:40:47 +02:00
|
|
|
const apiConfig = {};
|
|
|
|
const frame = {
|
2019-02-25 19:52:45 +01:00
|
|
|
apiType: 'content',
|
2018-10-19 10:40:47 +02:00
|
|
|
options: {
|
2018-11-06 19:09:16 +05:30
|
|
|
filter: 'page:false',
|
|
|
|
context: {}
|
2018-10-19 10:40:47 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
serializers.input.pages.browse(apiConfig, frame);
|
2019-09-16 11:51:54 +01:00
|
|
|
frame.options.filter.should.eql('(page:false)+type:page');
|
2018-10-19 10:40:47 +02:00
|
|
|
});
|
2018-11-06 19:09:16 +05:30
|
|
|
|
|
|
|
it('remove mobiledoc option from formats', function () {
|
|
|
|
const apiConfig = {};
|
|
|
|
const frame = {
|
2019-02-25 19:52:45 +01:00
|
|
|
apiType: 'content',
|
2018-11-06 19:09:16 +05:30
|
|
|
options: {
|
|
|
|
formats: ['html', 'mobiledoc', 'plaintext'],
|
|
|
|
context: {}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
serializers.input.pages.browse(apiConfig, frame);
|
|
|
|
frame.options.formats.should.not.containEql('mobiledoc');
|
|
|
|
frame.options.formats.should.containEql('html');
|
|
|
|
frame.options.formats.should.containEql('plaintext');
|
|
|
|
});
|
2018-10-05 00:50:45 +02:00
|
|
|
});
|
|
|
|
|
2018-10-19 10:40:47 +02:00
|
|
|
describe('read', function () {
|
2019-02-22 12:07:34 +01:00
|
|
|
it('content api default', function () {
|
2018-10-19 10:40:47 +02:00
|
|
|
const apiConfig = {};
|
|
|
|
const frame = {
|
2019-02-25 19:52:45 +01:00
|
|
|
apiType: 'content',
|
2018-11-06 19:09:16 +05:30
|
|
|
options: {
|
|
|
|
context: {}
|
|
|
|
},
|
2019-02-22 12:07:34 +01:00
|
|
|
data: {}
|
|
|
|
};
|
|
|
|
|
|
|
|
serializers.input.pages.read(apiConfig, frame);
|
2019-09-16 11:51:54 +01:00
|
|
|
frame.options.filter.should.eql('type:page');
|
2019-02-22 12:07:34 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
it('content api default', function () {
|
|
|
|
const apiConfig = {};
|
|
|
|
const frame = {
|
|
|
|
apiType: 'content',
|
|
|
|
options: {
|
|
|
|
context: {
|
|
|
|
user: 0,
|
|
|
|
api_key: {
|
|
|
|
id: 1,
|
|
|
|
type: 'content'
|
2019-07-05 13:40:43 +02:00
|
|
|
}
|
2019-02-22 12:07:34 +01:00
|
|
|
}
|
|
|
|
},
|
|
|
|
data: {}
|
|
|
|
};
|
|
|
|
|
|
|
|
serializers.input.pages.read(apiConfig, frame);
|
2019-09-16 11:51:54 +01:00
|
|
|
frame.options.filter.should.eql('type:page');
|
2019-02-22 12:07:34 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
it('admin api default', function () {
|
|
|
|
const apiConfig = {};
|
|
|
|
const frame = {
|
|
|
|
apiType: 'admin',
|
|
|
|
options: {
|
|
|
|
context: {
|
|
|
|
user: 0,
|
|
|
|
api_key: {
|
|
|
|
id: 1,
|
|
|
|
type: 'admin'
|
2019-07-05 13:40:43 +02:00
|
|
|
}
|
2019-02-22 12:07:34 +01:00
|
|
|
}
|
|
|
|
},
|
|
|
|
data: {}
|
2018-10-19 10:40:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
serializers.input.pages.read(apiConfig, frame);
|
2019-09-16 11:51:54 +01:00
|
|
|
frame.options.filter.should.eql('(type:page)+status:[draft,published,scheduled]');
|
2018-10-19 10:40:47 +02:00
|
|
|
});
|
|
|
|
|
2019-02-22 12:07:34 +01:00
|
|
|
it('custom page filter', function () {
|
2018-10-19 10:40:47 +02:00
|
|
|
const apiConfig = {};
|
|
|
|
const frame = {
|
2019-02-25 19:52:45 +01:00
|
|
|
apiType: 'content',
|
2018-11-06 19:09:16 +05:30
|
|
|
options: {
|
2019-02-22 12:07:34 +01:00
|
|
|
filter: 'page:false',
|
2018-11-06 19:09:16 +05:30
|
|
|
context: {}
|
|
|
|
},
|
2019-02-22 12:07:34 +01:00
|
|
|
data: {}
|
|
|
|
};
|
|
|
|
|
|
|
|
serializers.input.pages.read(apiConfig, frame);
|
2019-09-16 11:51:54 +01:00
|
|
|
frame.options.filter.should.eql('(page:false)+type:page');
|
2019-02-22 12:07:34 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
it('custom status filter', function () {
|
|
|
|
const apiConfig = {};
|
|
|
|
const frame = {
|
|
|
|
apiType: 'admin',
|
|
|
|
options: {
|
|
|
|
filter: 'status:draft',
|
|
|
|
context: {
|
|
|
|
user: 0,
|
|
|
|
api_key: {
|
|
|
|
id: 1,
|
|
|
|
type: 'admin'
|
2019-07-05 13:40:43 +02:00
|
|
|
}
|
2019-02-22 12:07:34 +01:00
|
|
|
}
|
|
|
|
},
|
|
|
|
data: {}
|
2018-10-19 10:40:47 +02:00
|
|
|
};
|
2018-10-05 00:50:45 +02:00
|
|
|
|
2018-10-19 10:40:47 +02:00
|
|
|
serializers.input.pages.read(apiConfig, frame);
|
2019-09-16 11:51:54 +01:00
|
|
|
frame.options.filter.should.eql('(status:draft)+type:page');
|
2018-10-19 10:40:47 +02:00
|
|
|
});
|
2018-11-06 19:09:16 +05:30
|
|
|
|
|
|
|
it('remove mobiledoc option from formats', function () {
|
|
|
|
const apiConfig = {};
|
|
|
|
const frame = {
|
2019-02-25 19:52:45 +01:00
|
|
|
apiType: 'content',
|
2018-11-06 19:09:16 +05:30
|
|
|
options: {
|
|
|
|
formats: ['html', 'mobiledoc', 'plaintext'],
|
|
|
|
context: {}
|
|
|
|
},
|
|
|
|
data: {
|
|
|
|
status: 'all',
|
|
|
|
page: false
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
serializers.input.pages.read(apiConfig, frame);
|
|
|
|
frame.options.formats.should.not.containEql('mobiledoc');
|
|
|
|
frame.options.formats.should.containEql('html');
|
|
|
|
frame.options.formats.should.containEql('plaintext');
|
|
|
|
});
|
2018-10-05 00:50:45 +02:00
|
|
|
});
|
2019-02-22 13:01:04 +01:00
|
|
|
|
|
|
|
describe('Ensure relations format', function () {
|
|
|
|
it('relations is array of objects', function () {
|
|
|
|
const apiConfig = {};
|
|
|
|
|
|
|
|
const frame = {
|
2019-02-25 19:52:45 +01:00
|
|
|
apiType: 'content',
|
2019-02-22 13:01:04 +01:00
|
|
|
options: {},
|
|
|
|
data: {
|
|
|
|
pages: [
|
|
|
|
{
|
|
|
|
id: 'id1',
|
|
|
|
authors: [{id: 'id'}],
|
|
|
|
tags: [{slug: 'slug1', name: 'hey'}, {slug: 'slug2'}]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
serializers.input.pages.edit(apiConfig, frame);
|
|
|
|
|
|
|
|
frame.data.pages[0].authors.should.eql([{id: 'id'}]);
|
|
|
|
frame.data.pages[0].tags.should.eql([{slug: 'slug1', name: 'hey'}, {slug: 'slug2'}]);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('authors is array of strings', function () {
|
|
|
|
const apiConfig = {};
|
|
|
|
|
|
|
|
const frame = {
|
2019-02-25 19:52:45 +01:00
|
|
|
apiType: 'content',
|
2019-02-22 13:01:04 +01:00
|
|
|
options: {},
|
|
|
|
data: {
|
|
|
|
pages: [
|
|
|
|
{
|
|
|
|
id: 'id1',
|
|
|
|
authors: ['email1', 'email2'],
|
2019-07-05 13:40:43 +02:00
|
|
|
tags: ['name1', 'name2']
|
2019-02-22 13:01:04 +01:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
serializers.input.pages.edit(apiConfig, frame);
|
|
|
|
|
|
|
|
frame.data.pages[0].authors.should.eql([{email: 'email1'}, {email: 'email2'}]);
|
|
|
|
frame.data.pages[0].tags.should.eql([{name: 'name1'}, {name: 'name2'}]);
|
|
|
|
});
|
|
|
|
});
|
2018-10-05 00:50:45 +02:00
|
|
|
});
|