Ghost/ghost/webmentions/test/InMemoryMentionRepository.test.js
Fabien 'egg' O'Carroll 4e8af72305
Added support for deleting mentions (#16238)
refs https://github.com/TryGhost/Team/issues/2534

As we're using soft deletes for mentions we need to store the `deleted` column
as well as enforce a `'deleted:false'` filter on the bookshelf model. 

We've also implemented the handling for deleting mentions. Where we remove a
mention anytime we receive and update from or to a page which no longer exists.

Co-authored-by: Steve Larson <9larsons@gmail.com>
2023-02-09 17:29:13 +07:00

111 lines
3.6 KiB
JavaScript

const assert = require('assert');
const ObjectID = require('bson-objectid');
const InMemoryMentionRepository = require('../lib/InMemoryMentionRepository');
const Mention = require('../lib/Mention');
describe('InMemoryMentionRepository', function () {
it('Can handle filtering on resourceId', async function () {
const resourceId = new ObjectID();
const repository = new InMemoryMentionRepository();
const validInput = {
source: 'https://source.com',
target: 'https://target.com',
sourceTitle: 'Title!',
sourceExcerpt: 'Excerpt!'
};
const mentions = await Promise.all([
Mention.create(validInput),
Mention.create({
...validInput,
resourceId
}),
Mention.create({
...validInput,
resourceId
}),
Mention.create(validInput),
Mention.create({
...validInput,
resourceId
}),
Mention.create({
...validInput,
resourceId
}),
Mention.create(validInput),
Mention.create({
...validInput,
resourceId
}),
Mention.create(validInput)
]);
for (const mention of mentions) {
await repository.save(mention);
}
const pageOne = await repository.getPage({
filter: `resource_id:${resourceId.toHexString()}`,
limit: 2,
page: 1
});
assert(pageOne.meta.pagination.total === 5);
assert(pageOne.meta.pagination.pages === 3);
assert(pageOne.meta.pagination.prev === null);
assert(pageOne.meta.pagination.next === 2);
const pageTwo = await repository.getPage({
filter: `resource_id:${resourceId.toHexString()}`,
limit: 2,
page: 2
});
assert(pageTwo.meta.pagination.total === 5);
assert(pageTwo.meta.pagination.pages === 3);
assert(pageTwo.meta.pagination.prev === 1);
assert(pageTwo.meta.pagination.next === 3);
const pageThree = await repository.getPage({
filter: `resource_id:${resourceId.toHexString()}`,
limit: 2,
page: 3
});
assert(pageThree.meta.pagination.total === 5);
assert(pageThree.meta.pagination.pages === 3);
assert(pageThree.meta.pagination.prev === 2);
assert(pageThree.meta.pagination.next === null);
});
describe(`GetPage`, function () {
it(`Doesn't return deleted mentions`, async function () {
const repository = new InMemoryMentionRepository();
const validInput = {
source: 'https://source.com',
target: 'https://target.com',
sourceTitle: 'Title!',
sourceExcerpt: 'Excerpt!'
};
const mentions = await Promise.all([
Mention.create(validInput),
Mention.create(validInput)
]);
for (const mention of mentions) {
await repository.save(mention);
}
const pageOne = await repository.getPage({page: 1, limit: 'all'});
assert(pageOne.meta.pagination.total === 2);
mentions[0].delete();
await repository.save(mentions[0]);
const pageTwo = await repository.getPage({page: 1, limit: 'all'});
assert(pageTwo.meta.pagination.total === 1);
});
});
});