150 lines
4.2 KiB
JavaScript
150 lines
4.2 KiB
JavaScript
const models = require('vn-loopback/server/server').models;
|
|
|
|
describe('Application execute()/executeProc()/executeFunc()', () => {
|
|
const userWithoutPrivileges = 1;
|
|
const userWithInheritedPrivileges = 120;
|
|
let tx;
|
|
const ctx = beforeAll.getCtx();
|
|
|
|
beforeEach(async() => {
|
|
tx = await models.Application.beginTransaction({});
|
|
const options = {transaction: tx};
|
|
|
|
await models.Application.rawSql(`
|
|
CREATE OR REPLACE PROCEDURE vn.myProcedure(vMyParam INT)
|
|
BEGIN
|
|
SELECT vMyParam myParam, t.*
|
|
FROM ticket t
|
|
LIMIT 2;
|
|
END
|
|
`, null, options);
|
|
|
|
await models.Application.rawSql(`
|
|
CREATE OR REPLACE FUNCTION bs.myFunction(vMyParam INT) RETURNS int(11)
|
|
BEGIN
|
|
RETURN vMyParam;
|
|
END
|
|
`, null, options);
|
|
|
|
await models.Application.rawSql(`
|
|
GRANT EXECUTE ON PROCEDURE vn.myProcedure TO developer;
|
|
GRANT EXECUTE ON FUNCTION bs.myFunction TO developer;
|
|
`, null, options);
|
|
});
|
|
|
|
it('should throw error when execute procedure and not have privileges', async() => {
|
|
const ctx = {req: {accessToken: {userId: userWithoutPrivileges}}};
|
|
|
|
let error;
|
|
try {
|
|
const options = {transaction: tx};
|
|
|
|
await models.Application.execute(
|
|
ctx,
|
|
'PROCEDURE',
|
|
'CALL vn.myProcedure',
|
|
[1],
|
|
options
|
|
);
|
|
|
|
await tx.rollback();
|
|
} catch (e) {
|
|
await tx.rollback();
|
|
error = e;
|
|
}
|
|
|
|
expect(error.message).toEqual(`You don't have enough privileges`);
|
|
});
|
|
|
|
it('should execute procedure and get data', async() => {
|
|
try {
|
|
const options = {transaction: tx};
|
|
|
|
const response = await models.Application.execute(
|
|
ctx,
|
|
'PROCEDURE',
|
|
'CALL vn.myProcedure',
|
|
[1],
|
|
options
|
|
);
|
|
|
|
expect(response.length).toEqual(2);
|
|
expect(response[0].myParam).toEqual(1);
|
|
|
|
await tx.rollback();
|
|
} catch (e) {
|
|
await tx.rollback();
|
|
throw e;
|
|
}
|
|
});
|
|
|
|
describe('Application executeProc()', () => {
|
|
it('should execute procedure and get data (executeProc)', async() => {
|
|
try {
|
|
const options = {transaction: tx};
|
|
|
|
const response = await models.Application.executeProc(
|
|
ctx,
|
|
'myProcedure',
|
|
'vn',
|
|
[1],
|
|
options
|
|
);
|
|
|
|
expect(response.length).toEqual(2);
|
|
expect(response[0].myParam).toEqual(1);
|
|
|
|
await tx.rollback();
|
|
} catch (e) {
|
|
await tx.rollback();
|
|
throw e;
|
|
}
|
|
});
|
|
});
|
|
|
|
describe('Application executeFunc()', () => {
|
|
it('should execute function and get data', async() => {
|
|
try {
|
|
const options = {transaction: tx};
|
|
|
|
const response = await models.Application.executeFunc(
|
|
ctx,
|
|
'myFunction',
|
|
'bs',
|
|
[1],
|
|
options
|
|
);
|
|
|
|
expect(response).toEqual(1);
|
|
|
|
await tx.rollback();
|
|
} catch (e) {
|
|
await tx.rollback();
|
|
throw e;
|
|
}
|
|
});
|
|
|
|
it('should execute function and get data with user with inherited privileges', async() => {
|
|
const ctx = {req: {accessToken: {userId: userWithInheritedPrivileges}}};
|
|
try {
|
|
const options = {transaction: tx};
|
|
|
|
const response = await models.Application.executeFunc(
|
|
ctx,
|
|
'myFunction',
|
|
'bs',
|
|
[1],
|
|
options
|
|
);
|
|
|
|
expect(response).toEqual(1);
|
|
|
|
await tx.rollback();
|
|
} catch (e) {
|
|
await tx.rollback();
|
|
throw e;
|
|
}
|
|
});
|
|
});
|
|
});
|