2021-07-24 06:13:21 +00:00
import * as request from 'supertest' ;
import { INestApplication } from '@nestjs/common' ;
2021-09-21 13:48:28 +00:00
import {
clearDB ,
createUser ,
createNestAppInstance ,
createDataQuery ,
2021-10-11 15:15:58 +00:00
createAppGroupPermission ,
2023-01-09 12:00:32 +00:00
generateAppDefaults ,
2023-04-06 11:12:58 +00:00
authenticateUser ,
2025-02-25 06:52:50 +00:00
createDatasourceGroupPermission ,
2021-09-21 13:48:28 +00:00
} from '../test.helper' ;
2022-01-31 05:45:44 +00:00
import { getManager , getRepository } from 'typeorm' ;
2021-10-11 15:15:58 +00:00
import { GroupPermission } from 'src/entities/group_permission.entity' ;
2025-02-25 06:52:50 +00:00
import { AuditLog } from 'src/entities/audit_log.entity' ;
2022-01-31 05:45:44 +00:00
import { AppGroupPermission } from 'src/entities/app_group_permission.entity' ;
2026-01-05 18:22:02 +00:00
import { MODULES } from 'src/modules/app/constants/modules' ;
2021-07-24 06:13:21 +00:00
describe ( 'data queries controller' , ( ) = > {
let app : INestApplication ;
beforeEach ( async ( ) = > {
await clearDB ( ) ;
} ) ;
beforeAll ( async ( ) = > {
app = await createNestAppInstance ( ) ;
} ) ;
2021-07-24 18:09:25 +00:00
2025-02-25 06:52:50 +00:00
it ( 'should be able to update queries of an app only if group is admin or group has app update permission or the user is a super admin' , async ( ) = > {
2021-10-11 15:15:58 +00:00
const adminUserData = await createUser ( app , {
email : 'admin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2023-04-06 11:12:58 +00:00
let loggedUser = await authenticateUser ( app , adminUserData . user . email ) ;
adminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2021-09-21 13:48:28 +00:00
const developerUserData = await createUser ( app , {
email : 'developer@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'developer' ] ,
2021-09-21 13:48:28 +00:00
organization : adminUserData.organization ,
} ) ;
2023-04-06 11:12:58 +00:00
loggedUser = await authenticateUser ( app , developerUserData . user . email ) ;
developerUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2021-09-21 13:48:28 +00:00
const viewerUserData = await createUser ( app , {
email : 'viewer@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'viewer' ] ,
2021-09-21 13:48:28 +00:00
organization : adminUserData.organization ,
} ) ;
2023-04-06 11:12:58 +00:00
loggedUser = await authenticateUser ( app , viewerUserData . user . email ) ;
viewerUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2021-10-11 15:15:58 +00:00
const anotherOrgAdminUserData = await createUser ( app , {
email : 'another@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2023-04-06 11:12:58 +00:00
loggedUser = await authenticateUser ( app , anotherOrgAdminUserData . user . email ) ;
anotherOrgAdminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2021-10-11 15:15:58 +00:00
2025-02-25 06:52:50 +00:00
const { application , dataQuery , dataSource } = await generateAppDefaults ( app , adminUserData . user , { } ) ;
2021-10-11 15:15:58 +00:00
// setup app permissions for developer
2022-05-05 07:08:42 +00:00
const developerUserGroup = await getRepository ( GroupPermission ) . findOneOrFail ( {
2022-01-28 06:14:44 +00:00
where : {
group : 'developer' ,
} ,
2021-10-11 15:15:58 +00:00
} ) ;
await createAppGroupPermission ( app , application , developerUserGroup . id , {
read : true ,
update : true ,
delete : false ,
} ) ;
2025-02-25 06:52:50 +00:00
await createDatasourceGroupPermission ( app , dataSource . id , developerUserGroup . id , {
read : true ,
update : true ,
delete : false ,
} ) ;
2021-10-11 15:15:58 +00:00
// setup app permissions for viewer
2022-05-05 07:08:42 +00:00
const viewerUserGroup = await getRepository ( GroupPermission ) . findOneOrFail ( {
2022-01-28 06:14:44 +00:00
where : {
group : 'viewer' ,
} ,
2021-10-11 15:15:58 +00:00
} ) ;
await createAppGroupPermission ( app , application , viewerUserGroup . id , {
read : true ,
update : false ,
delete : false ,
} ) ;
2021-07-24 18:09:25 +00:00
2021-09-21 13:48:28 +00:00
for ( const userData of [ adminUserData , developerUserData ] ) {
const newOptions = { method : userData.user.email } ;
2021-07-24 18:09:25 +00:00
const response = await request ( app . getHttpServer ( ) )
2021-10-15 09:05:11 +00:00
. patch ( ` /api/data_queries/ ${ dataQuery . id } ` )
2023-04-06 11:12:58 +00:00
. set ( 'tj-workspace-id' , userData . user . defaultOrganizationId )
. set ( 'Cookie' , userData [ 'tokenCookie' ] )
2021-07-24 18:09:25 +00:00
. send ( {
2021-09-21 13:48:28 +00:00
options : newOptions ,
} ) ;
2021-07-24 18:09:25 +00:00
expect ( response . statusCode ) . toBe ( 200 ) ;
await dataQuery . reload ( ) ;
expect ( dataQuery . options . method ) . toBe ( newOptions . method ) ;
}
// Should not update if viewer or if user of another org
2021-09-21 13:48:28 +00:00
for ( const userData of [ anotherOrgAdminUserData , viewerUserData ] ) {
2021-07-24 18:09:25 +00:00
const oldOptions = dataQuery . options ;
const response = await request ( app . getHttpServer ( ) )
2021-10-15 09:05:11 +00:00
. patch ( ` /api/data_queries/ ${ dataQuery . id } ` )
2023-04-06 11:12:58 +00:00
. set ( 'tj-workspace-id' , userData . user . defaultOrganizationId )
. set ( 'Cookie' , userData [ 'tokenCookie' ] )
2021-07-24 18:09:25 +00:00
. send ( {
2021-09-21 13:48:28 +00:00
options : { method : '' } ,
} ) ;
2021-07-24 18:09:25 +00:00
expect ( response . statusCode ) . toBe ( 403 ) ;
await dataQuery . reload ( ) ;
expect ( dataQuery . options . method ) . toBe ( oldOptions . method ) ;
}
2021-09-13 17:24:47 +00:00
} ) ;
2025-02-25 06:52:50 +00:00
it ( 'should be able to delete queries of an app only if admin/developer of same organization or super admin' , async ( ) = > {
2021-09-13 17:24:47 +00:00
const adminUserData = await createUser ( app , {
email : 'admin@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'admin' ] ,
2021-09-13 17:24:47 +00:00
} ) ;
2025-02-25 06:52:50 +00:00
const superAdminUserData = await createUser ( app , {
email : 'superadmin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
userType : 'instance' ,
} ) ;
2023-04-06 11:12:58 +00:00
let loggedUser = await authenticateUser ( app , adminUserData . user . email ) ;
adminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2021-09-13 17:24:47 +00:00
const developerUserData = await createUser ( app , {
email : 'developer@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'developer' ] ,
2021-09-13 17:24:47 +00:00
organization : adminUserData.organization ,
} ) ;
const viewerUserData = await createUser ( app , {
email : 'viewer@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'viewer' ] ,
2021-09-13 17:24:47 +00:00
organization : adminUserData.organization ,
} ) ;
const anotherOrgAdminUserData = await createUser ( app , {
email : 'another@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'admin' ] ,
2021-09-13 17:24:47 +00:00
} ) ;
2023-03-24 16:11:21 +00:00
const { application , dataSource , appVersion } = await generateAppDefaults ( app , adminUserData . user , {
isQueryNeeded : false ,
} ) ;
2021-09-13 17:24:47 +00:00
2023-04-06 11:12:58 +00:00
loggedUser = await authenticateUser ( app , developerUserData . user . email ) ;
developerUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
loggedUser = await authenticateUser ( app , viewerUserData . user . email ) ;
viewerUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
loggedUser = await authenticateUser ( app , anotherOrgAdminUserData . user . email ) ;
anotherOrgAdminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2025-02-25 06:52:50 +00:00
loggedUser = await authenticateUser ( app , superAdminUserData . user . email , 'password' , adminUserData . organization . id ) ;
superAdminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2023-04-06 11:12:58 +00:00
2021-10-11 15:15:58 +00:00
// setup app permissions for developer
2022-05-05 07:08:42 +00:00
const developerUserGroup = await getRepository ( GroupPermission ) . findOneOrFail ( {
2022-01-28 06:14:44 +00:00
where : {
group : 'developer' ,
} ,
2021-10-11 15:15:58 +00:00
} ) ;
await createAppGroupPermission ( app , application , developerUserGroup . id , {
read : true ,
update : true ,
2025-02-25 06:52:50 +00:00
delete : true ,
2021-10-11 15:15:58 +00:00
} ) ;
2025-02-25 06:52:50 +00:00
await createDatasourceGroupPermission ( app , dataSource . id , developerUserGroup . id , {
read : true ,
update : true ,
delete : true ,
} ) ;
for ( const userData of [ adminUserData , developerUserData , superAdminUserData ] ) {
2021-09-13 17:24:47 +00:00
const dataQuery = await createDataQuery ( app , {
2023-01-09 12:00:32 +00:00
dataSource ,
2023-03-24 16:11:21 +00:00
appVersion ,
2021-09-13 17:24:47 +00:00
options : {
method : 'get' ,
url : 'https://api.github.com/repos/tooljet/tooljet/stargazers' ,
url_params : [ ] ,
headers : [ ] ,
body : [ ] ,
} ,
} ) ;
const newOptions = { method : userData.user.email } ;
const response = await request ( app . getHttpServer ( ) )
2021-10-15 09:05:11 +00:00
. delete ( ` /api/data_queries/ ${ dataQuery . id } ` )
2025-02-25 06:52:50 +00:00
. set ( 'tj-workspace-id' , adminUserData . user . defaultOrganizationId )
2023-04-06 11:12:58 +00:00
. set ( 'Cookie' , userData [ 'tokenCookie' ] )
2021-09-13 17:24:47 +00:00
. send ( {
options : newOptions ,
} ) ;
expect ( response . statusCode ) . toBe ( 200 ) ;
}
// Should not update if viewer or if user of another org
for ( const userData of [ anotherOrgAdminUserData , viewerUserData ] ) {
const dataQuery = await createDataQuery ( app , {
2023-01-09 12:00:32 +00:00
dataSource ,
2023-03-24 16:11:21 +00:00
appVersion ,
2021-09-13 17:24:47 +00:00
options : {
method : 'get' ,
url : 'https://api.github.com/repos/tooljet/tooljet/stargazers' ,
url_params : [ ] ,
headers : [ ] ,
body : [ ] ,
} ,
} ) ;
const oldOptions = dataQuery . options ;
const response = await request ( app . getHttpServer ( ) )
2021-10-15 09:05:11 +00:00
. delete ( ` /api/data_queries/ ${ dataQuery . id } ` )
2023-04-06 11:12:58 +00:00
. set ( 'tj-workspace-id' , userData . user . defaultOrganizationId )
. set ( 'Cookie' , userData [ 'tokenCookie' ] )
2021-09-13 17:24:47 +00:00
. send ( {
options : { method : '' } ,
} ) ;
2021-07-24 18:09:25 +00:00
2021-09-13 17:24:47 +00:00
expect ( response . statusCode ) . toBe ( 403 ) ;
await dataQuery . reload ( ) ;
expect ( dataQuery . options . method ) . toBe ( oldOptions . method ) ;
}
2021-07-24 18:09:25 +00:00
} ) ;
2025-02-25 06:52:50 +00:00
it ( 'should be able to get queries only if the user has app read permission and belongs to the same organization or user is a super admin' , async ( ) = > {
2021-10-11 15:15:58 +00:00
const adminUserData = await createUser ( app , {
email : 'admin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2025-02-25 06:52:50 +00:00
const superAdminUserData = await createUser ( app , {
email : 'superadmin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
userType : 'instance' ,
organization : adminUserData.organization ,
} ) ;
2021-09-21 13:48:28 +00:00
const developerUserData = await createUser ( app , {
email : 'developer@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'developer' ] ,
2021-09-21 13:48:28 +00:00
organization : adminUserData.organization ,
} ) ;
const viewerUserData = await createUser ( app , {
email : 'viewer@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'viewer' ] ,
2021-09-21 13:48:28 +00:00
organization : adminUserData.organization ,
} ) ;
2023-01-09 12:00:32 +00:00
const { application , dataSource , appVersion } = await generateAppDefaults ( app , adminUserData . user , {
isQueryNeeded : false ,
2021-10-11 15:15:58 +00:00
} ) ;
2023-01-09 12:00:32 +00:00
2023-04-06 11:12:58 +00:00
let loggedUser = await authenticateUser ( app , adminUserData . user . email ) ;
adminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
loggedUser = await authenticateUser ( app , developerUserData . user . email ) ;
developerUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
loggedUser = await authenticateUser ( app , viewerUserData . user . email ) ;
viewerUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2025-02-25 06:52:50 +00:00
loggedUser = await authenticateUser ( app , superAdminUserData . user . email , 'password' , adminUserData . organization . id ) ;
superAdminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2023-04-06 11:12:58 +00:00
2021-10-11 15:15:58 +00:00
const anotherOrgAdminUserData = await createUser ( app , {
email : 'another@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2023-04-06 11:12:58 +00:00
loggedUser = await authenticateUser ( app , anotherOrgAdminUserData . user . email ) ;
anotherOrgAdminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2021-10-11 15:15:58 +00:00
2022-05-05 07:08:42 +00:00
const allUserGroup = await getManager ( ) . findOneOrFail ( GroupPermission , {
2022-01-31 05:45:44 +00:00
where : { group : 'all_users' , organization : adminUserData.organization } ,
} ) ;
await getManager ( ) . update (
AppGroupPermission ,
{ app : application , groupPermissionId : allUserGroup } ,
{ read : true }
) ;
2021-10-11 15:15:58 +00:00
// setup app permissions for developer
2022-05-05 07:08:42 +00:00
const developerUserGroup = await getRepository ( GroupPermission ) . findOneOrFail ( {
2022-01-28 06:14:44 +00:00
where : {
group : 'developer' ,
} ,
2021-10-11 15:15:58 +00:00
} ) ;
await createAppGroupPermission ( app , application , developerUserGroup . id , {
read : true ,
update : true ,
delete : false ,
} ) ;
2021-07-24 18:09:25 +00:00
2021-09-13 17:24:47 +00:00
await createDataQuery ( app , {
2023-01-09 12:00:32 +00:00
dataSource ,
2023-03-24 16:11:21 +00:00
appVersion ,
2021-07-24 18:09:25 +00:00
kind : 'restapi' ,
2021-09-21 13:48:28 +00:00
options : { method : 'get' } ,
2021-07-24 18:09:25 +00:00
} ) ;
2025-02-25 06:52:50 +00:00
for ( const userData of [ adminUserData , developerUserData , superAdminUserData ] ) {
2021-07-24 18:09:25 +00:00
const response = await request ( app . getHttpServer ( ) )
2023-01-09 12:00:32 +00:00
. get ( ` /api/data_queries?app_version_id= ${ appVersion . id } ` )
2025-02-25 06:52:50 +00:00
. set ( 'tj-workspace-id' , adminUserData . user . defaultOrganizationId )
2023-04-06 11:12:58 +00:00
. set ( 'Cookie' , userData [ 'tokenCookie' ] ) ;
2021-07-24 18:09:25 +00:00
expect ( response . statusCode ) . toBe ( 200 ) ;
expect ( response . body . data_queries . length ) . toBe ( 1 ) ;
}
2021-10-11 15:15:58 +00:00
let response = await request ( app . getHttpServer ( ) )
2023-01-09 12:00:32 +00:00
. get ( ` /api/data_queries?app_version_id= ${ appVersion . id } ` )
2023-04-06 11:12:58 +00:00
. set ( 'tj-workspace-id' , viewerUserData . user . defaultOrganizationId )
. set ( 'Cookie' , viewerUserData [ 'tokenCookie' ] ) ;
2021-10-11 15:15:58 +00:00
2021-10-15 09:05:11 +00:00
expect ( response . statusCode ) . toBe ( 200 ) ;
2021-10-11 15:15:58 +00:00
2021-07-24 18:09:25 +00:00
// Forbidden if user of another organization
2021-10-11 15:15:58 +00:00
response = await request ( app . getHttpServer ( ) )
2023-01-09 12:00:32 +00:00
. get ( ` /api/data_queries?app_version_id= ${ appVersion . id } ` )
2023-04-06 11:12:58 +00:00
. set ( 'tj-workspace-id' , anotherOrgAdminUserData . user . defaultOrganizationId )
. set ( 'Cookie' , anotherOrgAdminUserData [ 'tokenCookie' ] ) ;
2021-07-24 18:09:25 +00:00
2021-09-21 13:48:28 +00:00
expect ( response . statusCode ) . toBe ( 403 ) ;
2021-07-24 18:09:25 +00:00
} ) ;
2022-01-04 08:04:12 +00:00
it ( 'should be able to search queries with application version id' , async ( ) = > {
const adminUserData = await createUser ( app , {
email : 'admin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2023-01-09 12:00:32 +00:00
const { dataSource , appVersion } = await generateAppDefaults ( app , adminUserData . user , {
isQueryNeeded : false ,
2022-01-04 08:04:12 +00:00
} ) ;
2023-01-09 12:00:32 +00:00
2022-01-04 08:04:12 +00:00
await createDataQuery ( app , {
2023-01-09 12:00:32 +00:00
dataSource ,
2023-03-24 16:11:21 +00:00
appVersion ,
2022-01-04 08:04:12 +00:00
kind : 'restapi' ,
options : { method : 'get' } ,
} ) ;
2023-04-06 11:12:58 +00:00
const loggedUser = await authenticateUser ( app , adminUserData . user . email ) ;
adminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2022-01-04 08:04:12 +00:00
let response = await request ( app . getHttpServer ( ) )
2023-01-09 12:00:32 +00:00
. get ( ` /api/data_queries?app_version_id= ${ appVersion . id } ` )
2023-04-06 11:12:58 +00:00
. set ( 'tj-workspace-id' , adminUserData . user . defaultOrganizationId )
. set ( 'Cookie' , adminUserData [ 'tokenCookie' ] ) ;
2022-01-04 08:04:12 +00:00
expect ( response . statusCode ) . toBe ( 200 ) ;
expect ( response . body . data_queries . length ) . toBe ( 1 ) ;
response = await request ( app . getHttpServer ( ) )
2023-01-09 12:00:32 +00:00
. get ( ` /api/data_queries?app_version_id=62929ad6-11ae-4655-bb3e-2d2465b58950 ` )
2023-04-06 11:12:58 +00:00
. set ( 'tj-workspace-id' , adminUserData . user . defaultOrganizationId )
. set ( 'Cookie' , adminUserData [ 'tokenCookie' ] ) ;
2022-01-04 08:04:12 +00:00
2023-01-09 12:00:32 +00:00
expect ( response . statusCode ) . toBe ( 500 ) ;
2022-01-04 08:04:12 +00:00
} ) ;
2025-02-25 06:52:50 +00:00
it ( 'should be able to create queries for an app only if the user has relevant permissions(admin or update permission) or instance user type' , async ( ) = > {
2021-10-11 15:15:58 +00:00
const adminUserData = await createUser ( app , {
email : 'admin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2025-02-25 06:52:50 +00:00
const superAdminUserData = await createUser ( app , {
email : 'superadmin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
userType : 'instance' ,
} ) ;
2021-09-21 13:48:28 +00:00
const developerUserData = await createUser ( app , {
email : 'developer@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'developer' ] ,
2021-09-21 13:48:28 +00:00
organization : adminUserData.organization ,
} ) ;
const viewerUserData = await createUser ( app , {
email : 'viewer@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'viewer' ] ,
2021-09-21 13:48:28 +00:00
organization : adminUserData.organization ,
} ) ;
2023-01-09 12:00:32 +00:00
const {
application ,
dataSource ,
appVersion : applicationVersion ,
} = await generateAppDefaults ( app , adminUserData . user , {
isQueryNeeded : false ,
2021-10-11 15:15:58 +00:00
} ) ;
const anotherOrgAdminUserData = await createUser ( app , {
email : 'another@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2023-04-06 11:12:58 +00:00
let loggedUser = await authenticateUser ( app , adminUserData . user . email ) ;
adminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
loggedUser = await authenticateUser ( app , developerUserData . user . email ) ;
developerUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
loggedUser = await authenticateUser ( app , viewerUserData . user . email ) ;
viewerUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
loggedUser = await authenticateUser ( app , anotherOrgAdminUserData . user . email ) ;
anotherOrgAdminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2025-02-25 06:52:50 +00:00
loggedUser = await authenticateUser ( app , superAdminUserData . user . email , 'password' , adminUserData . organization . id ) ;
superAdminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2023-04-06 11:12:58 +00:00
2021-10-11 15:15:58 +00:00
// setup app permissions for developer
2022-05-05 07:08:42 +00:00
const developerUserGroup = await getRepository ( GroupPermission ) . findOneOrFail ( {
2022-01-28 06:14:44 +00:00
where : {
group : 'developer' ,
} ,
2021-10-11 15:15:58 +00:00
} ) ;
await createAppGroupPermission ( app , application , developerUserGroup . id , {
read : true ,
update : true ,
delete : false ,
} ) ;
2021-07-24 18:09:25 +00:00
2022-01-04 08:04:12 +00:00
const requestBody = {
2022-04-20 09:16:57 +00:00
name : 'get query' ,
2023-01-09 12:00:32 +00:00
data_source_id : dataSource.id ,
2021-07-24 18:09:25 +00:00
kind : 'restapi' ,
2021-09-21 13:48:28 +00:00
options : { method : 'get' } ,
2022-01-04 08:04:12 +00:00
app_version_id : applicationVersion.id ,
2021-09-21 13:48:28 +00:00
} ;
2021-07-24 18:09:25 +00:00
2025-02-25 06:52:50 +00:00
for ( const userData of [ adminUserData , developerUserData , superAdminUserData ] ) {
2021-07-24 18:09:25 +00:00
const response = await request ( app . getHttpServer ( ) )
2021-10-15 09:05:11 +00:00
. post ( ` /api/data_queries ` )
2025-02-25 06:52:50 +00:00
. set ( 'tj-workspace-id' , adminUserData . user . defaultOrganizationId )
2023-04-06 11:12:58 +00:00
. set ( 'Cookie' , userData [ 'tokenCookie' ] )
2022-01-04 08:04:12 +00:00
. send ( requestBody ) ;
2021-07-24 18:09:25 +00:00
expect ( response . statusCode ) . toBe ( 201 ) ;
2022-01-04 08:04:12 +00:00
expect ( response . body . id ) . toBeDefined ( ) ;
2023-01-09 12:00:32 +00:00
expect ( response . body . data_source_id ) . toBe ( dataSource . id ) ;
2022-01-04 08:04:12 +00:00
expect ( response . body . options ) . toBeDefined ( ) ;
expect ( response . body . created_at ) . toBeDefined ( ) ;
expect ( response . body . updated_at ) . toBeDefined ( ) ;
2021-07-24 18:09:25 +00:00
}
// Forbidden if a viewer or a user of another organization
2021-09-21 13:48:28 +00:00
for ( const userData of [ anotherOrgAdminUserData , viewerUserData ] ) {
2021-07-24 18:09:25 +00:00
const response = await request ( app . getHttpServer ( ) )
2021-10-15 09:05:11 +00:00
. post ( ` /api/data_queries ` )
2023-04-06 11:12:58 +00:00
. set ( 'tj-workspace-id' , userData . user . defaultOrganizationId )
. set ( 'Cookie' , userData [ 'tokenCookie' ] )
2022-01-04 08:04:12 +00:00
. send ( requestBody ) ;
2021-07-24 18:09:25 +00:00
expect ( response . statusCode ) . toBe ( 403 ) ;
}
} ) ;
2022-05-05 11:51:00 +00:00
it ( 'should be able to get queries sorted created wise' , async ( ) = > {
const adminUserData = await createUser ( app , {
email : 'admin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2023-01-09 12:00:32 +00:00
const { dataSource , appVersion } = await generateAppDefaults ( app , adminUserData . user , {
isQueryNeeded : false ,
2022-05-05 11:51:00 +00:00
} ) ;
const options = {
method : 'get' ,
url : null ,
url_params : [ [ '' , '' ] ] ,
headers : [ [ '' , '' ] ] ,
body : [ [ '' , '' ] ] ,
json_body : null ,
body_toggle : false ,
} ;
const createdQueries = [ ] ;
const totalQueries = 15 ;
2023-04-06 11:12:58 +00:00
const loggedUser = await authenticateUser ( app , adminUserData . user . email ) ;
adminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2022-05-05 11:51:00 +00:00
for ( let i = 1 ; i <= totalQueries ; i ++ ) {
const queryParams = {
name : ` restapi ${ i } ` ,
data_source_id : dataSource.id ,
kind : 'restapi' ,
options ,
2022-10-27 11:29:43 +00:00
plugin_id : null ,
2022-05-05 11:51:00 +00:00
app_version_id : appVersion.id ,
} ;
const response = await request ( app . getHttpServer ( ) )
. post ( ` /api/data_queries ` )
2023-04-06 11:12:58 +00:00
. set ( 'tj-workspace-id' , adminUserData . user . defaultOrganizationId )
. set ( 'Cookie' , adminUserData [ 'tokenCookie' ] )
2022-05-05 11:51:00 +00:00
. send ( queryParams ) ;
2022-10-27 11:29:43 +00:00
response . body [ 'plugin' ] = null ;
2022-05-05 11:51:00 +00:00
createdQueries . push ( response . body ) ;
}
// Latest query should be on top
createdQueries . reverse ( ) ;
const response = await request ( app . getHttpServer ( ) )
2023-01-09 12:00:32 +00:00
. get ( ` /api/data_queries?app_version_id= ${ appVersion . id } ` )
2023-04-06 11:12:58 +00:00
. set ( 'tj-workspace-id' , adminUserData . user . defaultOrganizationId )
. set ( 'Cookie' , adminUserData [ 'tokenCookie' ] ) ;
2022-05-05 11:51:00 +00:00
expect ( response . statusCode ) . toBe ( 200 ) ;
expect ( response . body . data_queries . length ) . toBe ( totalQueries ) ;
2023-01-09 12:00:32 +00:00
for ( let i = 0 ; i < totalQueries ; i ++ ) {
const responseObject = response . body . data_queries [ i ] ;
const createdObject = createdQueries [ i ] ;
expect ( responseObject . id ) . toEqual ( createdObject . id ) ;
expect ( responseObject . name ) . toEqual ( createdObject . name ) ;
expect ( responseObject . options ) . toMatchObject ( createdObject . options ) ;
expect ( responseObject . created_at ) . toEqual ( createdObject . created_at ) ;
expect ( responseObject . updated_at ) . toEqual ( createdObject . updated_at ) ;
}
2022-05-05 11:51:00 +00:00
} ) ;
2025-02-25 06:52:50 +00:00
it ( 'should be able to run queries of an app if the user belongs to the same organization or has instance user type' , async ( ) = > {
2021-10-11 15:15:58 +00:00
const adminUserData = await createUser ( app , {
email : 'admin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2025-02-25 06:52:50 +00:00
const superAdminUserData = await createUser ( app , {
email : 'superadmin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
userType : 'instance' ,
} ) ;
2021-09-21 13:48:28 +00:00
const developerUserData = await createUser ( app , {
email : 'developer@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'developer' ] ,
2021-09-21 13:48:28 +00:00
organization : adminUserData.organization ,
} ) ;
const viewerUserData = await createUser ( app , {
email : 'viewer@tooljet.io' ,
2021-10-11 15:15:58 +00:00
groups : [ 'all_users' , 'viewer' ] ,
2021-09-21 13:48:28 +00:00
organization : adminUserData.organization ,
} ) ;
2021-07-24 06:13:21 +00:00
2023-01-09 12:00:32 +00:00
const { application , dataQuery } = await generateAppDefaults ( app , adminUserData . user , { } ) ;
2021-07-24 06:13:21 +00:00
2023-04-06 11:12:58 +00:00
let loggedUser = await authenticateUser ( app , adminUserData . user . email ) ;
adminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
loggedUser = await authenticateUser ( app , developerUserData . user . email ) ;
developerUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
loggedUser = await authenticateUser ( app , viewerUserData . user . email ) ;
viewerUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2025-02-25 06:52:50 +00:00
loggedUser = await authenticateUser ( app , superAdminUserData . user . email , 'password' , adminUserData . organization . id ) ;
superAdminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2023-04-06 11:12:58 +00:00
2021-10-11 15:15:58 +00:00
// setup app permissions for developer
2022-05-05 07:08:42 +00:00
const developerUserGroup = await getRepository ( GroupPermission ) . findOneOrFail ( {
2022-01-28 06:14:44 +00:00
where : {
group : 'developer' ,
} ,
2021-10-11 15:15:58 +00:00
} ) ;
await createAppGroupPermission ( app , application , developerUserGroup . id , {
read : true ,
update : true ,
delete : false ,
} ) ;
// setup app permissions for viewer
2022-05-05 07:08:42 +00:00
const viewerUserGroup = await getRepository ( GroupPermission ) . findOneOrFail ( {
2022-01-28 06:14:44 +00:00
where : {
group : 'viewer' ,
} ,
2021-10-11 15:15:58 +00:00
} ) ;
await createAppGroupPermission ( app , application , viewerUserGroup . id , {
read : true ,
update : false ,
delete : false ,
} ) ;
2025-02-25 06:52:50 +00:00
for ( const userData of [ adminUserData , developerUserData , viewerUserData , superAdminUserData ] ) {
2021-07-24 06:13:21 +00:00
const response = await request ( app . getHttpServer ( ) )
2021-10-15 09:05:11 +00:00
. post ( ` /api/data_queries/ ${ dataQuery . id } /run ` )
2025-02-25 06:52:50 +00:00
. set ( 'tj-workspace-id' , adminUserData . user . defaultOrganizationId )
2023-04-06 11:12:58 +00:00
. set ( 'Cookie' , userData [ 'tokenCookie' ] ) ;
2021-07-24 06:13:21 +00:00
expect ( response . statusCode ) . toBe ( 201 ) ;
expect ( response . body . data . length ) . toBe ( 30 ) ;
2025-02-25 06:52:50 +00:00
// should create audit log
const auditLog = await AuditLog . findOne ( {
where : {
userId : userData.user.id ,
2026-01-05 18:22:02 +00:00
resourceType : MODULES.DATA_QUERY ,
2025-02-25 06:52:50 +00:00
} ,
} ) ;
const organizationId =
userData . user . userType === 'instance' ? adminUserData.user.organizationId : userData.user.organizationId ;
expect ( auditLog . organizationId ) . toEqual ( organizationId ) ;
expect ( auditLog . resourceId ) . toEqual ( dataQuery . id ) ;
2026-01-05 18:22:02 +00:00
expect ( auditLog . resourceType ) . toEqual ( MODULES . DATA_QUERY ) ;
2025-02-25 06:52:50 +00:00
expect ( auditLog . resourceName ) . toEqual ( dataQuery . name ) ;
expect ( auditLog . actionType ) . toEqual ( 'DATA_QUERY_RUN' ) ;
expect ( auditLog . metadata ) . toEqual ( {
parsedQueryOptions : {
body : [ ] ,
headers : [ ] ,
method : 'get' ,
url : 'https://api.github.com/repos/tooljet/tooljet/stargazers' ,
url_params : [ ] ,
} ,
} ) ;
expect ( auditLog . createdAt ) . toBeDefined ( ) ;
2021-07-24 06:13:21 +00:00
}
} ) ;
it ( 'should not be able to run queries of an app if the user belongs to another organization' , async ( ) = > {
2021-10-11 15:15:58 +00:00
const adminUserData = await createUser ( app , {
email : 'admin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
const anotherOrgAdminUserData = await createUser ( app , {
email : 'another@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2021-07-24 06:13:21 +00:00
2023-04-06 11:12:58 +00:00
const loggedUser = await authenticateUser ( app , anotherOrgAdminUserData . user . email ) ;
anotherOrgAdminUserData [ 'tokenCookie' ] = loggedUser . tokenCookie ;
2023-01-09 12:00:32 +00:00
const { dataQuery } = await generateAppDefaults ( app , adminUserData . user , { } ) ;
2021-07-24 06:13:21 +00:00
const response = await request ( app . getHttpServer ( ) )
2021-10-15 09:05:11 +00:00
. post ( ` /api/data_queries/ ${ dataQuery . id } /run ` )
2023-04-06 11:12:58 +00:00
. set ( 'tj-workspace-id' , anotherOrgAdminUserData . user . defaultOrganizationId )
. set ( 'Cookie' , anotherOrgAdminUserData [ 'tokenCookie' ] ) ;
2021-07-24 06:13:21 +00:00
expect ( response . statusCode ) . toBe ( 403 ) ;
} ) ;
it ( 'should be able to run queries of an app if a public app ( even if an unauthenticated user )' , async ( ) = > {
2021-10-11 15:15:58 +00:00
const adminUserData = await createUser ( app , {
email : 'admin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2023-01-09 12:00:32 +00:00
const { dataQuery } = await generateAppDefaults ( app , adminUserData . user , { isAppPublic : true } ) ;
2021-07-24 06:13:21 +00:00
2021-10-15 09:05:11 +00:00
const response = await request ( app . getHttpServer ( ) ) . post ( ` /api/data_queries/ ${ dataQuery . id } /run ` ) ;
2021-07-24 06:13:21 +00:00
expect ( response . statusCode ) . toBe ( 201 ) ;
expect ( response . body . data . length ) . toBe ( 30 ) ;
} ) ;
it ( 'should not be able to run queries if app not not public and user is not authenticated' , async ( ) = > {
2021-10-11 15:15:58 +00:00
const adminUserData = await createUser ( app , {
email : 'admin@tooljet.io' ,
groups : [ 'all_users' , 'admin' ] ,
} ) ;
2023-01-09 12:00:32 +00:00
const { dataQuery } = await generateAppDefaults ( app , adminUserData . user , { } ) ;
2021-07-24 06:13:21 +00:00
2021-10-15 09:05:11 +00:00
const response = await request ( app . getHttpServer ( ) ) . post ( ` /api/data_queries/ ${ dataQuery . id } /run ` ) ;
2021-07-24 06:13:21 +00:00
expect ( response . statusCode ) . toBe ( 401 ) ;
} ) ;
afterAll ( async ( ) = > {
await app . close ( ) ;
} ) ;
} ) ;