Files
kami-parse-server/spec/AggregateRouter.spec.js
Daniel d0d30c4f13 feat: Remove deprecation DEPPS1: Native MongoDB syntax in aggregation pipeline (#8362)
BREAKING CHANGE: The MongoDB aggregation pipeline requires native MongoDB syntax instead of the custom Parse Server syntax; for example pipeline stage names require a leading dollar sign like `$match` and the MongoDB document ID is referenced using `_id` instead of `objectId` (#8362)
2023-01-05 15:53:43 +01:00

175 lines
4.4 KiB
JavaScript

const AggregateRouter = require('../lib/Routers/AggregateRouter').AggregateRouter;
describe('AggregateRouter', () => {
it('get pipeline from Array', () => {
const body = [
{
$group: { _id: {} },
},
];
const expected = [{ $group: { _id: {} } }];
const result = AggregateRouter.getPipeline(body);
expect(result).toEqual(expected);
});
it('get pipeline from Object', () => {
const body = {
$group: { _id: {} },
};
const expected = [{ $group: { _id: {} } }];
const result = AggregateRouter.getPipeline(body);
expect(result).toEqual(expected);
});
it('get pipeline from Pipeline Operator (Array)', () => {
const body = {
pipeline: [
{
$group: { _id: {} },
},
],
};
const expected = [{ $group: { _id: {} } }];
const result = AggregateRouter.getPipeline(body);
expect(result).toEqual(expected);
});
it('get pipeline from Pipeline Operator (Object)', () => {
const body = {
pipeline: {
$group: { _id: {} },
},
};
const expected = [{ $group: { _id: {} } }];
const result = AggregateRouter.getPipeline(body);
expect(result).toEqual(expected);
});
it('get pipeline fails multiple keys in Array stage ', () => {
const body = [
{
$group: { _id: {} },
$match: { name: 'Test' },
},
];
expect(() => AggregateRouter.getPipeline(body)).toThrow(
new Parse.Error(
Parse.Error.INVALID_QUERY,
'Pipeline stages should only have one key but found $group, $match.'
)
);
});
it('get pipeline fails multiple keys in Pipeline Operator Array stage ', () => {
const body = {
pipeline: [
{
$group: { _id: {} },
$match: { name: 'Test' },
},
],
};
expect(() => AggregateRouter.getPipeline(body)).toThrow(
new Parse.Error(
Parse.Error.INVALID_QUERY,
'Pipeline stages should only have one key but found $group, $match.'
)
);
});
it('get search pipeline from Pipeline Operator (Array)', () => {
const body = {
pipeline: {
$search: {},
},
};
const expected = [{ $search: {} }];
const result = AggregateRouter.getPipeline(body);
expect(result).toEqual(expected);
});
it('support stage name starting with `$`', () => {
const body = {
$match: { someKey: 'whatever' },
};
const expected = [{ $match: { someKey: 'whatever' } }];
const result = AggregateRouter.getPipeline(body);
expect(result).toEqual(expected);
});
it('support nested stage names starting with `$`', () => {
const body = [
{
$lookup: {
from: 'ACollection',
let: { id: '_id' },
as: 'results',
pipeline: [
{
$match: {
$expr: {
$eq: ['$_id', '$$id'],
},
},
},
],
},
},
];
const expected = [
{
$lookup: {
from: 'ACollection',
let: { id: '_id' },
as: 'results',
pipeline: [
{
$match: {
$expr: {
$eq: ['$_id', '$$id'],
},
},
},
],
},
},
];
const result = AggregateRouter.getPipeline(body);
expect(result).toEqual(expected);
});
it('support the use of `_id` in stages', () => {
const body = [
{ $match: { _id: 'randomId' } },
{ $sort: { _id: -1 } },
{ $addFields: { _id: 1 } },
{ $group: { _id: {} } },
{ $project: { _id: 0 } },
];
const expected = [
{ $match: { _id: 'randomId' } },
{ $sort: { _id: -1 } },
{ $addFields: { _id: 1 } },
{ $group: { _id: {} } },
{ $project: { _id: 0 } },
];
const result = AggregateRouter.getPipeline(body);
expect(result).toEqual(expected);
});
it('should throw with invalid stage', () => {
expect(() => AggregateRouter.getPipeline([{ foo: 'bar' }])).toThrow(
new Parse.Error(Parse.Error.INVALID_QUERY, `Invalid aggregate stage 'foo'.`)
);
});
it('should throw with invalid group', () => {
expect(() => AggregateRouter.getPipeline([{ $group: { objectId: 'bar' } }])).toThrow(
new Parse.Error(
Parse.Error.INVALID_QUERY,
`Cannot use 'objectId' in aggregation stage $group.`
)
);
});
});