diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 000000000..2312dc587 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx lint-staged diff --git a/backend/package.json b/backend/package.json index 4261d01fa..a4ec905ed 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,121 +1,123 @@ { - "name": "auto-admin", - "version": "0.0.1", - "description": "", - "author": "", - "private": true, - "license": "UNLICENSED", - "type": "module", - "scripts": { - "prebuild": "rimraf dist", - "build": "nest build", - "start": "nest start", - "start:dev": "nest start --watch --preserveWatchOutput", - "start:debug": "nest start --debug --watch", - "start:prod": "node dist/main", - "test": "ava test/ava-tests/non-saas-tests/* --serial", - "test-all": "ava --timeout=5m", - "test-saas": "ava test/ava-tests/saas-tests/* ", - "typeorm": "ts-node -r tsconfig-paths/register ../node_modules/.bin/typeorm", - "migration:generate": "yarn run typeorm migration:generate -d dist/src/shared/config/datasource.config.js", - "migration:create": "yarn run typeorm migration:create -d dist/src/shared/config/datasource.config.js", - "migration:run": "yarn run typeorm migration:run -d dist/src/shared/config/datasource.config.js", - "migration:revert": "npm run typeorm -- migration:revert -d dist/src/shared/config/datasource.config.js", - "knip": "knip" - }, - "dependencies": { - "@amplitude/node": "1.10.2", - "@aws-sdk/client-bedrock-runtime": "^3.954.0", - "@aws-sdk/lib-dynamodb": "^3.953.0", - "@electric-sql/pglite": "^0.3.14", - "@faker-js/faker": "^10.1.0", - "@nestjs/common": "11.1.9", - "@nestjs/config": "4.0.2", - "@nestjs/core": "11.1.9", - "@nestjs/platform-express": "11.1.9", - "@nestjs/schedule": "^6.1.0", - "@nestjs/swagger": "^11.2.3", - "@nestjs/throttler": "^6.5.0", - "@nestjs/typeorm": "^11.0.0", - "@nestjsx/crud": "4.6.2", - "@rocketadmin/shared-code": "workspace:*", - "@sentry/minimal": "^6.19.7", - "@sentry/node": "10.31.0", - "@types/crypto-js": "^4.2.2", - "@types/jsonwebtoken": "^9.0.10", - "@types/multer": "^2.0.0", - "@types/nodemailer": "^7.0.4", - "@types/nunjucks": "^3.2.6", - "@types/qrcode": "^1.5.6", - "@zapier/secret-scrubber": "^1.1.2", - "argon2": "0.44.0", - "axios": "^1.13.2", - "base32-encode": "^2.0.0", - "basic-auth": "2.0.1", - "bcrypt": "6.0.0", - "body-parser": "^2.2.1", - "class-transformer": "0.5.1", - "class-validator": "^0.14.3", - "cookie-parser": "^1.4.7", - "crc": "^4.3.2", - "crypto-js": "4.2.0", - "csv": "^6.4.1", - "dotenv": "17.2.3", - "express": "5.2.1", - "fetch-blob": "^4.0.0", - "helmet": "8.1.0", - "i18n-iso-countries": "^7.14.0", - "ip-range-check": "0.2.0", - "json2csv": "^5.0.7", - "jsonwebtoken": "^9.0.3", - "knex": "3.1.0", - "lru-cache": "^11.2.4", - "nanoid": "5.1.6", - "nodemailer": "^7.0.11", - "nunjucks": "^3.2.4", - "openai": "^6.14.0", - "otplib": "^12.0.1", - "p-queue": "9.0.1", - "pg": "^8.16.3", - "pg-connection-string": "^2.9.1", - "qrcode": "^1.5.4", - "query-string": "^9.3.1", - "reflect-metadata": "0.2.2", - "rimraf": "6.1.2", - "rxjs": "7.8.2", - "safe-regex2": "^5.0.0", - "secure-json-parse": "4.1.0", - "typeorm": "0.3.28", - "typeorm-pglite": "^0.3.2", - "uuid": "^13.0.0", - "validator": "^13.15.23", - "winston": "3.19.0" - }, - "devDependencies": { - "@ava/typescript": "6.0.0", - "@nestjs/cli": "^11.0.14", - "@nestjs/schematics": "11.0.9", - "@nestjs/testing": "^11.1.9", - "@types/bcrypt": "^6.0.0", - "@types/body-parser": "^1.19.6", - "@types/cookie-parser": "^1.4.10", - "@types/cron": "^2.4.3", - "@types/express": "^5.0.6", - "@types/ibm_db": "^3.2.0", - "@types/json2csv": "^5.0.7", - "@types/node": "^24.10.1", - "@types/pg": "^8.16.0", - "@types/safe-regex": "^1.1.6", - "@types/supertest": "^6.0.3", - "@types/uuid": "^11.0.0", - "@types/validator": "^13.15.10", - "ava": "6.4.1", - "knip": "^5.75.0", - "nock": "^14.0.10", - "supertest": "^7.1.4", - "ts-loader": "^9.5.4", - "ts-node": "^10.9.2", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.9.3" - } + "name": "auto-admin", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "type": "module", + "scripts": { + "prebuild": "rimraf dist", + "build": "nest build", + "start": "nest start", + "start:dev": "nest start --watch --preserveWatchOutput", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "test": "ava test/ava-tests/non-saas-tests/* --serial", + "test-all": "ava --timeout=5m", + "test-saas": "ava test/ava-tests/saas-tests/* ", + "typeorm": "ts-node -r tsconfig-paths/register ../node_modules/.bin/typeorm", + "migration:generate": "yarn run typeorm migration:generate -d dist/src/shared/config/datasource.config.js", + "migration:create": "yarn run typeorm migration:create -d dist/src/shared/config/datasource.config.js", + "migration:run": "yarn run typeorm migration:run -d dist/src/shared/config/datasource.config.js", + "migration:revert": "npm run typeorm -- migration:revert -d dist/src/shared/config/datasource.config.js", + "knip": "knip" + }, + "dependencies": { + "@amplitude/node": "1.10.2", + "@aws-sdk/client-bedrock-runtime": "^3.954.0", + "@aws-sdk/client-s3": "^3.958.0", + "@aws-sdk/lib-dynamodb": "^3.953.0", + "@aws-sdk/s3-request-presigner": "^3.958.0", + "@electric-sql/pglite": "^0.3.14", + "@faker-js/faker": "^10.1.0", + "@nestjs/common": "11.1.9", + "@nestjs/config": "4.0.2", + "@nestjs/core": "11.1.9", + "@nestjs/platform-express": "11.1.9", + "@nestjs/schedule": "^6.1.0", + "@nestjs/swagger": "^11.2.3", + "@nestjs/throttler": "^6.5.0", + "@nestjs/typeorm": "^11.0.0", + "@nestjsx/crud": "4.6.2", + "@rocketadmin/shared-code": "workspace:*", + "@sentry/minimal": "^6.19.7", + "@sentry/node": "10.31.0", + "@types/crypto-js": "^4.2.2", + "@types/jsonwebtoken": "^9.0.10", + "@types/multer": "^2.0.0", + "@types/nodemailer": "^7.0.4", + "@types/nunjucks": "^3.2.6", + "@types/qrcode": "^1.5.6", + "@zapier/secret-scrubber": "^1.1.2", + "argon2": "0.44.0", + "axios": "^1.13.2", + "base32-encode": "^2.0.0", + "basic-auth": "2.0.1", + "bcrypt": "6.0.0", + "body-parser": "^2.2.1", + "class-transformer": "0.5.1", + "class-validator": "^0.14.3", + "cookie-parser": "^1.4.7", + "crc": "^4.3.2", + "crypto-js": "4.2.0", + "csv": "^6.4.1", + "dotenv": "17.2.3", + "express": "5.2.1", + "fetch-blob": "^4.0.0", + "helmet": "8.1.0", + "i18n-iso-countries": "^7.14.0", + "ip-range-check": "0.2.0", + "json2csv": "^5.0.7", + "jsonwebtoken": "^9.0.3", + "knex": "3.1.0", + "lru-cache": "^11.2.4", + "nanoid": "5.1.6", + "nodemailer": "^7.0.11", + "nunjucks": "^3.2.4", + "openai": "^6.14.0", + "otplib": "^12.0.1", + "p-queue": "9.0.1", + "pg": "^8.16.3", + "pg-connection-string": "^2.9.1", + "qrcode": "^1.5.4", + "query-string": "^9.3.1", + "reflect-metadata": "0.2.2", + "rimraf": "6.1.2", + "rxjs": "7.8.2", + "safe-regex2": "^5.0.0", + "secure-json-parse": "4.1.0", + "typeorm": "0.3.28", + "typeorm-pglite": "^0.3.2", + "uuid": "^13.0.0", + "validator": "^13.15.23", + "winston": "3.19.0" + }, + "devDependencies": { + "@ava/typescript": "6.0.0", + "@nestjs/cli": "^11.0.14", + "@nestjs/schematics": "11.0.9", + "@nestjs/testing": "^11.1.9", + "@types/bcrypt": "^6.0.0", + "@types/body-parser": "^1.19.6", + "@types/cookie-parser": "^1.4.10", + "@types/cron": "^2.4.3", + "@types/express": "^5.0.6", + "@types/ibm_db": "^3.2.0", + "@types/json2csv": "^5.0.7", + "@types/node": "^24.10.1", + "@types/pg": "^8.16.0", + "@types/safe-regex": "^1.1.6", + "@types/supertest": "^6.0.3", + "@types/uuid": "^11.0.0", + "@types/validator": "^13.15.10", + "ava": "6.4.1", + "knip": "^5.75.0", + "nock": "^14.0.10", + "supertest": "^7.1.4", + "ts-loader": "^9.5.4", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.9.3" + } } diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index f6060c74d..a89a5f801 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -1,113 +1,115 @@ -import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; -import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core'; -import { ScheduleModule } from '@nestjs/schedule'; -import { AppController } from './app.controller.js'; -import { GlobalDatabaseContext } from './common/application/global-database-context.js'; -import { BaseType, UseCaseType } from './common/data-injection.tokens.js'; -import { AIModule } from './entities/ai/ai.module.js'; -import { ApiKeyModule } from './entities/api-key/api-key.module.js'; -import { CompanyFaviconModule } from './entities/company-favicon/company-favicon.module.js'; -import { CompanyInfoModule } from './entities/company-info/company-info.module.js'; -import { CompanyLogoModule } from './entities/company-logo/company-logo.module.js'; -import { CompanyTabTitleModule } from './entities/company-tab-title/company-tab-title.module.js'; -import { ConnectionPropertiesModule } from './entities/connection-properties/connection-properties.module.js'; -import { ConnectionModule } from './entities/connection/connection.module.js'; -import { ConversionModule } from './entities/convention/conversion.module.js'; -import { CronJobsModule } from './entities/cron-jobs/cron-jobs.module.js'; -import { CustomFieldModule } from './entities/custom-field/custom-field.module.js'; -import { DemoDataModule } from './entities/demo-data/demo-deta.module.js'; -import { EmailModule } from './entities/email/email/email.module.js'; -import { GroupModule } from './entities/group/group.module.js'; -import { LoggingModule } from './entities/logging/logging.module.js'; -import { PermissionModule } from './entities/permission/permission.module.js'; -import { TableTriggersModule } from './entities/table-actions/table-action-rules-module/action-rules.module.js'; -import { TableActionModule } from './entities/table-actions/table-actions-module/table-action.module.js'; -import { TableFiltersModule } from './entities/table-filters/table-filters.module.js'; -import { TableLogsModule } from './entities/table-logs/table-logs.module.js'; -import { TableSettingsModule } from './entities/table-settings/table-settings.module.js'; -import { TableModule } from './entities/table/table.module.js'; -import { UserActionModule } from './entities/user-actions/user-action.module.js'; -import { UserModule } from './entities/user/user.module.js'; -import { TableWidgetModule } from './entities/widget/table-widget.module.js'; -import { TimeoutInterceptor } from './interceptors/index.js'; -import { SaaSGatewayModule } from './microservices/gateways/saas-gateway.ts/saas-gateway.module.js'; -import { SaasModule } from './microservices/saas-microservice/saas.module.js'; -import { AppLoggerMiddleware } from './middlewares/logging-middleware/app-logger-middlewate.js'; -import { DatabaseModule } from './shared/database/database.module.js'; -import { GetHelloUseCase } from './use-cases-app/get-hello.use.case.js'; -import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler'; -import { SharedJobsModule } from './entities/shared-jobs/shared-jobs.module.js'; -import { TableCategoriesModule } from './entities/table-categories/table-categories.module.js'; -import { UserSecretModule } from './entities/user-secret/user-secret.module.js'; -import { SignInAuditModule } from './entities/user-sign-in-audit/sign-in-audit.module.js'; +import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common"; +import { APP_GUARD, APP_INTERCEPTOR } from "@nestjs/core"; +import { ScheduleModule } from "@nestjs/schedule"; +import { ThrottlerGuard, ThrottlerModule } from "@nestjs/throttler"; +import { AppController } from "./app.controller.js"; +import { GlobalDatabaseContext } from "./common/application/global-database-context.js"; +import { BaseType, UseCaseType } from "./common/data-injection.tokens.js"; +import { AIModule } from "./entities/ai/ai.module.js"; +import { ApiKeyModule } from "./entities/api-key/api-key.module.js"; +import { CompanyFaviconModule } from "./entities/company-favicon/company-favicon.module.js"; +import { CompanyInfoModule } from "./entities/company-info/company-info.module.js"; +import { CompanyLogoModule } from "./entities/company-logo/company-logo.module.js"; +import { CompanyTabTitleModule } from "./entities/company-tab-title/company-tab-title.module.js"; +import { ConnectionModule } from "./entities/connection/connection.module.js"; +import { ConnectionPropertiesModule } from "./entities/connection-properties/connection-properties.module.js"; +import { ConversionModule } from "./entities/convention/conversion.module.js"; +import { CronJobsModule } from "./entities/cron-jobs/cron-jobs.module.js"; +import { CustomFieldModule } from "./entities/custom-field/custom-field.module.js"; +import { DemoDataModule } from "./entities/demo-data/demo-deta.module.js"; +import { EmailModule } from "./entities/email/email/email.module.js"; +import { GroupModule } from "./entities/group/group.module.js"; +import { LoggingModule } from "./entities/logging/logging.module.js"; +import { PermissionModule } from "./entities/permission/permission.module.js"; +import { S3WidgetModule } from "./entities/s3-widget/s3-widget.module.js"; +import { SharedJobsModule } from "./entities/shared-jobs/shared-jobs.module.js"; +import { TableModule } from "./entities/table/table.module.js"; +import { TableTriggersModule } from "./entities/table-actions/table-action-rules-module/action-rules.module.js"; +import { TableActionModule } from "./entities/table-actions/table-actions-module/table-action.module.js"; +import { TableCategoriesModule } from "./entities/table-categories/table-categories.module.js"; +import { TableFiltersModule } from "./entities/table-filters/table-filters.module.js"; +import { TableLogsModule } from "./entities/table-logs/table-logs.module.js"; +import { TableSettingsModule } from "./entities/table-settings/table-settings.module.js"; +import { UserModule } from "./entities/user/user.module.js"; +import { UserActionModule } from "./entities/user-actions/user-action.module.js"; +import { UserSecretModule } from "./entities/user-secret/user-secret.module.js"; +import { SignInAuditModule } from "./entities/user-sign-in-audit/sign-in-audit.module.js"; +import { TableWidgetModule } from "./entities/widget/table-widget.module.js"; +import { TimeoutInterceptor } from "./interceptors/index.js"; +import { SaaSGatewayModule } from "./microservices/gateways/saas-gateway.ts/saas-gateway.module.js"; +import { SaasModule } from "./microservices/saas-microservice/saas.module.js"; +import { AppLoggerMiddleware } from "./middlewares/logging-middleware/app-logger-middlewate.js"; +import { DatabaseModule } from "./shared/database/database.module.js"; +import { GetHelloUseCase } from "./use-cases-app/get-hello.use.case.js"; @Module({ - imports: [ - ScheduleModule.forRoot(), - ThrottlerModule.forRoot({ - throttlers: [ - { - ttl: 60000, - limit: 200, - }, - ], - }), - ConnectionModule, - ConnectionPropertiesModule, - ConversionModule, - CustomFieldModule, - GroupModule, - PermissionModule, - TableLogsModule, - TableModule, - TableSettingsModule, - TableWidgetModule, - UserModule, - UserActionModule, - CronJobsModule, - DatabaseModule, - TableActionModule, - SaasModule, - CompanyInfoModule, - SaaSGatewayModule, - TableTriggersModule, - ApiKeyModule, - AIModule, - EmailModule, - CompanyLogoModule, - CompanyFaviconModule, - CompanyTabTitleModule, - TableFiltersModule, - DemoDataModule, - LoggingModule, - SharedJobsModule, - TableCategoriesModule, - UserSecretModule, - SignInAuditModule, - AIModule, - ], - controllers: [AppController], - providers: [ - { - provide: APP_INTERCEPTOR, - useClass: TimeoutInterceptor, - }, - { - provide: APP_GUARD, - useClass: ThrottlerGuard, - }, - { - provide: BaseType.GLOBAL_DB_CONTEXT, - useClass: GlobalDatabaseContext, - }, - { - provide: UseCaseType.GET_HELLO, - useClass: GetHelloUseCase, - }, - ], + imports: [ + ScheduleModule.forRoot(), + ThrottlerModule.forRoot({ + throttlers: [ + { + ttl: 60000, + limit: 200, + }, + ], + }), + ConnectionModule, + ConnectionPropertiesModule, + ConversionModule, + CustomFieldModule, + GroupModule, + PermissionModule, + TableLogsModule, + TableModule, + TableSettingsModule, + TableWidgetModule, + UserModule, + UserActionModule, + CronJobsModule, + DatabaseModule, + TableActionModule, + SaasModule, + CompanyInfoModule, + SaaSGatewayModule, + TableTriggersModule, + ApiKeyModule, + AIModule, + EmailModule, + CompanyLogoModule, + CompanyFaviconModule, + CompanyTabTitleModule, + TableFiltersModule, + DemoDataModule, + LoggingModule, + SharedJobsModule, + TableCategoriesModule, + UserSecretModule, + SignInAuditModule, + S3WidgetModule, + AIModule, + ], + controllers: [AppController], + providers: [ + { + provide: APP_INTERCEPTOR, + useClass: TimeoutInterceptor, + }, + { + provide: APP_GUARD, + useClass: ThrottlerGuard, + }, + { + provide: BaseType.GLOBAL_DB_CONTEXT, + useClass: GlobalDatabaseContext, + }, + { + provide: UseCaseType.GET_HELLO, + useClass: GetHelloUseCase, + }, + ], }) export class ApplicationModule implements NestModule { - configure(consumer: MiddlewareConsumer): void { - consumer.apply(AppLoggerMiddleware).forRoutes('*'); - } + configure(consumer: MiddlewareConsumer): void { + consumer.apply(AppLoggerMiddleware).forRoutes("*"); + } } diff --git a/backend/src/common/data-injection.tokens.ts b/backend/src/common/data-injection.tokens.ts index 4fb4f3955..4a133f5d8 100644 --- a/backend/src/common/data-injection.tokens.ts +++ b/backend/src/common/data-injection.tokens.ts @@ -1,176 +1,179 @@ export enum BaseType { - GLOBAL_DB_CONTEXT = 'GLOBAL_DB_CONTEXT', - DATA_SOURCE = 'DATA_SOURCE', - NUNJUCKS = 'NUNJUCKS', + GLOBAL_DB_CONTEXT = "GLOBAL_DB_CONTEXT", + DATA_SOURCE = "DATA_SOURCE", + NUNJUCKS = "NUNJUCKS", } export enum UseCaseType { - DELETE_USER_ACCOUNT = 'DELETE_USER_ACCOUNT', - FIND_USER = 'FIND_USER', - USUAL_LOGIN = 'USUAL_LOGIN', - LOG_OUT = 'LOG_OUT', - CHANGE_USUAL_PASSWORD = 'CHANGE_USUAL_PASSWORD', - VERIFY_EMAIL = 'VERIFY_EMAIL', - VERIFY_RESET_USER_PASSWORD = 'VERIFY_RESET_USER_PASSWORD', - REQUEST_RESET_USER_PASSWORD = 'REQUEST_RESET_USER_PASSWORD', - REQUEST_CHANGE_USER_EMAIL = 'REQUEST_CHANGE_USER_EMAIL', - VERIFY_EMAIL_CHANGE = 'VERIFY_EMAIL_CHANGE', - VERIFY_EMAIL_REQUEST = 'VERIFY_EMAIL_REQUEST', - CHANGE_USER_NAME = 'CHANGE_USER_NAME', - GENERATE_OTP = 'GENERATE_OTP', - VERIFY_OTP = 'VERIFY_OTP', - OTP_LOGIN = 'OTP_LOGIN', - DISABLE_OTP = 'DISABLE_OTP', - SAVE_USER_SESSION_SETTINGS = 'SAVE_USER_SESSION_SETTINGS', - GET_USER_SESSION_SETTINGS = 'GET_USER_SESSION_SETTINGS', - TOGGLE_TEST_CONNECTIONS_DISPLAY_MODE = 'TOGGLE_TEST_CONNECTIONS_DISPLAY_MODE', - - FIND_CONNECTIONS = 'FIND_CONNECTIONS', - FIND_USERS_IN_CONNECTION = 'FIND_USERS_IN_CONNECTION', - FIND_CONNECTION = 'FIND_CONNECTION', - CREATE_CONNECTION = 'CREATE_CONNECTION', - UPDATE_CONNECTION = 'UPDATE_CONNECTION', - DELETE_CONNECTION = 'DELETE_CONNECTION', - DELETE_GROUP_FROM_CONNECTION = 'DELETE_GROUP_FROM_CONNECTION', - CREATE_GROUP_IN_CONNECTION = 'CREATE_GROUP_IN_CONNECTION', - GET_USER_GROUPS_IN_CONNECTION = 'GET_USER_GROUPS_IN_CONNECTION', - GET_PERMISSIONS_FOR_GROUP_IN_CONNECTION = 'GET_PERMISSIONS_FOR_GROUP_IN_CONNECTION', - GET_USER_PERMISSIONS_FOR_GROUP_IN_CONNECTION = 'GET_USER_PERMISSIONS_FOR_GROUP_IN_CONNECTION', - TEST_CONNECTION_USE_CASE = 'TEST_CONNECTION_USE_CASE', - UPDATE_CONNECTION_MASTER_PASSWORD = 'UPDATE_CONNECTION_MASTER_PASSWORD', - RESTORE_CONNECTION = 'RESTORE_CONNECTION', - VALIDATE_CONNECTION_TOKEN = 'VALIDATE_CONNECTION_TOKEN', - REFRESH_CONNECTION_AGENT_TOKEN = 'REFRESH_CONNECTION_AGENT_TOKEN', - VALIDATE_CONNECTION_MASTER_PASSWORD = 'VALIDATE_CONNECTION_MASTER_PASSWORD', - UNFREEZE_CONNECTION = 'UNFREEZE_CONNECTION', - - FIND_ALL_USER_GROUPS = 'FIND_ALL_USER_GROUPS', - INVITE_USER_IN_GROUP = 'INVITE_USER_IN_GROUP', - FIND_ALL_USERS_IN_GROUP = 'FIND_ALL_USERS_IN_GROUP', - REMOVE_USER_FROM_GROUP = 'REMOVE_USER_FROM_GROUP', - DELETE_GROUP = 'DELETE_GROUP', - UPDATE_GROUP_TITLE = 'UPDATE_GROUP_TITLE', - - FIND_CONNECTION_PROPERTIES = 'FIND_CONNECTION_PROPERTIES', - CREATE_CONNECTION_PROPERTIES = 'CREATE_CONNECTION_PROPERTIES', - UPDATE_CONNECTION_PROPERTIES = 'UPDATE_CONNECTION_PROPERTIES', - DELETE_CONNECTION_PROPERTIES = 'DELETE_CONNECTION_PROPERTIES', - - GET_CONVERSIONS = 'GET_CONVERSIONS', - - GET_CUSTOM_FIELDS = 'GET_CUSTOM_FIELDS', - CREATE_CUSTOM_FIELDS = 'CREATE_CUSTOM_FIELDS', - UPDATE_CUSTOM_FIELDS = 'UPDATE_CUSTOM_FIELDS', - DELETE_CUSTOM_FIELD = 'DELETE_CUSTOM_FIELD', - - CREATE_OR_UPDATE_PERMISSIONS = 'CREATE_OR_UPDATE_PERMISSIONS', - - FIND_LOGS = 'FIND_LOGS', - EXPORT_LOGS_AS_CSV = 'EXPORT_LOGS_AS_CSV', - - FIND_TABLE_SETTINGS = 'FIND_TABLE_SETTINGS', - CREATE_TABLE_SETTINGS = 'CREATE_TABLE_SETTINGS', - UPDATE_TABLE_SETTINGS = 'UPDATE_TABLE_SETTINGS', - DELETE_TABLE_SETTINGS = 'DELETE_TABLE_SETTINGS', - - GET_HELLO = 'GET_HELLO', - - CREATE_USER_ACTION = 'CREATE_USER_ACTION', - - CHECK_USER_LOGS_AND_UPDATE_ACTIONS = 'CHECK_USER_LOGS_AND_UPDATE_ACTIONS', - CHECK_USER_ACTIONS_AND_MAIL_USERS = 'CHECK_USER_ACTIONS_AND_MAIL_USERS', - - FIND_TABLE_WIDGETS = 'FIND_TABLE_WIDGETS', - CREATE_UPDATE_DELETE_TABLE_WIDGETS = 'CREATE_UPDATE_DELETE_TABLE_WIDGETS', - - FIND_TABLES_IN_CONNECTION = 'FIND_TABLES_IN_CONNECTION', - FIND_TABLES_IN_CONNECTION_V2 = 'FIND_TABLES_IN_CONNECTION_V2', - GET_ALL_TABLE_ROWS = 'GET_ALL_TABLE_ROWS', - GET_TABLE_STRUCTURE = 'GET_TABLE_STRUCTURE', - ADD_ROW_IN_TABLE = 'ADD_ROW_IN_TABLE', - UPDATE_ROW_IN_TABLE = 'UPDATE_ROW_IN_TABLE', - BULK_UPDATE_ROWS_IN_TABLE = 'BULK_UPDATE_ROWS_IN_TABLE', - DELETE_ROW_FROM_TABLE = 'DELETE_ROW_FROM_TABLE', - DELETE_ROWS_FROM_TABLE = 'DELETE_ROWS_FROM_TABLE', - GET_ROW_BY_PRIMARY_KEY = 'GET_ROW_BY_PRIMARY_KEY', - EXPORT_CSV_FROM_TABLE = 'EXPORT_CSV_FROM_TABLE', - IMPORT_CSV_TO_TABLE = 'IMPORT_CSV_TO_TABLE', - - SAAS_COMPANY_REGISTRATION = 'SAAS_COMPANY_REGISTRATION', - SAAS_GET_USER_INFO = 'SAAS_GET_USER_INFO', - SAAS_USUAL_REGISTER_USER = 'SAAS_USUAL_REGISTER_USER', - SAAS_DEMO_USER_REGISTRATION = 'SAAS_DEMO_USER_REGISTRATION', - SAAS_LOGIN_USER_WITH_GOOGLE = 'SAAS_LOGIN_USER_WITH_GOOGLE', - SAAS_LOGIN_USER_WITH_GITHUB = 'SAAS_LOGIN_USER_WITH_GITHUB', - SAAS_SAAS_GET_USERS_INFOS_BY_EMAIL = 'SAAS_SAAS_GET_USERS_INFOS_BY_EMAIL', - SAAS_SUSPEND_USERS = 'SAAS_SUSPEND_USERS', - SAAS_SUSPEND_USERS_OVER_LIMIT = 'SAAS_SUSPEND_USERS_OVER_LIMIT', - SAAS_GET_COMPANY_INFO_BY_USER_ID = 'SAAS_GET_COMPANY_INFO_BY_USER_ID', - SAAS_GET_USERS_COUNT_IN_COMPANY = 'SAAS_GET_USERS_COUNT_IN_COMPANY', - FREEZE_CONNECTIONS_IN_COMPANY = 'FREEZE_CONNECTIONS_IN_COMPANY', - UNFREEZE_CONNECTIONS_IN_COMPANY = 'UNFREEZE_CONNECTIONS_IN_COMPANY', - SAAS_REGISTER_USER_WITH_SAML = 'SAAS_REGISTER_USER_WITH_SAML', - - INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP = 'INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP', - VERIFY_INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP = 'VERIFY_INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP', - CHECK_IS_VERIFICATION_LINK_AVAILABLE = 'CHECK_IS_VERIFICATION_LINK_AVAILABLE', - UPDATE_USERS_2FA_STATUS_IN_COMPANY = 'UPDATE_USERS_2FA_STATUS_IN_COMPANY', - - GET_USER_COMPANY = 'GET_USER_COMPANY', - GET_FULL_USER_COMPANIES_INFO = 'GET_FULL_USER_COMPANIES_INFO', - GET_USER_EMAIL_COMPANIES = 'GET_USER_EMAIL_COMPANIES', - GET_USERS_IN_COMPANY = 'GET_USERS_IN_COMPANY', - GET_COMPANY_NAME = 'GET_COMPANY_NAME', - REMOVE_USER_FROM_COMPANY = 'REMOVE_USER_FROM_COMPANY', - REVOKE_INVITATION_IN_COMPANY = 'REVOKE_INVITATION_IN_COMPANY', - UPDATE_COMPANY_NAME = 'UPDATE_COMPANY_NAME', - UPDATE_USERS_COMPANY_ROLES = 'UPDATE_USERS_COMPANY_ROLES', - DELETE_COMPANY = 'DELETE_COMPANY', - SUSPEND_USERS_IN_COMPANY = 'SUSPEND_USERS_IN_COMPANY', - UNSUSPEND_USERS_IN_COMPANY = 'UNSUSPEND_USERS_IN_COMPANY', - TOGGLE_TEST_CONNECTIONS_DISPLAY_MODE_IN_COMPANY = 'TOGGLE_TEST_CONNECTIONS_DISPLAY_MODE_IN_COMPANY', - UPLOAD_COMPANY_LOGO = 'UPLOAD_COMPANY_LOGO', - FIND_COMPANY_LOGO = 'FIND_COMPANY_LOGO', - DELETE_COMPANY_LOGO = 'DELETE_COMPANY_LOGO', - UPLOAD_COMPANY_FAVICON = 'UPLOAD_COMPANY_FAVICON', - FIND_COMPANY_FAVICON = 'FIND_COMPANY_FAVICON', - DELETE_COMPANY_FAVICON = 'DELETE_COMPANY_FAVICON', - ADD_COMPANY_TAB_TITLE = 'ADD_COMPANY_TAB_TITLE', - FIND_COMPANY_TAB_TITLE = 'FIND_COMPANY_TAB_TITLE', - DELETE_COMPANY_TAB_TITLE = 'DELETE_COMPANY_TAB_TITLE', - GET_COMPANY_WHITE_LABEL_PROPERTIES = 'GET_COMPANY_WHITE_LABEL_PROPERTIES', - - CREATE_ACTION_RULES = 'CREATE_ACTION_RULES', - FIND_ACTION_RULES_FOR_TABLE = 'FIND_ACTION_RULES_FOR_TABLE', - DELETE_ACTION_RULE_IN_TABLE = 'DELETE_ACTION_RULE_IN_TABLE', - FIND_ACTION_RULE_BY_ID = 'FIND_ACTION_RULE_BY_ID', - UPDATE_ACTION_RULE = 'UPDATE_ACTION_RULE', - FIND_ACTION_RULE_CUSTOM_EVENTS = 'FIND_ACTION_RULE_CUSTOM_EVENTS', - ACTIVATE_TABLE_ACTIONS_IN_EVENT = 'ACTIVATE_TABLE_ACTIONS_IN_EVENT', - - CREATE_API_KEY = 'CREATE_API_KEY', - GET_API_KEYS = 'GET_API_KEYS', - GET_API_KEY = 'GET_API_KEY', - DELETE_API_KEY = 'DELETE_API_KEY', - - REQUEST_INFO_FROM_TABLE_WITH_AI_V2 = 'REQUEST_INFO_FROM_TABLE_WITH_AI_V2', - REQUEST_AI_SETTINGS_AND_WIDGETS_CREATION = 'REQUEST_AI_SETTINGS_AND_WIDGETS_CREATION', - - CREATE_TABLE_FILTERS = 'CREATE_TABLE_FILTERS', - FIND_TABLE_FILTERS = 'FIND_TABLE_FILTERS', - DELETE_TABLE_FILTERS = 'DELETE_TABLE_FILTERS', - FIND_TABLE_FILTER_BY_ID = 'FIND_TABLE_FILTER_BY_ID', - DELETE_TABLE_FILTER_BY_ID = 'DELETE_TABLE_FILTER_BY_ID', - UPDATE_TABLE_FILTER_BY_ID = 'UPDATE_TABLE_FILTER_BY_ID', - - CREATE_UPDATE_TABLE_CATEGORIES = 'CREATE_UPDATE_TABLE_CATEGORIES', - FIND_TABLE_CATEGORIES = 'FIND_TABLE_CATEGORIES', - - CREATE_SECRET = 'CREATE_SECRET', - GET_SECRETS = 'GET_SECRETS', - GET_SECRET_BY_SLUG = 'GET_SECRET_BY_SLUG', - UPDATE_SECRET = 'UPDATE_SECRET', - DELETE_SECRET = 'DELETE_SECRET', - GET_SECRET_AUDIT_LOG = 'GET_SECRET_AUDIT_LOG', - FIND_SIGN_IN_AUDIT_LOGS = 'FIND_SIGN_IN_AUDIT_LOGS', + DELETE_USER_ACCOUNT = "DELETE_USER_ACCOUNT", + FIND_USER = "FIND_USER", + USUAL_LOGIN = "USUAL_LOGIN", + LOG_OUT = "LOG_OUT", + CHANGE_USUAL_PASSWORD = "CHANGE_USUAL_PASSWORD", + VERIFY_EMAIL = "VERIFY_EMAIL", + VERIFY_RESET_USER_PASSWORD = "VERIFY_RESET_USER_PASSWORD", + REQUEST_RESET_USER_PASSWORD = "REQUEST_RESET_USER_PASSWORD", + REQUEST_CHANGE_USER_EMAIL = "REQUEST_CHANGE_USER_EMAIL", + VERIFY_EMAIL_CHANGE = "VERIFY_EMAIL_CHANGE", + VERIFY_EMAIL_REQUEST = "VERIFY_EMAIL_REQUEST", + CHANGE_USER_NAME = "CHANGE_USER_NAME", + GENERATE_OTP = "GENERATE_OTP", + VERIFY_OTP = "VERIFY_OTP", + OTP_LOGIN = "OTP_LOGIN", + DISABLE_OTP = "DISABLE_OTP", + SAVE_USER_SESSION_SETTINGS = "SAVE_USER_SESSION_SETTINGS", + GET_USER_SESSION_SETTINGS = "GET_USER_SESSION_SETTINGS", + TOGGLE_TEST_CONNECTIONS_DISPLAY_MODE = "TOGGLE_TEST_CONNECTIONS_DISPLAY_MODE", + + FIND_CONNECTIONS = "FIND_CONNECTIONS", + FIND_USERS_IN_CONNECTION = "FIND_USERS_IN_CONNECTION", + FIND_CONNECTION = "FIND_CONNECTION", + CREATE_CONNECTION = "CREATE_CONNECTION", + UPDATE_CONNECTION = "UPDATE_CONNECTION", + DELETE_CONNECTION = "DELETE_CONNECTION", + DELETE_GROUP_FROM_CONNECTION = "DELETE_GROUP_FROM_CONNECTION", + CREATE_GROUP_IN_CONNECTION = "CREATE_GROUP_IN_CONNECTION", + GET_USER_GROUPS_IN_CONNECTION = "GET_USER_GROUPS_IN_CONNECTION", + GET_PERMISSIONS_FOR_GROUP_IN_CONNECTION = "GET_PERMISSIONS_FOR_GROUP_IN_CONNECTION", + GET_USER_PERMISSIONS_FOR_GROUP_IN_CONNECTION = "GET_USER_PERMISSIONS_FOR_GROUP_IN_CONNECTION", + TEST_CONNECTION_USE_CASE = "TEST_CONNECTION_USE_CASE", + UPDATE_CONNECTION_MASTER_PASSWORD = "UPDATE_CONNECTION_MASTER_PASSWORD", + RESTORE_CONNECTION = "RESTORE_CONNECTION", + VALIDATE_CONNECTION_TOKEN = "VALIDATE_CONNECTION_TOKEN", + REFRESH_CONNECTION_AGENT_TOKEN = "REFRESH_CONNECTION_AGENT_TOKEN", + VALIDATE_CONNECTION_MASTER_PASSWORD = "VALIDATE_CONNECTION_MASTER_PASSWORD", + UNFREEZE_CONNECTION = "UNFREEZE_CONNECTION", + + FIND_ALL_USER_GROUPS = "FIND_ALL_USER_GROUPS", + INVITE_USER_IN_GROUP = "INVITE_USER_IN_GROUP", + FIND_ALL_USERS_IN_GROUP = "FIND_ALL_USERS_IN_GROUP", + REMOVE_USER_FROM_GROUP = "REMOVE_USER_FROM_GROUP", + DELETE_GROUP = "DELETE_GROUP", + UPDATE_GROUP_TITLE = "UPDATE_GROUP_TITLE", + + FIND_CONNECTION_PROPERTIES = "FIND_CONNECTION_PROPERTIES", + CREATE_CONNECTION_PROPERTIES = "CREATE_CONNECTION_PROPERTIES", + UPDATE_CONNECTION_PROPERTIES = "UPDATE_CONNECTION_PROPERTIES", + DELETE_CONNECTION_PROPERTIES = "DELETE_CONNECTION_PROPERTIES", + + GET_CONVERSIONS = "GET_CONVERSIONS", + + GET_CUSTOM_FIELDS = "GET_CUSTOM_FIELDS", + CREATE_CUSTOM_FIELDS = "CREATE_CUSTOM_FIELDS", + UPDATE_CUSTOM_FIELDS = "UPDATE_CUSTOM_FIELDS", + DELETE_CUSTOM_FIELD = "DELETE_CUSTOM_FIELD", + + CREATE_OR_UPDATE_PERMISSIONS = "CREATE_OR_UPDATE_PERMISSIONS", + + FIND_LOGS = "FIND_LOGS", + EXPORT_LOGS_AS_CSV = "EXPORT_LOGS_AS_CSV", + + FIND_TABLE_SETTINGS = "FIND_TABLE_SETTINGS", + CREATE_TABLE_SETTINGS = "CREATE_TABLE_SETTINGS", + UPDATE_TABLE_SETTINGS = "UPDATE_TABLE_SETTINGS", + DELETE_TABLE_SETTINGS = "DELETE_TABLE_SETTINGS", + + GET_HELLO = "GET_HELLO", + + CREATE_USER_ACTION = "CREATE_USER_ACTION", + + CHECK_USER_LOGS_AND_UPDATE_ACTIONS = "CHECK_USER_LOGS_AND_UPDATE_ACTIONS", + CHECK_USER_ACTIONS_AND_MAIL_USERS = "CHECK_USER_ACTIONS_AND_MAIL_USERS", + + FIND_TABLE_WIDGETS = "FIND_TABLE_WIDGETS", + CREATE_UPDATE_DELETE_TABLE_WIDGETS = "CREATE_UPDATE_DELETE_TABLE_WIDGETS", + + FIND_TABLES_IN_CONNECTION = "FIND_TABLES_IN_CONNECTION", + FIND_TABLES_IN_CONNECTION_V2 = "FIND_TABLES_IN_CONNECTION_V2", + GET_ALL_TABLE_ROWS = "GET_ALL_TABLE_ROWS", + GET_TABLE_STRUCTURE = "GET_TABLE_STRUCTURE", + ADD_ROW_IN_TABLE = "ADD_ROW_IN_TABLE", + UPDATE_ROW_IN_TABLE = "UPDATE_ROW_IN_TABLE", + BULK_UPDATE_ROWS_IN_TABLE = "BULK_UPDATE_ROWS_IN_TABLE", + DELETE_ROW_FROM_TABLE = "DELETE_ROW_FROM_TABLE", + DELETE_ROWS_FROM_TABLE = "DELETE_ROWS_FROM_TABLE", + GET_ROW_BY_PRIMARY_KEY = "GET_ROW_BY_PRIMARY_KEY", + EXPORT_CSV_FROM_TABLE = "EXPORT_CSV_FROM_TABLE", + IMPORT_CSV_TO_TABLE = "IMPORT_CSV_TO_TABLE", + + SAAS_COMPANY_REGISTRATION = "SAAS_COMPANY_REGISTRATION", + SAAS_GET_USER_INFO = "SAAS_GET_USER_INFO", + SAAS_USUAL_REGISTER_USER = "SAAS_USUAL_REGISTER_USER", + SAAS_DEMO_USER_REGISTRATION = "SAAS_DEMO_USER_REGISTRATION", + SAAS_LOGIN_USER_WITH_GOOGLE = "SAAS_LOGIN_USER_WITH_GOOGLE", + SAAS_LOGIN_USER_WITH_GITHUB = "SAAS_LOGIN_USER_WITH_GITHUB", + SAAS_SAAS_GET_USERS_INFOS_BY_EMAIL = "SAAS_SAAS_GET_USERS_INFOS_BY_EMAIL", + SAAS_SUSPEND_USERS = "SAAS_SUSPEND_USERS", + SAAS_SUSPEND_USERS_OVER_LIMIT = "SAAS_SUSPEND_USERS_OVER_LIMIT", + SAAS_GET_COMPANY_INFO_BY_USER_ID = "SAAS_GET_COMPANY_INFO_BY_USER_ID", + SAAS_GET_USERS_COUNT_IN_COMPANY = "SAAS_GET_USERS_COUNT_IN_COMPANY", + FREEZE_CONNECTIONS_IN_COMPANY = "FREEZE_CONNECTIONS_IN_COMPANY", + UNFREEZE_CONNECTIONS_IN_COMPANY = "UNFREEZE_CONNECTIONS_IN_COMPANY", + SAAS_REGISTER_USER_WITH_SAML = "SAAS_REGISTER_USER_WITH_SAML", + + INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP = "INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP", + VERIFY_INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP = "VERIFY_INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP", + CHECK_IS_VERIFICATION_LINK_AVAILABLE = "CHECK_IS_VERIFICATION_LINK_AVAILABLE", + UPDATE_USERS_2FA_STATUS_IN_COMPANY = "UPDATE_USERS_2FA_STATUS_IN_COMPANY", + + GET_USER_COMPANY = "GET_USER_COMPANY", + GET_FULL_USER_COMPANIES_INFO = "GET_FULL_USER_COMPANIES_INFO", + GET_USER_EMAIL_COMPANIES = "GET_USER_EMAIL_COMPANIES", + GET_USERS_IN_COMPANY = "GET_USERS_IN_COMPANY", + GET_COMPANY_NAME = "GET_COMPANY_NAME", + REMOVE_USER_FROM_COMPANY = "REMOVE_USER_FROM_COMPANY", + REVOKE_INVITATION_IN_COMPANY = "REVOKE_INVITATION_IN_COMPANY", + UPDATE_COMPANY_NAME = "UPDATE_COMPANY_NAME", + UPDATE_USERS_COMPANY_ROLES = "UPDATE_USERS_COMPANY_ROLES", + DELETE_COMPANY = "DELETE_COMPANY", + SUSPEND_USERS_IN_COMPANY = "SUSPEND_USERS_IN_COMPANY", + UNSUSPEND_USERS_IN_COMPANY = "UNSUSPEND_USERS_IN_COMPANY", + TOGGLE_TEST_CONNECTIONS_DISPLAY_MODE_IN_COMPANY = "TOGGLE_TEST_CONNECTIONS_DISPLAY_MODE_IN_COMPANY", + UPLOAD_COMPANY_LOGO = "UPLOAD_COMPANY_LOGO", + FIND_COMPANY_LOGO = "FIND_COMPANY_LOGO", + DELETE_COMPANY_LOGO = "DELETE_COMPANY_LOGO", + UPLOAD_COMPANY_FAVICON = "UPLOAD_COMPANY_FAVICON", + FIND_COMPANY_FAVICON = "FIND_COMPANY_FAVICON", + DELETE_COMPANY_FAVICON = "DELETE_COMPANY_FAVICON", + ADD_COMPANY_TAB_TITLE = "ADD_COMPANY_TAB_TITLE", + FIND_COMPANY_TAB_TITLE = "FIND_COMPANY_TAB_TITLE", + DELETE_COMPANY_TAB_TITLE = "DELETE_COMPANY_TAB_TITLE", + GET_COMPANY_WHITE_LABEL_PROPERTIES = "GET_COMPANY_WHITE_LABEL_PROPERTIES", + + CREATE_ACTION_RULES = "CREATE_ACTION_RULES", + FIND_ACTION_RULES_FOR_TABLE = "FIND_ACTION_RULES_FOR_TABLE", + DELETE_ACTION_RULE_IN_TABLE = "DELETE_ACTION_RULE_IN_TABLE", + FIND_ACTION_RULE_BY_ID = "FIND_ACTION_RULE_BY_ID", + UPDATE_ACTION_RULE = "UPDATE_ACTION_RULE", + FIND_ACTION_RULE_CUSTOM_EVENTS = "FIND_ACTION_RULE_CUSTOM_EVENTS", + ACTIVATE_TABLE_ACTIONS_IN_EVENT = "ACTIVATE_TABLE_ACTIONS_IN_EVENT", + + CREATE_API_KEY = "CREATE_API_KEY", + GET_API_KEYS = "GET_API_KEYS", + GET_API_KEY = "GET_API_KEY", + DELETE_API_KEY = "DELETE_API_KEY", + + REQUEST_INFO_FROM_TABLE_WITH_AI_V2 = "REQUEST_INFO_FROM_TABLE_WITH_AI_V2", + REQUEST_AI_SETTINGS_AND_WIDGETS_CREATION = "REQUEST_AI_SETTINGS_AND_WIDGETS_CREATION", + + CREATE_TABLE_FILTERS = "CREATE_TABLE_FILTERS", + FIND_TABLE_FILTERS = "FIND_TABLE_FILTERS", + DELETE_TABLE_FILTERS = "DELETE_TABLE_FILTERS", + FIND_TABLE_FILTER_BY_ID = "FIND_TABLE_FILTER_BY_ID", + DELETE_TABLE_FILTER_BY_ID = "DELETE_TABLE_FILTER_BY_ID", + UPDATE_TABLE_FILTER_BY_ID = "UPDATE_TABLE_FILTER_BY_ID", + + CREATE_UPDATE_TABLE_CATEGORIES = "CREATE_UPDATE_TABLE_CATEGORIES", + FIND_TABLE_CATEGORIES = "FIND_TABLE_CATEGORIES", + + CREATE_SECRET = "CREATE_SECRET", + GET_SECRETS = "GET_SECRETS", + GET_SECRET_BY_SLUG = "GET_SECRET_BY_SLUG", + UPDATE_SECRET = "UPDATE_SECRET", + DELETE_SECRET = "DELETE_SECRET", + GET_SECRET_AUDIT_LOG = "GET_SECRET_AUDIT_LOG", + FIND_SIGN_IN_AUDIT_LOGS = "FIND_SIGN_IN_AUDIT_LOGS", + + GET_S3_FILE_URL = "GET_S3_FILE_URL", + GET_S3_UPLOAD_URL = "GET_S3_UPLOAD_URL", } diff --git a/backend/src/entities/ai/ai-data-entities/types/ai-module-types.ts b/backend/src/entities/ai/ai-data-entities/types/ai-module-types.ts index 3097cfb44..7937e8748 100644 --- a/backend/src/entities/ai/ai-data-entities/types/ai-module-types.ts +++ b/backend/src/entities/ai/ai-data-entities/types/ai-module-types.ts @@ -1,10 +1,10 @@ -import { ForeignKeyDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/foreign-key.ds.js'; -import { PrimaryKeyDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/primary-key.ds.js'; -import { TableStructureDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/table-structure.ds.js'; +import { ForeignKeyDS } from "@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/foreign-key.ds.js"; +import { PrimaryKeyDS } from "@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/primary-key.ds.js"; +import { TableStructureDS } from "@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/table-structure.ds.js"; export type TableInformation = { - table_name: string; - structure: Array; - foreignKeys: Array; - primaryColumns: Array; + table_name: string; + structure: Array; + foreignKeys: Array; + primaryColumns: Array; }; diff --git a/backend/src/entities/ai/ai-use-cases.interface.ts b/backend/src/entities/ai/ai-use-cases.interface.ts index 5df992810..e4f6d084b 100644 --- a/backend/src/entities/ai/ai-use-cases.interface.ts +++ b/backend/src/entities/ai/ai-use-cases.interface.ts @@ -1,11 +1,17 @@ -import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; -import { FindOneConnectionDs } from '../connection/application/data-structures/find-one-connection.ds.js'; -import { RequestInfoFromTableDSV2 } from './application/data-structures/request-info-from-table.ds.js'; +import { InTransactionEnum } from "../../enums/in-transaction.enum.js"; +import { FindOneConnectionDs } from "../connection/application/data-structures/find-one-connection.ds.js"; +import { RequestInfoFromTableDSV2 } from "./application/data-structures/request-info-from-table.ds.js"; export interface IRequestInfoFromTableV2 { - execute(inputData: RequestInfoFromTableDSV2, inTransaction: InTransactionEnum): Promise; + execute( + inputData: RequestInfoFromTableDSV2, + inTransaction: InTransactionEnum, + ): Promise; } export interface IAISettingsAndWidgetsCreation { - execute(connectionData: FindOneConnectionDs, inTransaction: InTransactionEnum): Promise; + execute( + connectionData: FindOneConnectionDs, + inTransaction: InTransactionEnum, + ): Promise; } diff --git a/backend/src/entities/ai/ai.module.ts b/backend/src/entities/ai/ai.module.ts index d3ffe295f..0c3ba74c0 100644 --- a/backend/src/entities/ai/ai.module.ts +++ b/backend/src/entities/ai/ai.module.ts @@ -1,45 +1,51 @@ -import { Global, MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthMiddleware } from '../../authorization/auth.middleware.js'; -import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; -import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; -import { LogOutEntity } from '../log-out/log-out.entity.js'; -import { UserEntity } from '../user/user.entity.js'; -import { AiService } from './ai.service.js'; -import { AmazonBedrockAiProvider } from './amazon-bedrock/amazon-bedrock.ai.provider.js'; -import { RequestInfoFromTableWithAIUseCaseV4 } from './use-cases/request-info-from-table-with-ai-v4.use.case.js'; -import { UserAIRequestsControllerV2 } from './user-ai-requests-v2.controller.js'; -import { RequestAISettingsAndWidgetsCreationUseCase } from './use-cases/request-ai-settings-and-widgets-creation.use.case.js'; +import { + Global, + MiddlewareConsumer, + Module, + NestModule, + RequestMethod, +} from "@nestjs/common"; +import { TypeOrmModule } from "@nestjs/typeorm"; +import { AuthMiddleware } from "../../authorization/auth.middleware.js"; +import { GlobalDatabaseContext } from "../../common/application/global-database-context.js"; +import { BaseType, UseCaseType } from "../../common/data-injection.tokens.js"; +import { LogOutEntity } from "../log-out/log-out.entity.js"; +import { UserEntity } from "../user/user.entity.js"; +import { AiService } from "./ai.service.js"; +import { AmazonBedrockAiProvider } from "./amazon-bedrock/amazon-bedrock.ai.provider.js"; +import { RequestAISettingsAndWidgetsCreationUseCase } from "./use-cases/request-ai-settings-and-widgets-creation.use.case.js"; +import { RequestInfoFromTableWithAIUseCaseV4 } from "./use-cases/request-info-from-table-with-ai-v4.use.case.js"; +import { UserAIRequestsControllerV2 } from "./user-ai-requests-v2.controller.js"; @Global() @Module({ - imports: [TypeOrmModule.forFeature([UserEntity, LogOutEntity])], - providers: [ - { - provide: BaseType.GLOBAL_DB_CONTEXT, - useClass: GlobalDatabaseContext, - }, - { - provide: UseCaseType.REQUEST_INFO_FROM_TABLE_WITH_AI_V2, - useClass: RequestInfoFromTableWithAIUseCaseV4, - }, - { - provide: UseCaseType.REQUEST_AI_SETTINGS_AND_WIDGETS_CREATION, - useClass: RequestAISettingsAndWidgetsCreationUseCase, - }, - AmazonBedrockAiProvider, - AiService, - ], - exports: [AiService, AmazonBedrockAiProvider], - controllers: [UserAIRequestsControllerV2], + imports: [TypeOrmModule.forFeature([UserEntity, LogOutEntity])], + providers: [ + { + provide: BaseType.GLOBAL_DB_CONTEXT, + useClass: GlobalDatabaseContext, + }, + { + provide: UseCaseType.REQUEST_INFO_FROM_TABLE_WITH_AI_V2, + useClass: RequestInfoFromTableWithAIUseCaseV4, + }, + { + provide: UseCaseType.REQUEST_AI_SETTINGS_AND_WIDGETS_CREATION, + useClass: RequestAISettingsAndWidgetsCreationUseCase, + }, + AmazonBedrockAiProvider, + AiService, + ], + exports: [AiService, AmazonBedrockAiProvider], + controllers: [UserAIRequestsControllerV2], }) export class AIModule implements NestModule { - public configure(consumer: MiddlewareConsumer): any { - consumer - .apply(AuthMiddleware) - .forRoutes( - { path: '/ai/v2/request/:connectionId', method: RequestMethod.POST }, - { path: '/ai/v2/setup/:connectionId', method: RequestMethod.GET }, - ); - } + public configure(consumer: MiddlewareConsumer): any { + consumer + .apply(AuthMiddleware) + .forRoutes( + { path: "/ai/v2/request/:connectionId", method: RequestMethod.POST }, + { path: "/ai/v2/setup/:connectionId", method: RequestMethod.GET }, + ); + } } diff --git a/backend/src/entities/ai/ai.service.ts b/backend/src/entities/ai/ai.service.ts index ba1e2b6c5..dd172015c 100644 --- a/backend/src/entities/ai/ai.service.ts +++ b/backend/src/entities/ai/ai.service.ts @@ -1,73 +1,78 @@ -import { Injectable } from '@nestjs/common'; -import { TableSettingsEntity } from '../table-settings/table-settings.entity.js'; -import { TableWidgetEntity } from '../widget/table-widget.entity.js'; -import { TableInformation } from './ai-data-entities/types/ai-module-types.js'; -import { AmazonBedrockAiProvider } from './amazon-bedrock/amazon-bedrock.ai.provider.js'; -import { QueryOrderingEnum } from '../../enums/query-ordering.enum.js'; -import { WidgetTypeEnum } from '../../enums/widget-type.enum.js'; -import { checkFieldAutoincrement } from '../../helpers/check-field-autoincrement.js'; +import { Injectable } from "@nestjs/common"; +import { QueryOrderingEnum } from "../../enums/query-ordering.enum.js"; +import { WidgetTypeEnum } from "../../enums/widget-type.enum.js"; +import { checkFieldAutoincrement } from "../../helpers/check-field-autoincrement.js"; +import { TableSettingsEntity } from "../table-settings/table-settings.entity.js"; +import { TableWidgetEntity } from "../widget/table-widget.entity.js"; +import { TableInformation } from "./ai-data-entities/types/ai-module-types.js"; +import { AmazonBedrockAiProvider } from "./amazon-bedrock/amazon-bedrock.ai.provider.js"; interface AIGeneratedTableSettings { - table_name: string; - display_name: string; - list_fields: string[]; - ordering_field: string | null; - ordering: 'ASC' | 'DESC'; - search_fields: string[]; - readonly_fields: string[]; - columns_view: string[]; - widgets: Array<{ - field_name: string; - widget_type: string; - name: string; - description: string; - }>; + table_name: string; + display_name: string; + list_fields: string[]; + ordering_field: string | null; + ordering: "ASC" | "DESC"; + search_fields: string[]; + readonly_fields: string[]; + columns_view: string[]; + widgets: Array<{ + field_name: string; + widget_type: string; + name: string; + description: string; + }>; } interface AIResponse { - tables: AIGeneratedTableSettings[]; + tables: AIGeneratedTableSettings[]; } @Injectable() export class AiService { - constructor(protected readonly aiProvider: AmazonBedrockAiProvider) {} - - public async generateNewTableSettingsWithAI( - tablesInformation: Array, - ): Promise> { - const prompt = this.buildPrompt(tablesInformation); - const aiResponse = await this.aiProvider.generateResponse(prompt); - const parsedResponse = this.parseAIResponse(aiResponse); - return this.buildTableSettingsEntities(parsedResponse, tablesInformation); - } - - private buildPrompt(tablesInformation: Array): string { - const widgetTypes = Object.values(WidgetTypeEnum).join(', '); - - const tablesDescription = tablesInformation - .map((table) => { - const columns = table.structure - .map( - (col) => - ` - ${col.column_name}: ${col.data_type}${col.allow_null ? ' (nullable)' : ''}${checkFieldAutoincrement(col.column_default, col.extra) ? ' (auto_increment)' : ''}`, - ) - .join('\n'); - const primaryKeys = table.primaryColumns.map((pk) => pk.column_name).join(', '); - const foreignKeys = table.foreignKeys - .map((fk) => ` - ${fk.column_name} -> ${fk.referenced_table_name}.${fk.referenced_column_name}`) - .join('\n'); - - return ` + constructor(protected readonly aiProvider: AmazonBedrockAiProvider) {} + + public async generateNewTableSettingsWithAI( + tablesInformation: Array, + ): Promise> { + const prompt = this.buildPrompt(tablesInformation); + const aiResponse = await this.aiProvider.generateResponse(prompt); + const parsedResponse = this.parseAIResponse(aiResponse); + return this.buildTableSettingsEntities(parsedResponse, tablesInformation); + } + + private buildPrompt(tablesInformation: Array): string { + const widgetTypes = Object.values(WidgetTypeEnum).join(", "); + + const tablesDescription = tablesInformation + .map((table) => { + const columns = table.structure + .map( + (col) => + ` - ${col.column_name}: ${col.data_type}${col.allow_null ? " (nullable)" : ""}${checkFieldAutoincrement(col.column_default, col.extra) ? " (auto_increment)" : ""}`, + ) + .join("\n"); + const primaryKeys = table.primaryColumns + .map((pk) => pk.column_name) + .join(", "); + const foreignKeys = table.foreignKeys + .map( + (fk) => + ` - ${fk.column_name} -> ${fk.referenced_table_name}.${fk.referenced_column_name}`, + ) + .join("\n"); + + return ` Table: ${table.table_name} - Primary Keys: ${primaryKeys || 'none'} + Primary Keys: ${primaryKeys || "none"} Columns: ${columns} Foreign Keys: -${foreignKeys || ' none'}`; - }) - .join('\n\n'); +${foreignKeys || " none"}`; + }) + .join("\n\n"); - return `You are a database administration assistant. Analyze the following database tables and generate optimal settings for displaying and managing them in a web admin panel. + return `You are a database administration assistant. Analyze the following database tables and generate optimal settings for displaying and managing them in a web admin panel. For each table, provide: 1. display_name: A human-readable name for the table @@ -130,89 +135,110 @@ Respond ONLY with valid JSON in this exact format (no markdown, no explanations) } ] }`; - } - - private parseAIResponse(aiResponse: string): AIResponse { - let cleanedResponse = aiResponse.trim(); - if (cleanedResponse.startsWith('```json')) { - cleanedResponse = cleanedResponse.slice(7); - } else if (cleanedResponse.startsWith('```')) { - cleanedResponse = cleanedResponse.slice(3); - } - if (cleanedResponse.endsWith('```')) { - cleanedResponse = cleanedResponse.slice(0, -3); - } - cleanedResponse = cleanedResponse.trim(); - - try { - return JSON.parse(cleanedResponse) as AIResponse; - } catch (error) { - throw new Error(`Failed to parse AI response: ${error.message}`); - } - } - - private buildTableSettingsEntities( - aiResponse: AIResponse, - tablesInformation: Array, - ): Array { - return aiResponse.tables.map((tableSettings) => { - const tableInfo = tablesInformation.find((t) => t.table_name === tableSettings.table_name); - const validColumnNames = tableInfo?.structure.map((col) => col.column_name) || []; - - const settings = new TableSettingsEntity(); - settings.table_name = tableSettings.table_name; - settings.display_name = tableSettings.display_name; - settings.list_fields = this.filterValidColumns(tableSettings.list_fields, validColumnNames); - settings.ordering_field = tableSettings.ordering_field; - settings.ordering = tableSettings.ordering === 'DESC' ? QueryOrderingEnum.DESC : QueryOrderingEnum.ASC; - settings.search_fields = this.filterValidColumns(tableSettings.search_fields, validColumnNames); - settings.readonly_fields = this.filterValidColumns(tableSettings.readonly_fields, validColumnNames); - settings.columns_view = this.filterValidColumns(tableSettings.columns_view, validColumnNames); - settings.table_widgets = tableSettings.widgets - .filter((w) => validColumnNames.includes(w.field_name)) - .map((widgetData) => { - const widget = new TableWidgetEntity(); - widget.field_name = widgetData.field_name; - widget.widget_type = this.mapWidgetType(widgetData.widget_type); - widget.name = widgetData.name; - widget.description = widgetData.description; - return widget; - }); - - return settings; - }); - } - - private filterValidColumns(columns: string[], validColumnNames: string[]): string[] { - return columns?.filter((col) => validColumnNames.includes(col)) || []; - } - - private mapWidgetType(widgetType: string): WidgetTypeEnum | undefined { - const widgetTypeMap = new Map([ - ['Password', WidgetTypeEnum.Password], - ['Boolean', WidgetTypeEnum.Boolean], - ['Date', WidgetTypeEnum.Date], - ['Time', WidgetTypeEnum.Time], - ['DateTime', WidgetTypeEnum.DateTime], - ['JSON', WidgetTypeEnum.JSON], - ['Textarea', WidgetTypeEnum.Textarea], - ['String', WidgetTypeEnum.String], - ['Readonly', WidgetTypeEnum.Readonly], - ['Number', WidgetTypeEnum.Number], - ['Select', WidgetTypeEnum.Select], - ['UUID', WidgetTypeEnum.UUID], - ['Enum', WidgetTypeEnum.Enum], - ['Foreign_key', WidgetTypeEnum.Foreign_key], - ['File', WidgetTypeEnum.File], - ['Image', WidgetTypeEnum.Image], - ['URL', WidgetTypeEnum.URL], - ['Code', WidgetTypeEnum.Code], - ['Phone', WidgetTypeEnum.Phone], - ['Country', WidgetTypeEnum.Country], - ['Color', WidgetTypeEnum.Color], - ['Range', WidgetTypeEnum.Range], - ['Timezone', WidgetTypeEnum.Timezone], - ]); - return widgetTypeMap.get(widgetType); - } + } + + private parseAIResponse(aiResponse: string): AIResponse { + let cleanedResponse = aiResponse.trim(); + if (cleanedResponse.startsWith("```json")) { + cleanedResponse = cleanedResponse.slice(7); + } else if (cleanedResponse.startsWith("```")) { + cleanedResponse = cleanedResponse.slice(3); + } + if (cleanedResponse.endsWith("```")) { + cleanedResponse = cleanedResponse.slice(0, -3); + } + cleanedResponse = cleanedResponse.trim(); + + try { + return JSON.parse(cleanedResponse) as AIResponse; + } catch (error) { + throw new Error(`Failed to parse AI response: ${error.message}`); + } + } + + private buildTableSettingsEntities( + aiResponse: AIResponse, + tablesInformation: Array, + ): Array { + return aiResponse.tables.map((tableSettings) => { + const tableInfo = tablesInformation.find( + (t) => t.table_name === tableSettings.table_name, + ); + const validColumnNames = + tableInfo?.structure.map((col) => col.column_name) || []; + + const settings = new TableSettingsEntity(); + settings.table_name = tableSettings.table_name; + settings.display_name = tableSettings.display_name; + settings.list_fields = this.filterValidColumns( + tableSettings.list_fields, + validColumnNames, + ); + settings.ordering_field = tableSettings.ordering_field; + settings.ordering = + tableSettings.ordering === "DESC" + ? QueryOrderingEnum.DESC + : QueryOrderingEnum.ASC; + settings.search_fields = this.filterValidColumns( + tableSettings.search_fields, + validColumnNames, + ); + settings.readonly_fields = this.filterValidColumns( + tableSettings.readonly_fields, + validColumnNames, + ); + settings.columns_view = this.filterValidColumns( + tableSettings.columns_view, + validColumnNames, + ); + settings.table_widgets = tableSettings.widgets + .filter((w) => validColumnNames.includes(w.field_name)) + .map((widgetData) => { + const widget = new TableWidgetEntity(); + widget.field_name = widgetData.field_name; + widget.widget_type = this.mapWidgetType(widgetData.widget_type); + widget.name = widgetData.name; + widget.description = widgetData.description; + return widget; + }); + + return settings; + }); + } + + private filterValidColumns( + columns: string[], + validColumnNames: string[], + ): string[] { + return columns?.filter((col) => validColumnNames.includes(col)) || []; + } + + private mapWidgetType(widgetType: string): WidgetTypeEnum | undefined { + const widgetTypeMap = new Map([ + ["Password", WidgetTypeEnum.Password], + ["Boolean", WidgetTypeEnum.Boolean], + ["Date", WidgetTypeEnum.Date], + ["Time", WidgetTypeEnum.Time], + ["DateTime", WidgetTypeEnum.DateTime], + ["JSON", WidgetTypeEnum.JSON], + ["Textarea", WidgetTypeEnum.Textarea], + ["String", WidgetTypeEnum.String], + ["Readonly", WidgetTypeEnum.Readonly], + ["Number", WidgetTypeEnum.Number], + ["Select", WidgetTypeEnum.Select], + ["UUID", WidgetTypeEnum.UUID], + ["Enum", WidgetTypeEnum.Enum], + ["Foreign_key", WidgetTypeEnum.Foreign_key], + ["File", WidgetTypeEnum.File], + ["Image", WidgetTypeEnum.Image], + ["URL", WidgetTypeEnum.URL], + ["Code", WidgetTypeEnum.Code], + ["Phone", WidgetTypeEnum.Phone], + ["Country", WidgetTypeEnum.Country], + ["Color", WidgetTypeEnum.Color], + ["Range", WidgetTypeEnum.Range], + ["Timezone", WidgetTypeEnum.Timezone], + ]); + return widgetTypeMap.get(widgetType); + } } diff --git a/backend/src/entities/ai/amazon-bedrock/ai-provider.interface.ts b/backend/src/entities/ai/amazon-bedrock/ai-provider.interface.ts index bfe99ab16..e562b1838 100644 --- a/backend/src/entities/ai/amazon-bedrock/ai-provider.interface.ts +++ b/backend/src/entities/ai/amazon-bedrock/ai-provider.interface.ts @@ -1,3 +1,3 @@ export interface IAIProvider { - generateResponse(prompt: string): Promise; + generateResponse(prompt: string): Promise; } diff --git a/backend/src/entities/ai/use-cases/request-ai-settings-and-widgets-creation.use.case.ts b/backend/src/entities/ai/use-cases/request-ai-settings-and-widgets-creation.use.case.ts index 4c8055205..8826e600c 100644 --- a/backend/src/entities/ai/use-cases/request-ai-settings-and-widgets-creation.use.case.ts +++ b/backend/src/entities/ai/use-cases/request-ai-settings-and-widgets-creation.use.case.ts @@ -1,33 +1,41 @@ -import { BadRequestException, Inject, Injectable, Scope } from '@nestjs/common'; -import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; -import { BaseType } from '../../../common/data-injection.tokens.js'; -import AbstractUseCase from '../../../common/abstract-use.case.js'; -import { IAISettingsAndWidgetsCreation } from '../ai-use-cases.interface.js'; -import { SharedJobsService } from '../../shared-jobs/shared-jobs.service.js'; -import { FindOneConnectionDs } from '../../connection/application/data-structures/find-one-connection.ds.js'; -import { Messages } from '../../../exceptions/text/messages.js'; +import { BadRequestException, Inject, Injectable, Scope } from "@nestjs/common"; +import AbstractUseCase from "../../../common/abstract-use.case.js"; +import { IGlobalDatabaseContext } from "../../../common/application/global-database-context.interface.js"; +import { BaseType } from "../../../common/data-injection.tokens.js"; +import { Messages } from "../../../exceptions/text/messages.js"; +import { FindOneConnectionDs } from "../../connection/application/data-structures/find-one-connection.ds.js"; +import { SharedJobsService } from "../../shared-jobs/shared-jobs.service.js"; +import { IAISettingsAndWidgetsCreation } from "../ai-use-cases.interface.js"; @Injectable({ scope: Scope.REQUEST }) export class RequestAISettingsAndWidgetsCreationUseCase - extends AbstractUseCase - implements IAISettingsAndWidgetsCreation + extends AbstractUseCase + implements IAISettingsAndWidgetsCreation { - constructor( - @Inject(BaseType.GLOBAL_DB_CONTEXT) - protected _dbContext: IGlobalDatabaseContext, - private readonly sharedJobsService: SharedJobsService, - ) { - super(); - } + constructor( + @Inject(BaseType.GLOBAL_DB_CONTEXT) + protected _dbContext: IGlobalDatabaseContext, + private readonly sharedJobsService: SharedJobsService, + ) { + super(); + } - public async implementation(connectionData: FindOneConnectionDs): Promise { - const { connectionId, masterPwd } = connectionData; + public async implementation( + connectionData: FindOneConnectionDs, + ): Promise { + const { connectionId, masterPwd } = connectionData; - const connection = await this._dbContext.connectionRepository.findAndDecryptConnection(connectionId, masterPwd); - if (!connection) { - throw new BadRequestException(Messages.CONNECTION_NOT_FOUND); - } + const connection = + await this._dbContext.connectionRepository.findAndDecryptConnection( + connectionId, + masterPwd, + ); + if (!connection) { + throw new BadRequestException(Messages.CONNECTION_NOT_FOUND); + } - await this.sharedJobsService.scanDatabaseAndCreateSettingsAndWidgetsWithAI(connection); - } + await this.sharedJobsService.scanDatabaseAndCreateSettingsAndWidgetsWithAI( + connection, + ); + } } diff --git a/backend/src/entities/ai/user-ai-requests-v2.controller.ts b/backend/src/entities/ai/user-ai-requests-v2.controller.ts index d63da3f9e..7e5ffce6e 100644 --- a/backend/src/entities/ai/user-ai-requests-v2.controller.ts +++ b/backend/src/entities/ai/user-ai-requests-v2.controller.ts @@ -1,98 +1,122 @@ import { - Body, - Controller, - Get, - Inject, - Injectable, - Post, - Query, - Res, - UseGuards, - UseInterceptors, -} from '@nestjs/common'; -import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; -import { Response } from 'express'; -import { UseCaseType } from '../../common/data-injection.tokens.js'; -import { MasterPassword } from '../../decorators/master-password.decorator.js'; -import { QueryTableName } from '../../decorators/query-table-name.decorator.js'; -import { SlugUuid } from '../../decorators/slug-uuid.decorator.js'; -import { UserId } from '../../decorators/user-id.decorator.js'; -import { InTransactionEnum } from '../../enums/in-transaction.enum.js'; -import { TableReadGuard } from '../../guards/table-read.guard.js'; -import { ValidationHelper } from '../../helpers/validators/validation-helper.js'; -import { SentryInterceptor } from '../../interceptors/sentry.interceptor.js'; -import { IAISettingsAndWidgetsCreation, IRequestInfoFromTableV2 } from './ai-use-cases.interface.js'; -import { RequestInfoFromTableDSV2 } from './application/data-structures/request-info-from-table.ds.js'; -import { RequestInfoFromTableBodyDTO } from './application/dto/request-info-from-table-body.dto.js'; -import { ConnectionEditGuard } from '../../guards/connection-edit.guard.js'; + Body, + Controller, + Get, + Inject, + Injectable, + Post, + Query, + Res, + UseGuards, + UseInterceptors, +} from "@nestjs/common"; +import { + ApiBearerAuth, + ApiBody, + ApiOperation, + ApiQuery, + ApiResponse, + ApiTags, +} from "@nestjs/swagger"; +import { Response } from "express"; +import { UseCaseType } from "../../common/data-injection.tokens.js"; +import { MasterPassword } from "../../decorators/master-password.decorator.js"; +import { QueryTableName } from "../../decorators/query-table-name.decorator.js"; +import { SlugUuid } from "../../decorators/slug-uuid.decorator.js"; +import { UserId } from "../../decorators/user-id.decorator.js"; +import { InTransactionEnum } from "../../enums/in-transaction.enum.js"; +import { ConnectionEditGuard } from "../../guards/connection-edit.guard.js"; +import { TableReadGuard } from "../../guards/table-read.guard.js"; +import { ValidationHelper } from "../../helpers/validators/validation-helper.js"; +import { SentryInterceptor } from "../../interceptors/sentry.interceptor.js"; +import { + IAISettingsAndWidgetsCreation, + IRequestInfoFromTableV2, +} from "./ai-use-cases.interface.js"; +import { RequestInfoFromTableDSV2 } from "./application/data-structures/request-info-from-table.ds.js"; +import { RequestInfoFromTableBodyDTO } from "./application/dto/request-info-from-table-body.dto.js"; @UseInterceptors(SentryInterceptor) @Controller() @ApiBearerAuth() -@ApiTags('ai v2') +@ApiTags("ai v2") @Injectable() export class UserAIRequestsControllerV2 { - constructor( - @Inject(UseCaseType.REQUEST_INFO_FROM_TABLE_WITH_AI_V2) - private readonly requestInfoFromTableWithAIUseCase: IRequestInfoFromTableV2, - @Inject(UseCaseType.REQUEST_AI_SETTINGS_AND_WIDGETS_CREATION) - private readonly requestAISettingsAndWidgetsCreationUseCase: IAISettingsAndWidgetsCreation, - ) {} + constructor( + @Inject(UseCaseType.REQUEST_INFO_FROM_TABLE_WITH_AI_V2) + private readonly requestInfoFromTableWithAIUseCase: IRequestInfoFromTableV2, + @Inject(UseCaseType.REQUEST_AI_SETTINGS_AND_WIDGETS_CREATION) + private readonly requestAISettingsAndWidgetsCreationUseCase: IAISettingsAndWidgetsCreation, + ) {} - @ApiOperation({ summary: 'Request info from table in connection with AI (Version 2)' }) - @ApiResponse({ - status: 201, - description: 'Returned info.', - }) - @UseGuards(TableReadGuard) - @ApiBody({ type: RequestInfoFromTableBodyDTO }) - @ApiQuery({ name: 'tableName', required: true, type: String }) - @ApiQuery({ name: 'threadId', required: false, type: String }) - @Post('/ai/v2/request/:connectionId') - public async requestInfoFromTableWithAI( - @SlugUuid('connectionId') connectionId: string, - @Query('threadId') threadId: string, - @QueryTableName() tableName: string, - @MasterPassword() masterPassword: string, - @UserId() userId: string, - @Body() requestData: RequestInfoFromTableBodyDTO, - @Res({ passthrough: true }) response: Response, - ): Promise { - if (threadId) { - if (!ValidationHelper.isValidUUID(threadId)) { - response.status(400).send({ error: 'Invalid threadId format. It should be a valid UUID.' }); - return; - } - } - const inputData: RequestInfoFromTableDSV2 = { - connectionId, - tableName, - user_message: requestData.user_message, - master_password: masterPassword, - user_id: userId, - response, - ai_thread_id: threadId || null, - }; - return await this.requestInfoFromTableWithAIUseCase.execute(inputData, InTransactionEnum.OFF); - } + @ApiOperation({ + summary: "Request info from table in connection with AI (Version 2)", + }) + @ApiResponse({ + status: 201, + description: "Returned info.", + }) + @UseGuards(TableReadGuard) + @ApiBody({ type: RequestInfoFromTableBodyDTO }) + @ApiQuery({ name: "tableName", required: true, type: String }) + @ApiQuery({ name: "threadId", required: false, type: String }) + @Post("/ai/v2/request/:connectionId") + public async requestInfoFromTableWithAI( + @SlugUuid("connectionId") connectionId: string, + @Query("threadId") threadId: string, + @QueryTableName() tableName: string, + @MasterPassword() masterPassword: string, + @UserId() userId: string, + @Body() requestData: RequestInfoFromTableBodyDTO, + @Res({ passthrough: true }) response: Response, + ): Promise { + if (threadId) { + if (!ValidationHelper.isValidUUID(threadId)) { + response + .status(400) + .send({ + error: "Invalid threadId format. It should be a valid UUID.", + }); + return; + } + } + const inputData: RequestInfoFromTableDSV2 = { + connectionId, + tableName, + user_message: requestData.user_message, + master_password: masterPassword, + user_id: userId, + response, + ai_thread_id: threadId || null, + }; + return await this.requestInfoFromTableWithAIUseCase.execute( + inputData, + InTransactionEnum.OFF, + ); + } - @ApiOperation({ summary: 'Request AI settings and widgets creation for connection' }) - @ApiResponse({ - status: 200, - description: 'AI settings and widgets creation job has been queued.', - }) - @UseGuards(ConnectionEditGuard) - @Get('/ai/v2/setup/:connectionId') - public async requestAISettingsAndWidgetsCreation( - @SlugUuid('connectionId') connectionId: string, - @MasterPassword() masterPassword: string, - @UserId() userId: string, - ): Promise { - const connectionData = { - connectionId, - masterPwd: masterPassword, - cognitoUserName: userId, - }; - return await this.requestAISettingsAndWidgetsCreationUseCase.execute(connectionData, InTransactionEnum.OFF); - } + @ApiOperation({ + summary: "Request AI settings and widgets creation for connection", + }) + @ApiResponse({ + status: 200, + description: "AI settings and widgets creation job has been queued.", + }) + @UseGuards(ConnectionEditGuard) + @Get("/ai/v2/setup/:connectionId") + public async requestAISettingsAndWidgetsCreation( + @SlugUuid("connectionId") connectionId: string, + @MasterPassword() masterPassword: string, + @UserId() userId: string, + ): Promise { + const connectionData = { + connectionId, + masterPwd: masterPassword, + cognitoUserName: userId, + }; + return await this.requestAISettingsAndWidgetsCreationUseCase.execute( + connectionData, + InTransactionEnum.OFF, + ); + } } diff --git a/backend/src/entities/connection/use-cases/create-connection.use.case.ts b/backend/src/entities/connection/use-cases/create-connection.use.case.ts index 747dc9791..1cbe4d1b3 100644 --- a/backend/src/entities/connection/use-cases/create-connection.use.case.ts +++ b/backend/src/entities/connection/use-cases/create-connection.use.case.ts @@ -1,121 +1,183 @@ -import { BadRequestException, Inject, Injectable, InternalServerErrorException, Scope } from '@nestjs/common'; -import { getDataAccessObject } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/create-data-access-object.js'; -import AbstractUseCase from '../../../common/abstract-use.case.js'; -import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; -import { BaseType } from '../../../common/data-injection.tokens.js'; -import { Messages } from '../../../exceptions/text/messages.js'; -import { isConnectionTypeAgent, slackPostMessage } from '../../../helpers/index.js'; -import { UserRoleEnum } from '../../user/enums/user-role.enum.js'; -import { UserEntity } from '../../user/user.entity.js'; -import { CreateConnectionDs } from '../application/data-structures/create-connection.ds.js'; -import { CreatedConnectionDTO } from '../application/dto/created-connection.dto.js'; -import { ConnectionEntity } from '../connection.entity.js'; -import { buildConnectionEntity } from '../utils/build-connection-entity.js'; -import { buildCreatedConnectionDs } from '../utils/build-created-connection.ds.js'; -import { processAWSConnection } from '../utils/process-aws-connection.util.js'; -import { validateCreateConnectionData } from '../utils/validate-create-connection-data.js'; -import { ICreateConnection } from './use-cases.interfaces.js'; -import { SharedJobsService } from '../../shared-jobs/shared-jobs.service.js'; -import { Encryptor } from '../../../helpers/encryption/encryptor.js'; +import { + BadRequestException, + Inject, + Injectable, + InternalServerErrorException, + Scope, +} from "@nestjs/common"; +import { getDataAccessObject } from "@rocketadmin/shared-code/dist/src/data-access-layer/shared/create-data-access-object.js"; +import AbstractUseCase from "../../../common/abstract-use.case.js"; +import { IGlobalDatabaseContext } from "../../../common/application/global-database-context.interface.js"; +import { BaseType } from "../../../common/data-injection.tokens.js"; +import { Messages } from "../../../exceptions/text/messages.js"; +import { Encryptor } from "../../../helpers/encryption/encryptor.js"; +import { + isConnectionTypeAgent, + slackPostMessage, +} from "../../../helpers/index.js"; +import { SharedJobsService } from "../../shared-jobs/shared-jobs.service.js"; +import { UserRoleEnum } from "../../user/enums/user-role.enum.js"; +import { UserEntity } from "../../user/user.entity.js"; +import { CreateConnectionDs } from "../application/data-structures/create-connection.ds.js"; +import { CreatedConnectionDTO } from "../application/dto/created-connection.dto.js"; +import { ConnectionEntity } from "../connection.entity.js"; +import { buildConnectionEntity } from "../utils/build-connection-entity.js"; +import { buildCreatedConnectionDs } from "../utils/build-created-connection.ds.js"; +import { processAWSConnection } from "../utils/process-aws-connection.util.js"; +import { validateCreateConnectionData } from "../utils/validate-create-connection-data.js"; +import { ICreateConnection } from "./use-cases.interfaces.js"; @Injectable({ scope: Scope.REQUEST }) export class CreateConnectionUseCase - extends AbstractUseCase - implements ICreateConnection + extends AbstractUseCase + implements ICreateConnection { - constructor( - @Inject(BaseType.GLOBAL_DB_CONTEXT) - protected _dbContext: IGlobalDatabaseContext, - private readonly sharedJobsService: SharedJobsService, - ) { - super(); - } - protected async implementation(createConnectionData: CreateConnectionDs): Promise { - const { - creation_info: { authorId, masterPwd }, - } = createConnectionData; - const connectionAuthor: UserEntity = await this._dbContext.userRepository.findOneUserById(authorId); + constructor( + @Inject(BaseType.GLOBAL_DB_CONTEXT) + protected _dbContext: IGlobalDatabaseContext, + private readonly sharedJobsService: SharedJobsService, + ) { + super(); + } + protected async implementation( + createConnectionData: CreateConnectionDs, + ): Promise { + const { + creation_info: { authorId, masterPwd }, + } = createConnectionData; + const connectionAuthor: UserEntity = + await this._dbContext.userRepository.findOneUserById(authorId); - if (!connectionAuthor) { - throw new InternalServerErrorException(Messages.USER_NOT_FOUND); - } + if (!connectionAuthor) { + throw new InternalServerErrorException(Messages.USER_NOT_FOUND); + } - if (connectionAuthor.role !== UserRoleEnum.ADMIN && connectionAuthor.role !== UserRoleEnum.DB_ADMIN) { - throw new BadRequestException(Messages.CANT_CREATE_CONNECTION_USER_NON_COMPANY_ADMIN); - } + if ( + connectionAuthor.role !== UserRoleEnum.ADMIN && + connectionAuthor.role !== UserRoleEnum.DB_ADMIN + ) { + throw new BadRequestException( + Messages.CANT_CREATE_CONNECTION_USER_NON_COMPANY_ADMIN, + ); + } - await slackPostMessage( - Messages.USER_TRY_CREATE_CONNECTION(connectionAuthor.email, createConnectionData.connection_parameters.type), - ); - await validateCreateConnectionData(createConnectionData); + await slackPostMessage( + Messages.USER_TRY_CREATE_CONNECTION( + connectionAuthor.email, + createConnectionData.connection_parameters.type, + ), + ); + await validateCreateConnectionData(createConnectionData); - createConnectionData = await processAWSConnection(createConnectionData); - let isConnectionTestedSuccessfully: boolean = false; - if (!isConnectionTypeAgent(createConnectionData.connection_parameters.type)) { - const connectionParamsCopy = { ...createConnectionData.connection_parameters }; - const dao = getDataAccessObject(connectionParamsCopy); - try { - const testResult = await dao.testConnect(); - isConnectionTestedSuccessfully = testResult.result; - } catch (e) { - const text: string = e.message.toLowerCase(); - isConnectionTestedSuccessfully = false; - if (text.includes('ssl required') || text.includes('ssl connection required')) { - createConnectionData.connection_parameters.ssl = true; - connectionParamsCopy.ssl = true; - try { - const updatedDao = getDataAccessObject(connectionParamsCopy); - const sslTestResult = await updatedDao.testConnect(); - isConnectionTestedSuccessfully = sslTestResult.result; - } catch (_e) { - isConnectionTestedSuccessfully = false; - createConnectionData.connection_parameters.ssl = false; - connectionParamsCopy.ssl = false; - } - } - } - } - let connectionCopy: ConnectionEntity = null; - try { - const createdConnection: ConnectionEntity = await buildConnectionEntity(createConnectionData, connectionAuthor); - const savedConnection: ConnectionEntity = - await this._dbContext.connectionRepository.saveNewConnection(createdConnection); + createConnectionData = await processAWSConnection(createConnectionData); + let isConnectionTestedSuccessfully: boolean = false; + if ( + !isConnectionTypeAgent(createConnectionData.connection_parameters.type) + ) { + const connectionParamsCopy = { + ...createConnectionData.connection_parameters, + }; + const dao = getDataAccessObject(connectionParamsCopy); + try { + const testResult = await dao.testConnect(); + isConnectionTestedSuccessfully = testResult.result; + } catch (e) { + const text: string = e.message.toLowerCase(); + isConnectionTestedSuccessfully = false; + if ( + text.includes("ssl required") || + text.includes("ssl connection required") + ) { + createConnectionData.connection_parameters.ssl = true; + connectionParamsCopy.ssl = true; + try { + const updatedDao = getDataAccessObject(connectionParamsCopy); + const sslTestResult = await updatedDao.testConnect(); + isConnectionTestedSuccessfully = sslTestResult.result; + } catch (_e) { + isConnectionTestedSuccessfully = false; + createConnectionData.connection_parameters.ssl = false; + connectionParamsCopy.ssl = false; + } + } + } + } + let connectionCopy: ConnectionEntity = null; + try { + const createdConnection: ConnectionEntity = await buildConnectionEntity( + createConnectionData, + connectionAuthor, + ); + const savedConnection: ConnectionEntity = + await this._dbContext.connectionRepository.saveNewConnection( + createdConnection, + ); - connectionCopy = { ...savedConnection } as ConnectionEntity; - if (savedConnection.masterEncryption && masterPwd && !isConnectionTypeAgent(savedConnection.type)) { - connectionCopy = Encryptor.decryptConnectionCredentials(connectionCopy, masterPwd); - } + connectionCopy = { ...savedConnection } as ConnectionEntity; + if ( + savedConnection.masterEncryption && + masterPwd && + !isConnectionTypeAgent(savedConnection.type) + ) { + connectionCopy = Encryptor.decryptConnectionCredentials( + connectionCopy, + masterPwd, + ); + } - let token: string; - if (isConnectionTypeAgent(savedConnection.type)) { - token = await this._dbContext.agentRepository.createNewAgentForConnectionAndReturnToken(savedConnection); - } - const createdAdminGroup = await this._dbContext.groupRepository.createdAdminGroupInConnection( - savedConnection, - connectionAuthor, - ); - await this._dbContext.permissionRepository.createdDefaultAdminPermissionsInGroup(createdAdminGroup); - delete createdAdminGroup.connection; - await this._dbContext.userRepository.saveUserEntity(connectionAuthor); - createdConnection.groups = [createdAdminGroup]; - const foundUserCompany = await this._dbContext.companyInfoRepository.findOneCompanyInfoByUserIdWithConnections( - connectionAuthor.id, - ); - if (foundUserCompany) { - const connection = await this._dbContext.connectionRepository.findOne({ where: { id: savedConnection.id } }); - connection.company = foundUserCompany; - await this._dbContext.connectionRepository.saveUpdatedConnection(connection); - } - await slackPostMessage( - Messages.USER_CREATED_CONNECTION(connectionAuthor.email, createConnectionData.connection_parameters.type), - ); - const connectionRO = buildCreatedConnectionDs(savedConnection, token, masterPwd); - return connectionRO; - } finally { - if (isConnectionTestedSuccessfully && !isConnectionTypeAgent(connectionCopy.type)) { - // await this.sharedJobsService.scanDatabaseAndCreateWidgets(connectionCopy); - await this.sharedJobsService.scanDatabaseAndCreateSettingsAndWidgetsWithAI(connectionCopy); - } - } - } + let token: string; + if (isConnectionTypeAgent(savedConnection.type)) { + token = + await this._dbContext.agentRepository.createNewAgentForConnectionAndReturnToken( + savedConnection, + ); + } + const createdAdminGroup = + await this._dbContext.groupRepository.createdAdminGroupInConnection( + savedConnection, + connectionAuthor, + ); + await this._dbContext.permissionRepository.createdDefaultAdminPermissionsInGroup( + createdAdminGroup, + ); + delete createdAdminGroup.connection; + await this._dbContext.userRepository.saveUserEntity(connectionAuthor); + createdConnection.groups = [createdAdminGroup]; + const foundUserCompany = + await this._dbContext.companyInfoRepository.findOneCompanyInfoByUserIdWithConnections( + connectionAuthor.id, + ); + if (foundUserCompany) { + const connection = await this._dbContext.connectionRepository.findOne({ + where: { id: savedConnection.id }, + }); + connection.company = foundUserCompany; + await this._dbContext.connectionRepository.saveUpdatedConnection( + connection, + ); + } + await slackPostMessage( + Messages.USER_CREATED_CONNECTION( + connectionAuthor.email, + createConnectionData.connection_parameters.type, + ), + ); + const connectionRO = buildCreatedConnectionDs( + savedConnection, + token, + masterPwd, + ); + return connectionRO; + } finally { + if ( + isConnectionTestedSuccessfully && + !isConnectionTypeAgent(connectionCopy.type) + ) { + // await this.sharedJobsService.scanDatabaseAndCreateWidgets(connectionCopy); + await this.sharedJobsService.scanDatabaseAndCreateSettingsAndWidgetsWithAI( + connectionCopy, + ); + } + } + } } diff --git a/backend/src/entities/s3-widget/application/data-structures/s3-operation.ds.ts b/backend/src/entities/s3-widget/application/data-structures/s3-operation.ds.ts new file mode 100644 index 000000000..719f495d9 --- /dev/null +++ b/backend/src/entities/s3-widget/application/data-structures/s3-operation.ds.ts @@ -0,0 +1,30 @@ +export class S3GetFileUrlDs { + connectionId: string; + tableName: string; + fieldName: string; + rowPrimaryKey: Record; + userId: string; + masterPwd: string; +} + +export class S3GetUploadUrlDs { + connectionId: string; + tableName: string; + fieldName: string; + userId: string; + masterPwd: string; + filename: string; + contentType: string; +} + +export class S3FileUrlResponseDs { + url: string; + key: string; + expiresIn: number; +} + +export class S3UploadUrlResponseDs { + uploadUrl: string; + key: string; + expiresIn: number; +} diff --git a/backend/src/entities/s3-widget/application/data-structures/s3-widget-params.ds.ts b/backend/src/entities/s3-widget/application/data-structures/s3-widget-params.ds.ts new file mode 100644 index 000000000..254c66da6 --- /dev/null +++ b/backend/src/entities/s3-widget/application/data-structures/s3-widget-params.ds.ts @@ -0,0 +1,7 @@ +export interface S3WidgetParams { + bucket: string; + prefix?: string; + region?: string; + aws_access_key_id_secret_name: string; + aws_secret_access_key_secret_name: string; +} diff --git a/backend/src/entities/s3-widget/s3-helper.service.ts b/backend/src/entities/s3-widget/s3-helper.service.ts new file mode 100644 index 000000000..0c7ed711f --- /dev/null +++ b/backend/src/entities/s3-widget/s3-helper.service.ts @@ -0,0 +1,51 @@ +import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3'; +import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class S3HelperService { + public createS3Client(accessKeyId: string, secretAccessKey: string, region: string = 'us-east-1'): S3Client { + return new S3Client({ + region, + credentials: { + accessKeyId, + secretAccessKey, + }, + }); + } + + public async getSignedGetUrl( + client: S3Client, + bucket: string, + key: string, + expiresIn: number = 3600, + ): Promise { + const command = new GetObjectCommand({ Bucket: bucket, Key: key }); + return getSignedUrl(client, command, { expiresIn }); + } + + public async getSignedPutUrl( + client: S3Client, + bucket: string, + key: string, + contentType: string, + expiresIn: number = 3600, + ): Promise { + const command = new PutObjectCommand({ + Bucket: bucket, + Key: key, + ContentType: contentType, + }); + return getSignedUrl(client, command, { expiresIn }); + } + + public generateFileKey(prefix: string | undefined, filename: string): string { + const timestamp = Date.now(); + const sanitizedFilename = filename.replace(/[^a-zA-Z0-9._-]/g, '_'); + if (prefix) { + const normalizedPrefix = prefix.replace(/\/$/, ''); + return `${normalizedPrefix}/${timestamp}_${sanitizedFilename}`; + } + return `${timestamp}_${sanitizedFilename}`; + } +} diff --git a/backend/src/entities/s3-widget/s3-widget.controller.ts b/backend/src/entities/s3-widget/s3-widget.controller.ts new file mode 100644 index 000000000..c1549968e --- /dev/null +++ b/backend/src/entities/s3-widget/s3-widget.controller.ts @@ -0,0 +1,187 @@ +import { + Body, + Controller, + Get, + HttpStatus, + Inject, + Injectable, + Post, + Query, + UseGuards, + UseInterceptors, +} from "@nestjs/common"; +import { HttpException } from "@nestjs/common/exceptions/http.exception.js"; +import { + ApiBearerAuth, + ApiBody, + ApiOperation, + ApiQuery, + ApiResponse, + ApiTags, +} from "@nestjs/swagger"; +import { UseCaseType } from "../../common/data-injection.tokens.js"; +import { + MasterPassword, + QueryTableName, + SlugUuid, + UserId, +} from "../../decorators/index.js"; +import { InTransactionEnum } from "../../enums/index.js"; +import { Messages } from "../../exceptions/text/messages.js"; +import { + ConnectionEditGuard, + ConnectionReadGuard, +} from "../../guards/index.js"; +import { SentryInterceptor } from "../../interceptors/index.js"; +import { + S3FileUrlResponseDs, + S3UploadUrlResponseDs, +} from "./application/data-structures/s3-operation.ds.js"; +import { + IGetS3FileUrl, + IGetS3UploadUrl, +} from "./use-cases/s3-use-cases.interface.js"; + +@UseInterceptors(SentryInterceptor) +@Controller() +@ApiBearerAuth() +@ApiTags("S3 Widget") +@Injectable() +export class S3WidgetController { + constructor( + @Inject(UseCaseType.GET_S3_FILE_URL) + private readonly getS3FileUrlUseCase: IGetS3FileUrl, + @Inject(UseCaseType.GET_S3_UPLOAD_URL) + private readonly getS3UploadUrlUseCase: IGetS3UploadUrl, + ) {} + + @UseGuards(ConnectionReadGuard) + @ApiOperation({ summary: "Get pre-signed URL for S3 file download" }) + @ApiResponse({ + status: 200, + description: "Pre-signed URL generated successfully.", + }) + @ApiQuery({ name: "tableName", required: true }) + @ApiQuery({ name: "fieldName", required: true }) + @ApiQuery({ + name: "rowPrimaryKey", + required: true, + description: "JSON-encoded primary key object", + }) + @Get("/s3/file/:connectionId") + async getFileUrl( + @SlugUuid("connectionId") connectionId: string, + @UserId() userId: string, + @MasterPassword() masterPwd: string, + @QueryTableName() tableName: string, + @Query("fieldName") fieldName: string, + @Query("rowPrimaryKey") rowPrimaryKeyStr: string, + ): Promise { + if (!connectionId) { + throw new HttpException( + { message: Messages.CONNECTION_ID_MISSING }, + HttpStatus.BAD_REQUEST, + ); + } + if (!fieldName) { + throw new HttpException( + { message: "Field name is required" }, + HttpStatus.BAD_REQUEST, + ); + } + if (!rowPrimaryKeyStr) { + throw new HttpException( + { message: "Row primary key is required" }, + HttpStatus.BAD_REQUEST, + ); + } + + let rowPrimaryKey: Record; + try { + rowPrimaryKey = JSON.parse(rowPrimaryKeyStr); + } catch { + throw new HttpException( + { message: "Invalid row primary key format" }, + HttpStatus.BAD_REQUEST, + ); + } + + return await this.getS3FileUrlUseCase.execute( + { + connectionId, + tableName, + fieldName, + rowPrimaryKey, + userId, + masterPwd, + }, + InTransactionEnum.OFF, + ); + } + + @UseGuards(ConnectionEditGuard) + @ApiOperation({ summary: "Get pre-signed URL for S3 file upload" }) + @ApiResponse({ + status: 201, + description: "Pre-signed upload URL generated successfully.", + }) + @ApiQuery({ name: "tableName", required: true }) + @ApiQuery({ name: "fieldName", required: true }) + @ApiBody({ + schema: { + type: "object", + properties: { + filename: { type: "string", description: "Name of the file to upload" }, + contentType: { type: "string", description: "MIME type of the file" }, + }, + required: ["filename", "contentType"], + }, + }) + @Post("/s3/upload-url/:connectionId") + async getUploadUrl( + @SlugUuid("connectionId") connectionId: string, + @UserId() userId: string, + @MasterPassword() masterPwd: string, + @QueryTableName() tableName: string, + @Query("fieldName") fieldName: string, + @Body() body: { filename: string; contentType: string }, + ): Promise { + if (!connectionId) { + throw new HttpException( + { message: Messages.CONNECTION_ID_MISSING }, + HttpStatus.BAD_REQUEST, + ); + } + if (!fieldName) { + throw new HttpException( + { message: "Field name is required" }, + HttpStatus.BAD_REQUEST, + ); + } + if (!body.filename) { + throw new HttpException( + { message: "Filename is required" }, + HttpStatus.BAD_REQUEST, + ); + } + if (!body.contentType) { + throw new HttpException( + { message: "Content type is required" }, + HttpStatus.BAD_REQUEST, + ); + } + + return await this.getS3UploadUrlUseCase.execute( + { + connectionId, + tableName, + fieldName, + userId, + masterPwd, + filename: body.filename, + contentType: body.contentType, + }, + InTransactionEnum.OFF, + ); + } +} diff --git a/backend/src/entities/s3-widget/s3-widget.module.ts b/backend/src/entities/s3-widget/s3-widget.module.ts new file mode 100644 index 000000000..bc730e595 --- /dev/null +++ b/backend/src/entities/s3-widget/s3-widget.module.ts @@ -0,0 +1,42 @@ +import { MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { AuthMiddleware } from '../../authorization/index.js'; +import { GlobalDatabaseContext } from '../../common/application/global-database-context.js'; +import { BaseType, UseCaseType } from '../../common/data-injection.tokens.js'; +import { LogOutEntity } from '../log-out/log-out.entity.js'; +import { UserEntity } from '../user/user.entity.js'; +import { S3WidgetController } from './s3-widget.controller.js'; +import { S3HelperService } from './s3-helper.service.js'; +import { GetS3FileUrlUseCase } from './use-cases/get-s3-file-url.use.case.js'; +import { GetS3UploadUrlUseCase } from './use-cases/get-s3-upload-url.use.case.js'; + +@Module({ + imports: [TypeOrmModule.forFeature([UserEntity, LogOutEntity])], + providers: [ + S3HelperService, + { + provide: BaseType.GLOBAL_DB_CONTEXT, + useClass: GlobalDatabaseContext, + }, + { + provide: UseCaseType.GET_S3_FILE_URL, + useClass: GetS3FileUrlUseCase, + }, + { + provide: UseCaseType.GET_S3_UPLOAD_URL, + useClass: GetS3UploadUrlUseCase, + }, + ], + controllers: [S3WidgetController], + exports: [S3HelperService], +}) +export class S3WidgetModule { + public configure(consumer: MiddlewareConsumer): any { + consumer + .apply(AuthMiddleware) + .forRoutes( + { path: '/s3/file/:connectionId', method: RequestMethod.GET }, + { path: '/s3/upload-url/:connectionId', method: RequestMethod.POST }, + ); + } +} diff --git a/backend/src/entities/s3-widget/use-cases/get-s3-file-url.use.case.ts b/backend/src/entities/s3-widget/use-cases/get-s3-file-url.use.case.ts new file mode 100644 index 000000000..ce097e846 --- /dev/null +++ b/backend/src/entities/s3-widget/use-cases/get-s3-file-url.use.case.ts @@ -0,0 +1,168 @@ +import { HttpStatus, Inject, Injectable } from "@nestjs/common"; +import { HttpException } from "@nestjs/common/exceptions/http.exception.js"; +import { getDataAccessObject } from "@rocketadmin/shared-code/dist/src/data-access-layer/shared/create-data-access-object.js"; +import JSON5 from "json5"; +import AbstractUseCase from "../../../common/abstract-use.case.js"; +import { IGlobalDatabaseContext } from "../../../common/application/global-database-context.interface.js"; +import { BaseType } from "../../../common/data-injection.tokens.js"; +import { WidgetTypeEnum } from "../../../enums/index.js"; +import { Messages } from "../../../exceptions/text/messages.js"; +import { Encryptor } from "../../../helpers/encryption/encryptor.js"; +import { isConnectionTypeAgent } from "../../../helpers/index.js"; +import { + S3FileUrlResponseDs, + S3GetFileUrlDs, +} from "../application/data-structures/s3-operation.ds.js"; +import { S3WidgetParams } from "../application/data-structures/s3-widget-params.ds.js"; +import { S3HelperService } from "../s3-helper.service.js"; +import { IGetS3FileUrl } from "./s3-use-cases.interface.js"; + +@Injectable() +export class GetS3FileUrlUseCase + extends AbstractUseCase + implements IGetS3FileUrl +{ + constructor( + @Inject(BaseType.GLOBAL_DB_CONTEXT) + protected _dbContext: IGlobalDatabaseContext, + private readonly s3Helper: S3HelperService, + ) { + super(); + } + + protected async implementation( + inputData: S3GetFileUrlDs, + ): Promise { + const { + connectionId, + tableName, + fieldName, + rowPrimaryKey, + userId, + masterPwd, + } = inputData; + + const user = + await this._dbContext.userRepository.findOneUserByIdWithCompany(userId); + if (!user || !user.company) { + throw new HttpException( + { message: Messages.USER_NOT_FOUND_OR_NOT_IN_COMPANY }, + HttpStatus.NOT_FOUND, + ); + } + + const connection = + await this._dbContext.connectionRepository.findAndDecryptConnection( + connectionId, + masterPwd, + ); + if (!connection) { + throw new HttpException( + { message: Messages.CONNECTION_NOT_FOUND }, + HttpStatus.BAD_REQUEST, + ); + } + + const foundTableWidgets = + await this._dbContext.tableWidgetsRepository.findTableWidgets( + connectionId, + tableName, + ); + const widget = foundTableWidgets.find((w) => w.field_name === fieldName); + + if (!widget || widget.widget_type !== WidgetTypeEnum.S3) { + throw new HttpException( + { message: "S3 widget not configured for this field" }, + HttpStatus.BAD_REQUEST, + ); + } + + const params: S3WidgetParams = + typeof widget.widget_params === "string" + ? JSON5.parse(widget.widget_params) + : widget.widget_params; + + // Fetch the row from database to get the actual file key + const dao = getDataAccessObject(connection); + let userEmail: string; + if (isConnectionTypeAgent(connection.type)) { + userEmail = + await this._dbContext.userRepository.getUserEmailOrReturnNull(userId); + } + + const tableSettings = + await this._dbContext.tableSettingsRepository.findTableSettingsPure( + connectionId, + tableName, + ); + const rowData = await dao.getRowByPrimaryKey( + tableName, + rowPrimaryKey, + tableSettings, + userEmail, + ); + + if (!rowData) { + throw new HttpException( + { message: Messages.ROW_PRIMARY_KEY_NOT_FOUND }, + HttpStatus.NOT_FOUND, + ); + } + + const fileKey = rowData[fieldName] as string; + if (!fileKey) { + throw new HttpException( + { message: "File key not found in row" }, + HttpStatus.NOT_FOUND, + ); + } + + const accessKeySecret = + await this._dbContext.userSecretRepository.findSecretBySlugAndCompanyId( + params.aws_access_key_id_secret_name, + user.company.id, + ); + + const secretKeySecret = + await this._dbContext.userSecretRepository.findSecretBySlugAndCompanyId( + params.aws_secret_access_key_secret_name, + user.company.id, + ); + + if (!accessKeySecret || !secretKeySecret) { + throw new HttpException( + { message: "AWS credentials secrets not found" }, + HttpStatus.NOT_FOUND, + ); + } + + let accessKeyId = Encryptor.decryptData(accessKeySecret.encryptedValue); + let secretAccessKey = Encryptor.decryptData(secretKeySecret.encryptedValue); + + if (accessKeySecret.masterEncryption && masterPwd) { + accessKeyId = Encryptor.decryptDataMasterPwd(accessKeyId, masterPwd); + } + if (secretKeySecret.masterEncryption && masterPwd) { + secretAccessKey = Encryptor.decryptDataMasterPwd( + secretAccessKey, + masterPwd, + ); + } + + const client = this.s3Helper.createS3Client( + accessKeyId, + secretAccessKey, + params.region || "us-east-1", + ); + + const expiresIn = 3600; + const url = await this.s3Helper.getSignedGetUrl( + client, + params.bucket, + fileKey, + expiresIn, + ); + + return { url, key: fileKey, expiresIn }; + } +} diff --git a/backend/src/entities/s3-widget/use-cases/get-s3-upload-url.use.case.ts b/backend/src/entities/s3-widget/use-cases/get-s3-upload-url.use.case.ts new file mode 100644 index 000000000..bc5f57b10 --- /dev/null +++ b/backend/src/entities/s3-widget/use-cases/get-s3-upload-url.use.case.ts @@ -0,0 +1,78 @@ +import { HttpStatus, Inject, Injectable } from '@nestjs/common'; +import { HttpException } from '@nestjs/common/exceptions/http.exception.js'; +import AbstractUseCase from '../../../common/abstract-use.case.js'; +import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; +import { BaseType } from '../../../common/data-injection.tokens.js'; +import { Messages } from '../../../exceptions/text/messages.js'; +import { Encryptor } from '../../../helpers/encryption/encryptor.js'; +import { S3GetUploadUrlDs, S3UploadUrlResponseDs } from '../application/data-structures/s3-operation.ds.js'; +import { S3WidgetParams } from '../application/data-structures/s3-widget-params.ds.js'; +import { S3HelperService } from '../s3-helper.service.js'; +import { IGetS3UploadUrl } from './s3-use-cases.interface.js'; +import { WidgetTypeEnum } from '../../../enums/index.js'; +import JSON5 from 'json5'; + +@Injectable() +export class GetS3UploadUrlUseCase + extends AbstractUseCase + implements IGetS3UploadUrl +{ + constructor( + @Inject(BaseType.GLOBAL_DB_CONTEXT) + protected _dbContext: IGlobalDatabaseContext, + private readonly s3Helper: S3HelperService, + ) { + super(); + } + + protected async implementation(inputData: S3GetUploadUrlDs): Promise { + const { connectionId, tableName, fieldName, userId, masterPwd, filename, contentType } = inputData; + + const user = await this._dbContext.userRepository.findOneUserByIdWithCompany(userId); + if (!user || !user.company) { + throw new HttpException({ message: Messages.USER_NOT_FOUND_OR_NOT_IN_COMPANY }, HttpStatus.NOT_FOUND); + } + + const foundTableWidgets = await this._dbContext.tableWidgetsRepository.findTableWidgets(connectionId, tableName); + const widget = foundTableWidgets.find((w) => w.field_name === fieldName); + + if (!widget || widget.widget_type !== WidgetTypeEnum.S3) { + throw new HttpException({ message: 'S3 widget not configured for this field' }, HttpStatus.BAD_REQUEST); + } + + const params: S3WidgetParams = + typeof widget.widget_params === 'string' ? JSON5.parse(widget.widget_params) : widget.widget_params; + + const accessKeySecret = await this._dbContext.userSecretRepository.findSecretBySlugAndCompanyId( + params.aws_access_key_id_secret_name, + user.company.id, + ); + + const secretKeySecret = await this._dbContext.userSecretRepository.findSecretBySlugAndCompanyId( + params.aws_secret_access_key_secret_name, + user.company.id, + ); + + if (!accessKeySecret || !secretKeySecret) { + throw new HttpException({ message: 'AWS credentials secrets not found' }, HttpStatus.NOT_FOUND); + } + + let accessKeyId = Encryptor.decryptData(accessKeySecret.encryptedValue); + let secretAccessKey = Encryptor.decryptData(secretKeySecret.encryptedValue); + + if (accessKeySecret.masterEncryption && masterPwd) { + accessKeyId = Encryptor.decryptDataMasterPwd(accessKeyId, masterPwd); + } + if (secretKeySecret.masterEncryption && masterPwd) { + secretAccessKey = Encryptor.decryptDataMasterPwd(secretAccessKey, masterPwd); + } + + const client = this.s3Helper.createS3Client(accessKeyId, secretAccessKey, params.region || 'us-east-1'); + + const key = this.s3Helper.generateFileKey(params.prefix, filename); + const expiresIn = 3600; + const uploadUrl = await this.s3Helper.getSignedPutUrl(client, params.bucket, key, contentType, expiresIn); + + return { uploadUrl, key, expiresIn }; + } +} diff --git a/backend/src/entities/s3-widget/use-cases/s3-use-cases.interface.ts b/backend/src/entities/s3-widget/use-cases/s3-use-cases.interface.ts new file mode 100644 index 000000000..daa3a7fa8 --- /dev/null +++ b/backend/src/entities/s3-widget/use-cases/s3-use-cases.interface.ts @@ -0,0 +1,10 @@ +import { InTransactionEnum } from '../../../enums/index.js'; +import { S3FileUrlResponseDs, S3GetFileUrlDs, S3GetUploadUrlDs, S3UploadUrlResponseDs } from '../application/data-structures/s3-operation.ds.js'; + +export interface IGetS3FileUrl { + execute(inputData: S3GetFileUrlDs, inTransaction: InTransactionEnum): Promise; +} + +export interface IGetS3UploadUrl { + execute(inputData: S3GetUploadUrlDs, inTransaction: InTransactionEnum): Promise; +} diff --git a/backend/src/entities/shared-jobs/shared-jobs.service.ts b/backend/src/entities/shared-jobs/shared-jobs.service.ts index 5f9f77acf..11f13f420 100644 --- a/backend/src/entities/shared-jobs/shared-jobs.service.ts +++ b/backend/src/entities/shared-jobs/shared-jobs.service.ts @@ -1,22 +1,22 @@ import { Inject, Injectable } from '@nestjs/common'; import { getDataAccessObject } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/create-data-access-object.js'; import { TableDS } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/data-structures/table.ds.js'; -import { IDataAccessObjectAgent } from '@rocketadmin/shared-code/dist/src/shared/interfaces/data-access-object-agent.interface.js'; -import { IDataAccessObject } from '@rocketadmin/shared-code/dist/src/shared/interfaces/data-access-object.interface.js'; import { buildValidateTableSettingsDS } from '@rocketadmin/shared-code/dist/src/helpers/data-structures-builders/validate-table-settings-ds.builder.js'; +import { IDataAccessObject } from '@rocketadmin/shared-code/dist/src/shared/interfaces/data-access-object.interface.js'; +import { IDataAccessObjectAgent } from '@rocketadmin/shared-code/dist/src/shared/interfaces/data-access-object-agent.interface.js'; import * as Sentry from '@sentry/node'; import PQueue from 'p-queue'; import { IGlobalDatabaseContext } from '../../common/application/global-database-context.interface.js'; import { BaseType } from '../../common/data-injection.tokens.js'; import { WidgetTypeEnum } from '../../enums/widget-type.enum.js'; +import { isTest } from '../../helpers/app/is-test.js'; import { ValidationHelper } from '../../helpers/validators/validation-helper.js'; +import { AiService } from '../ai/ai.service.js'; import { ConnectionEntity } from '../connection/connection.entity.js'; +import { TableSettingsEntity } from '../table-settings/table-settings.entity.js'; import { buildEmptyTableSettings } from '../table-settings/utils/build-empty-table-settings.js'; import { buildNewTableSettingsEntity } from '../table-settings/utils/build-new-table-settings-entity.js'; import { TableWidgetEntity } from '../widget/table-widget.entity.js'; -import { AiService } from '../ai/ai.service.js'; -import { TableSettingsEntity } from '../table-settings/table-settings.entity.js'; -import { isTest } from '../../helpers/app/is-test.js'; @Injectable() export class SharedJobsService { diff --git a/backend/src/entities/widget/utils/validate-create-widgets-ds.ts b/backend/src/entities/widget/utils/validate-create-widgets-ds.ts index 52206a000..91ffaba7e 100644 --- a/backend/src/entities/widget/utils/validate-create-widgets-ds.ts +++ b/backend/src/entities/widget/utils/validate-create-widgets-ds.ts @@ -1,97 +1,159 @@ -import { EncryptionAlgorithmEnum, WidgetTypeEnum } from '../../../enums/index.js'; -import { Messages } from '../../../exceptions/text/messages.js'; -import { getPropertyValueByDescriptor } from '../../../helpers/index.js'; -import { Constants } from '../../../helpers/constants/constants.js'; -import { ConnectionEntity } from '../../connection/connection.entity.js'; -import { ForeignKeyDSInfo } from '../../table/table-datastructures.js'; -import { findTableFieldsUtil } from '../../table/utils/find-table-fields.util.js'; -import { findTablesInConnectionUtil } from '../../table/utils/find-tables-in-connection.util.js'; -import { CreateTableWidgetDs } from '../application/data-sctructures/create-table-widgets.ds.js'; -import JSON5 from 'json5'; +import JSON5 from "json5"; +import { + EncryptionAlgorithmEnum, + WidgetTypeEnum, +} from "../../../enums/index.js"; +import { Messages } from "../../../exceptions/text/messages.js"; +import { Constants } from "../../../helpers/constants/constants.js"; +import { getPropertyValueByDescriptor } from "../../../helpers/index.js"; +import { ConnectionEntity } from "../../connection/connection.entity.js"; +import { ForeignKeyDSInfo } from "../../table/table-datastructures.js"; +import { findTableFieldsUtil } from "../../table/utils/find-table-fields.util.js"; +import { findTablesInConnectionUtil } from "../../table/utils/find-tables-in-connection.util.js"; +import { CreateTableWidgetDs } from "../application/data-sctructures/create-table-widgets.ds.js"; export async function validateCreateWidgetsDs( - widgetsDS: Array, - userId: string, - connection: ConnectionEntity, - tableName: string, - userEmail: string, + widgetsDS: Array, + userId: string, + connection: ConnectionEntity, + tableName: string, + userEmail: string, ): Promise> { - const errors = []; - const availableTablesInConnection = await findTablesInConnectionUtil(connection, userId, userEmail); - if (!availableTablesInConnection.includes(tableName)) { - errors.push(Messages.TABLE_NOT_FOUND); - return errors; - } - const availableTableFields = await findTableFieldsUtil(connection, tableName, userId, userEmail); - if (!widgetsDS || !Array.isArray(widgetsDS)) { - errors.push(Messages.WIDGETS_PROPERTY_MISSING); - return errors; - } + const errors = []; + const availableTablesInConnection = await findTablesInConnectionUtil( + connection, + userId, + userEmail, + ); + if (!availableTablesInConnection.includes(tableName)) { + errors.push(Messages.TABLE_NOT_FOUND); + return errors; + } + const availableTableFields = await findTableFieldsUtil( + connection, + tableName, + userId, + userEmail, + ); + if (!widgetsDS || !Array.isArray(widgetsDS)) { + errors.push(Messages.WIDGETS_PROPERTY_MISSING); + return errors; + } - for (const widgetDS of widgetsDS) { - if (!widgetDS.field_name) { - errors.push(Messages.WIDGET_FIELD_NAME_MISSING); - } else { - const fieldIndex = availableTableFields.indexOf(widgetDS.field_name); - if (fieldIndex < 0) { - errors.push(Messages.EXCLUDED_OR_NOT_EXISTS(widgetDS.field_name)); - } - } - const { widget_type } = widgetDS; + for (const widgetDS of widgetsDS) { + if (!widgetDS.field_name) { + errors.push(Messages.WIDGET_FIELD_NAME_MISSING); + } else { + const fieldIndex = availableTableFields.indexOf(widgetDS.field_name); + if (fieldIndex < 0) { + errors.push(Messages.EXCLUDED_OR_NOT_EXISTS(widgetDS.field_name)); + } + } + const { widget_type } = widgetDS; - // if (widget_type) { - // if (!Object.keys(WidgetTypeEnum).find((key) => key === widget_type)) { - // errors.push(Messages.WIDGET_TYPE_INCORRECT); - // } - // } - if (widget_type && widget_type === WidgetTypeEnum.Password) { - let widget_params = widgetDS.widget_params as string | Record; - if (typeof widget_params === 'string') { - widget_params = JSON5.parse(widget_params); - } + // if (widget_type) { + // if (!Object.keys(WidgetTypeEnum).find((key) => key === widget_type)) { + // errors.push(Messages.WIDGET_TYPE_INCORRECT); + // } + // } + if (widget_type && widget_type === WidgetTypeEnum.Password) { + let widget_params = widgetDS.widget_params as + | string + | Record; + if (typeof widget_params === "string") { + widget_params = JSON5.parse(widget_params); + } - if ( - widget_params.algorithm && - !Object.keys(EncryptionAlgorithmEnum).find((key) => key === widget_params.algorithm) - ) { - errors.push(Messages.ENCRYPTION_ALGORITHM_INCORRECT(widget_params.algorithm)); - } - if (widget_params.encrypt === undefined) { - errors.push(Messages.WIDGET_REQUIRED_PARAMETER_MISSING('encrypt')); - } - } + if ( + widget_params.algorithm && + !Object.keys(EncryptionAlgorithmEnum).find( + (key) => key === widget_params.algorithm, + ) + ) { + errors.push( + Messages.ENCRYPTION_ALGORITHM_INCORRECT(widget_params.algorithm), + ); + } + if (widget_params.encrypt === undefined) { + errors.push(Messages.WIDGET_REQUIRED_PARAMETER_MISSING("encrypt")); + } + } - if (widget_type && widget_type === WidgetTypeEnum.Foreign_key) { - const widget_params: ForeignKeyDSInfo = JSON5.parse(widgetDS.widget_params); + if (widget_type && widget_type === WidgetTypeEnum.Foreign_key) { + const widget_params: ForeignKeyDSInfo = JSON5.parse( + widgetDS.widget_params, + ); - for (const key in widget_params) { - if (!Constants.FOREIGN_KEY_FIELDS.includes(key)) { - errors.push(Messages.WIDGET_PARAMETER_UNSUPPORTED(key, widgetDS.widget_type)); - continue; - } - if (!getPropertyValueByDescriptor(widget_params, key) && key !== 'constraint_name') { - errors.push(Messages.WIDGET_REQUIRED_PARAMETER_MISSING(key)); - } - } - if (errors.length > 0) { - return errors; - } - if (!availableTablesInConnection.includes(widget_params.referenced_table_name)) { - errors.push(Messages.TABLE_WITH_NAME_NOT_EXISTS(widget_params.referenced_table_name)); - return errors; - } - const foreignTableFields = await findTableFieldsUtil( - connection, - widget_params.referenced_table_name, - userId, - userEmail, - ); - if (!foreignTableFields.includes(widget_params.referenced_column_name)) { - errors.push( - Messages.NO_SUCH_FIELD_IN_TABLE(widget_params.referenced_column_name, widget_params.referenced_table_name), - ); - } - } - } - return errors; + for (const key in widget_params) { + if (!Constants.FOREIGN_KEY_FIELDS.includes(key)) { + errors.push( + Messages.WIDGET_PARAMETER_UNSUPPORTED(key, widgetDS.widget_type), + ); + continue; + } + if ( + !getPropertyValueByDescriptor(widget_params, key) && + key !== "constraint_name" + ) { + errors.push(Messages.WIDGET_REQUIRED_PARAMETER_MISSING(key)); + } + } + if (errors.length > 0) { + return errors; + } + if ( + !availableTablesInConnection.includes( + widget_params.referenced_table_name, + ) + ) { + errors.push( + Messages.TABLE_WITH_NAME_NOT_EXISTS( + widget_params.referenced_table_name, + ), + ); + return errors; + } + const foreignTableFields = await findTableFieldsUtil( + connection, + widget_params.referenced_table_name, + userId, + userEmail, + ); + if (!foreignTableFields.includes(widget_params.referenced_column_name)) { + errors.push( + Messages.NO_SUCH_FIELD_IN_TABLE( + widget_params.referenced_column_name, + widget_params.referenced_table_name, + ), + ); + } + } + + if (widget_type && widget_type === WidgetTypeEnum.S3) { + const rawParams = widgetDS.widget_params; + const widget_params: Record = + typeof rawParams === "string" + ? JSON5.parse(rawParams) + : (rawParams as Record); + + if (!widget_params.bucket) { + errors.push(Messages.WIDGET_REQUIRED_PARAMETER_MISSING("bucket")); + } + if (!widget_params.aws_access_key_id_secret_name) { + errors.push( + Messages.WIDGET_REQUIRED_PARAMETER_MISSING( + "aws_access_key_id_secret_name", + ), + ); + } + if (!widget_params.aws_secret_access_key_secret_name) { + errors.push( + Messages.WIDGET_REQUIRED_PARAMETER_MISSING( + "aws_secret_access_key_secret_name", + ), + ); + } + } + } + return errors; } diff --git a/backend/src/enums/widget-type.enum.ts b/backend/src/enums/widget-type.enum.ts index 9baed383f..3a9136e0e 100644 --- a/backend/src/enums/widget-type.enum.ts +++ b/backend/src/enums/widget-type.enum.ts @@ -21,5 +21,6 @@ export enum WidgetTypeEnum { Country = 'Country', Color = 'Color', Range = 'Range', - Timezone = 'Timezone' + Timezone = 'Timezone', + S3 = 'S3', } diff --git a/backend/src/interceptors/timeout.interceptor.ts b/backend/src/interceptors/timeout.interceptor.ts index 559271465..43ce60128 100644 --- a/backend/src/interceptors/timeout.interceptor.ts +++ b/backend/src/interceptors/timeout.interceptor.ts @@ -1,5 +1,5 @@ import { CallHandler, ExecutionContext, Injectable, NestInterceptor, RequestTimeoutException } from '@nestjs/common'; -import { Observable, throwError, TimeoutError } from 'rxjs'; +import { Observable, TimeoutError, throwError } from 'rxjs'; import { catchError, timeout } from 'rxjs/operators'; import { Messages } from '../exceptions/text/messages.js'; diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-s3-widget-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-s3-widget-e2e.test.ts new file mode 100644 index 000000000..42d9cf1be --- /dev/null +++ b/backend/test/ava-tests/non-saas-tests/non-saas-s3-widget-e2e.test.ts @@ -0,0 +1,677 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { faker } from "@faker-js/faker"; +import { INestApplication, ValidationPipe } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import test from "ava"; +import { ValidationError } from "class-validator"; +import cookieParser from "cookie-parser"; +import request from "supertest"; +import { ApplicationModule } from "../../../src/app.module.js"; +import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; +import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; +import { Messages } from "../../../src/exceptions/text/messages.js"; +import { Cacher } from "../../../src/helpers/cache/cacher.js"; +import { DatabaseModule } from "../../../src/shared/database/database.module.js"; +import { DatabaseService } from "../../../src/shared/database/database.service.js"; +import { MockFactory } from "../../mock.factory.js"; +import { getRandomTestTableName } from "../../utils/get-random-test-table-name.js"; +import { getTestData } from "../../utils/get-test-data.js"; +import { getTestKnex } from "../../utils/get-test-knex.js"; +import { registerUserAndReturnUserInfo } from "../../utils/register-user-and-return-user-info.js"; +import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; + +const mockFactory = new MockFactory(); +let app: INestApplication; +let currentTest: string; + +// Helper to setup user with connection, secrets, table with S3 widget, and row data +async function setupS3WidgetTestEnvironment( + options: { + createSecrets?: boolean; + createWidget?: boolean; + s3FieldName?: string; + } = {}, +): Promise<{ + token: string; + connectionId: string; + tableName: string; + fieldName: string; + rowPrimaryKey: Record; +}> { + const { + createSecrets = true, + createWidget = true, + s3FieldName = "file_key", + } = options; + + const { token } = await registerUserAndReturnUserInfo(app); + const connectionToPostgres = getTestData(mockFactory).connectionToPostgres; + + // Create test table with S3 field + const { testTableName } = await createTestTableWithS3Field( + connectionToPostgres, + s3FieldName, + ); + + // Create connection + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(connectionToPostgres) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + + // Create secrets for AWS credentials + if (createSecrets) { + await request(app.getHttpServer()) + .post("/secrets") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json") + .send({ + slug: "test-aws-access-key", + value: "AKIAIOSFODNN7EXAMPLE", + masterEncryption: false, + }); + + await request(app.getHttpServer()) + .post("/secrets") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json") + .send({ + slug: "test-aws-secret-key", + value: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + masterEncryption: false, + }); + } + + // Create S3 widget for the field + if (createWidget) { + const s3WidgetParams = JSON.stringify({ + bucket: "test-bucket", + prefix: "uploads", + region: "us-east-1", + aws_access_key_id_secret_name: "test-aws-access-key", + aws_secret_access_key_secret_name: "test-aws-secret-key", + }); + + const widgetDto = { + widgets: [ + { + field_name: s3FieldName, + widget_type: "S3", + widget_params: s3WidgetParams, + name: "S3 File Widget", + description: "Test S3 widget", + }, + ], + }; + + await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${testTableName}`) + .send(widgetDto) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + } + + return { + token, + connectionId, + tableName: testTableName, + fieldName: s3FieldName, + rowPrimaryKey: { id: 1 }, + }; +} + +// Create test table with S3 field +async function createTestTableWithS3Field( + connectionParams: any, + s3FieldName: string, +): Promise<{ testTableName: string; testTableColumnName: string }> { + const testTableName = getRandomTestTableName(); + const testTableColumnName = "name"; + const Knex = getTestKnex(connectionParams); + + await Knex.schema.createTable(testTableName, (table) => { + table.increments("id"); + table.string(testTableColumnName); + table.string(s3FieldName); // Field to store S3 file key + table.timestamps(); + }); + + // Insert test row with file key + await Knex(testTableName).insert({ + [testTableColumnName]: "Test User", + [s3FieldName]: "uploads/test-file.pdf", + created_at: new Date(), + updated_at: new Date(), + }); + + return { testTableName, testTableColumnName }; +} + +test.before(async () => { + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService], + }).compile(); + app = moduleFixture.createNestApplication(); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + app.getHttpServer().listen(0); +}); + +test.after(async () => { + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error("After tests error " + e); + } +}); + +// ==================== GET /s3/file/:connectionId Tests ==================== + +currentTest = "GET /s3/file/:connectionId"; + +test.serial( + `${currentTest} - should return 403 when user tries to access another user's connection`, + async (t) => { + // First user creates connection + const { connectionId, tableName, fieldName, rowPrimaryKey } = + await setupS3WidgetTestEnvironment(); + + // Second user tries to access first user's connection + const { token: secondUserToken } = await registerUserAndReturnUserInfo(app); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set("Cookie", secondUserToken) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); + }, +); + +test.serial( + `${currentTest} - should return 403 when using fake connection ID`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const fakeConnectionId = faker.string.uuid(); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${fakeConnectionId}?tableName=test_table&fieldName=file_key&rowPrimaryKey=${JSON.stringify({ id: 1 })}`, + ) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); + }, +); + +test.serial( + `${currentTest} - should return 400 when tableName is missing`, + async (t) => { + const { token, connectionId, fieldName, rowPrimaryKey } = + await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 400); + }, +); + +test.serial( + `${currentTest} - should return 400 when fieldName is missing`, + async (t) => { + const { token, connectionId, tableName, rowPrimaryKey } = + await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, "Field name is required"); + }, +); + +test.serial( + `${currentTest} - should return 400 when rowPrimaryKey is missing`, + async (t) => { + const { token, connectionId, tableName, fieldName } = + await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, + ) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, "Row primary key is required"); + }, +); + +test.serial( + `${currentTest} - should return 400 when rowPrimaryKey has invalid JSON format`, + async (t) => { + const { token, connectionId, tableName, fieldName } = + await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=invalid-json`, + ) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, "Invalid row primary key format"); + }, +); + +test.serial( + `${currentTest} - should return 400 when S3 widget is not configured for the field`, + async (t) => { + const { token, connectionId, tableName, rowPrimaryKey } = + await setupS3WidgetTestEnvironment({ + createWidget: false, + }); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=file_key&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, "S3 widget not configured for this field"); + }, +); + +test.serial( + `${currentTest} - should return 404 when row with primary key not found`, + async (t) => { + const { token, connectionId, tableName, fieldName } = + await setupS3WidgetTestEnvironment(); + + // Use a primary key that doesn't exist + const nonExistentPrimaryKey = { id: 99999 }; + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(nonExistentPrimaryKey)}`, + ) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 404); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, Messages.ROW_PRIMARY_KEY_NOT_FOUND); + }, +); + +test.serial( + `${currentTest} - should return 404 when AWS credentials secrets are not found`, + async (t) => { + const { token, connectionId, tableName, fieldName, rowPrimaryKey } = + await setupS3WidgetTestEnvironment({ + createSecrets: false, + }); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 404); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, "AWS credentials secrets not found"); + }, +); + +// ==================== POST /s3/upload-url/:connectionId Tests ==================== + +currentTest = "POST /s3/upload-url/:connectionId"; + +test.serial( + `${currentTest} - should return 403 when user tries to access another user's connection`, + async (t) => { + // First user creates connection + const { connectionId, tableName, fieldName } = + await setupS3WidgetTestEnvironment(); + + // Second user tries to access first user's connection + const { token: secondUserToken } = await registerUserAndReturnUserInfo(app); + + const response = await request(app.getHttpServer()) + .post( + `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, + ) + .send({ filename: "test.pdf", contentType: "application/pdf" }) + .set("Cookie", secondUserToken) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); + }, +); + +test.serial( + `${currentTest} - should return 403 when using fake connection ID`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const fakeConnectionId = faker.string.uuid(); + + const response = await request(app.getHttpServer()) + .post( + `/s3/upload-url/${fakeConnectionId}?tableName=test_table&fieldName=file_key`, + ) + .send({ filename: "test.pdf", contentType: "application/pdf" }) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, Messages.DONT_HAVE_PERMISSIONS); + }, +); + +test.serial( + `${currentTest} - should return 400 when tableName is missing`, + async (t) => { + const { token, connectionId, fieldName } = + await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .post(`/s3/upload-url/${connectionId}?fieldName=${fieldName}`) + .send({ filename: "test.pdf", contentType: "application/pdf" }) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 400); + }, +); + +test.serial( + `${currentTest} - should return 400 when fieldName is missing`, + async (t) => { + const { token, connectionId, tableName } = + await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .post(`/s3/upload-url/${connectionId}?tableName=${tableName}`) + .send({ filename: "test.pdf", contentType: "application/pdf" }) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, "Field name is required"); + }, +); + +test.serial( + `${currentTest} - should return 400 when filename is missing`, + async (t) => { + const { token, connectionId, tableName, fieldName } = + await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .post( + `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, + ) + .send({ contentType: "application/pdf" }) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, "Filename is required"); + }, +); + +test.serial( + `${currentTest} - should return 400 when contentType is missing`, + async (t) => { + const { token, connectionId, tableName, fieldName } = + await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .post( + `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, + ) + .send({ filename: "test.pdf" }) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, "Content type is required"); + }, +); + +test.serial( + `${currentTest} - should return 400 when S3 widget is not configured for the field`, + async (t) => { + const { token, connectionId, tableName } = + await setupS3WidgetTestEnvironment({ + createWidget: false, + }); + + const response = await request(app.getHttpServer()) + .post( + `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=file_key`, + ) + .send({ filename: "test.pdf", contentType: "application/pdf" }) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 400); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, "S3 widget not configured for this field"); + }, +); + +test.serial( + `${currentTest} - should return 404 when AWS credentials secrets are not found`, + async (t) => { + const { token, connectionId, tableName, fieldName } = + await setupS3WidgetTestEnvironment({ + createSecrets: false, + }); + + const response = await request(app.getHttpServer()) + .post( + `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, + ) + .send({ filename: "test.pdf", contentType: "application/pdf" }) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 404); + const responseBody = JSON.parse(response.text); + t.is(responseBody.message, "AWS credentials secrets not found"); + }, +); + +// ==================== Authorization Tests - Multiple Users ==================== + +currentTest = "S3 Widget Authorization"; + +test.serial( + `${currentTest} - user A cannot get file URL from user B's connection`, + async (t) => { + // User A sets up their environment + const userA = await setupS3WidgetTestEnvironment(); + + // User B registers + const { token: userBToken } = await registerUserAndReturnUserInfo(app); + + // User B tries to get file URL from User A's connection + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${userA.connectionId}?tableName=${userA.tableName}&fieldName=${userA.fieldName}&rowPrimaryKey=${JSON.stringify(userA.rowPrimaryKey)}`, + ) + .set("Cookie", userBToken) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + }, +); + +test.serial( + `${currentTest} - user A cannot get upload URL from user B's connection`, + async (t) => { + // User A sets up their environment + const userA = await setupS3WidgetTestEnvironment(); + + // User B registers + const { token: userBToken } = await registerUserAndReturnUserInfo(app); + + // User B tries to get upload URL from User A's connection + const response = await request(app.getHttpServer()) + .post( + `/s3/upload-url/${userA.connectionId}?tableName=${userA.tableName}&fieldName=${userA.fieldName}`, + ) + .send({ filename: "malicious.pdf", contentType: "application/pdf" }) + .set("Cookie", userBToken) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + }, +); + +test.serial( + `${currentTest} - user can access their own connection successfully`, + async (t) => { + // User sets up their environment - this should work without permission errors + // Note: The actual S3 call may fail (no real AWS), but we should not get 403 + const { token, connectionId, tableName, fieldName, rowPrimaryKey } = + await setupS3WidgetTestEnvironment(); + + const response = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // Should not be 403 - may fail at S3 level but authorization passes + t.not(response.status, 403); + }, +); + +test.serial( + `${currentTest} - unauthenticated user cannot access S3 endpoints`, + async (t) => { + const { connectionId, tableName, fieldName, rowPrimaryKey } = + await setupS3WidgetTestEnvironment(); + + // Try to access without authentication token + const getFileResponse = await request(app.getHttpServer()) + .get( + `/s3/file/${connectionId}?tableName=${tableName}&fieldName=${fieldName}&rowPrimaryKey=${JSON.stringify(rowPrimaryKey)}`, + ) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getFileResponse.status, 401); + + const uploadUrlResponse = await request(app.getHttpServer()) + .post( + `/s3/upload-url/${connectionId}?tableName=${tableName}&fieldName=${fieldName}`, + ) + .send({ filename: "test.pdf", contentType: "application/pdf" }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(uploadUrlResponse.status, 401); + }, +); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-table-widgets-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-table-widgets-e2e.test.ts index c0abc091d..41bc9d36b 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-table-widgets-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-table-widgets-e2e.test.ts @@ -1,672 +1,745 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { faker } from '@faker-js/faker'; -import { INestApplication, ValidationPipe } from '@nestjs/common'; -import { Test } from '@nestjs/testing'; -import test from 'ava'; -import cookieParser from 'cookie-parser'; -import request from 'supertest'; -import { ApplicationModule } from '../../../src/app.module.js'; -import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; -import { Messages } from '../../../src/exceptions/text/messages.js'; -import { Cacher } from '../../../src/helpers/cache/cacher.js'; -import { DatabaseModule } from '../../../src/shared/database/database.module.js'; -import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { MockFactory } from '../../mock.factory.js'; -import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; -import { getTestData } from '../../utils/get-test-data.js'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; -import { TestUtils } from '../../utils/test.utils.js'; -import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; -import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; -import { ValidationError } from 'class-validator'; -import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { faker } from "@faker-js/faker"; +import { INestApplication, ValidationPipe } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import test from "ava"; +import { ValidationError } from "class-validator"; +import cookieParser from "cookie-parser"; +import request from "supertest"; +import { ApplicationModule } from "../../../src/app.module.js"; +import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; +import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; +import { Messages } from "../../../src/exceptions/text/messages.js"; +import { Cacher } from "../../../src/helpers/cache/cacher.js"; +import { DatabaseModule } from "../../../src/shared/database/database.module.js"; +import { DatabaseService } from "../../../src/shared/database/database.service.js"; +import { MockFactory } from "../../mock.factory.js"; +import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; +import { getTestData } from "../../utils/get-test-data.js"; +import { registerUserAndReturnUserInfo } from "../../utils/register-user-and-return-user-info.js"; +import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; +import { TestUtils } from "../../utils/test.utils.js"; const mockFactory = new MockFactory(); let app: INestApplication; let _testUtils: TestUtils; let currentTest; -const tableNameForWidgets = 'connection'; +const tableNameForWidgets = "connection"; -const _uuidRegex: RegExp = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i; +const _uuidRegex: RegExp = + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i; test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error("After tests error " + e); + } }); -currentTest = 'GET /widgets/:slug'; - -test.serial(`${currentTest} should return empty array, table widgets not created`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 200); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 0); -}); +currentTest = "GET /widgets/:slug"; -test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); - t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 2); - t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); - t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); -}); +test.serial( + `${currentTest} should return empty array, table widgets not created`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 200); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 0); + }, +); -test.serial(`${currentTest} should throw exception when connection id not passed in request`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const emptyConnectionId = ''; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${emptyConnectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 404); -}); +test.serial( + `${currentTest} should return array of table widgets for table`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Cookie", token) + .set("Content-Type", "application/json") + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); + t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get(`/table/structure/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 2); + t.is( + getTableStructureRO.table_widgets[0].field_name, + newTableWidgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[1].widget_type, + newTableWidgets[1].widget_type, + ); + t.is( + compareTableWidgetsArrays( + getTableStructureRO.table_widgets, + newTableWidgets, + ), + true, + ); + }, +); -test.serial(`${currentTest} should throw exception when connection id passed in request is incorrect`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const fakeConnectionId = faker.string.uuid(); - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${fakeConnectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - - t.is(getTableWidgets.status, 403); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); -}); +test.serial( + `${currentTest} should throw exception when connection id not passed in request`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Cookie", token) + .set("Content-Type", "application/json") + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + + const emptyConnectionId = ""; + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${emptyConnectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 404); + }, +); -test.serial(`${currentTest} should throw exception when tableName passed in request is incorrect`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 400); - - t.is(getTableWidgetsRO.message, Messages.TABLE_NOT_FOUND); -}); +test.serial( + `${currentTest} should throw exception when connection id passed in request is incorrect`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + + const fakeConnectionId = faker.string.uuid(); + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${fakeConnectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + + t.is(getTableWidgets.status, 403); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + }, +); -test.serial(`${currentTest} should throw exception when tableName not passed in request`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const fakeTableName = ''; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 400); - - t.is(getTableWidgetsRO.message, Messages.TABLE_NAME_MISSING); -}); +test.serial( + `${currentTest} should throw exception when tableName passed in request is incorrect`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 400); + + t.is(getTableWidgetsRO.message, Messages.TABLE_NOT_FOUND); + }, +); + +test.serial( + `${currentTest} should throw exception when tableName not passed in request`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + + const fakeTableName = ""; + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 400); + + t.is(getTableWidgetsRO.message, Messages.TABLE_NAME_MISSING); + }, +); -currentTest = 'POST /widget/:slug'; +currentTest = "POST /widget/:slug"; test.serial(`${currentTest} should return created table widgets`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidget = mockFactory.generateCreateWidgetDTOForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=connection`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=connection`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].widget_type, newTableWidget.widget_type); - t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidget = + mockFactory.generateCreateWidgetDTOForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=connection`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=connection`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].widget_type, newTableWidget.widget_type); + t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); }); test.serial(`${currentTest} hould return updated table widgets`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - const updatedTableWidgets = mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); - const updateTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: updatedTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); - - t.is(updateTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].widget_type, updatedTableWidgets[0].widget_type); - t.is(compareTableWidgetsArrays(getTableWidgetsRO, updatedTableWidgets), true); + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + const updatedTableWidgets = + mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); + const updateTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: updatedTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); + + t.is(updateTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].widget_type, updatedTableWidgets[0].widget_type); + t.is(compareTableWidgetsArrays(getTableWidgetsRO, updatedTableWidgets), true); }); -test.serial(`${currentTest} should return updated table widgets when old widget updated and new added`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const connectionId = JSON.parse(createdConnection.text).id; - newTableWidgets.shift(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - const updatedTableWidgets = mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); - const updateTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: updatedTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); - - t.is(updateTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('masterpwd', 'ahalaimahalai') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].widget_type, updatedTableWidgets[0].widget_type); - - t.is(compareTableWidgetsArrays(getTableWidgetsRO, updatedTableWidgets), true); -}); +test.serial( + `${currentTest} should return updated table widgets when old widget updated and new added`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const connectionId = JSON.parse(createdConnection.text).id; + newTableWidgets.shift(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + const updatedTableWidgets = + mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); + const updateTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: updatedTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); + + t.is(updateTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("masterpwd", "ahalaimahalai") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].widget_type, updatedTableWidgets[0].widget_type); + + t.is( + compareTableWidgetsArrays(getTableWidgetsRO, updatedTableWidgets), + true, + ); + }, +); -test.serial(`${currentTest} should return table widgets without deleted widget`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - const copyWidgets = [...newTableWidgets]; - copyWidgets.splice(1, 1); - - const updateTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: copyWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); - t.is(updateTableWidgetRO.length, 1); - - t.is(updateTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 1); -}); +test.serial( + `${currentTest} should return table widgets without deleted widget`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const copyWidgets = [...newTableWidgets]; + copyWidgets.splice(1, 1); + + const updateTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: copyWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); + t.is(updateTableWidgetRO.length, 1); + + t.is(updateTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 1); + }, +); test.skip(`${currentTest} should throw exception when table widget with incorrect type passed in request`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const copyWidgets = [...newTableWidgets]; - copyWidgets[0].widget_type = faker.lorem.words(1); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: copyWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 400); - t.is(createTableWidgetRO.message, Messages.WIDGET_TYPE_INCORRECT); + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const copyWidgets = [...newTableWidgets]; + copyWidgets[0].widget_type = faker.lorem.words(1); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: copyWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 400); + t.is(createTableWidgetRO.message, Messages.WIDGET_TYPE_INCORRECT); }); test.serial( - `${currentTest} should throw exception when table widget passed in request has incorrect field_name`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const copyWidgets = [...newTableWidgets]; - copyWidgets[0].field_name = faker.lorem.words(1); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 400); - t.is(createTableWidgetRO.message, Messages.EXCLUDED_OR_NOT_EXISTS(copyWidgets[0].field_name)); - }, + `${currentTest} should throw exception when table widget passed in request has incorrect field_name`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const copyWidgets = [...newTableWidgets]; + copyWidgets[0].field_name = faker.lorem.words(1); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 400); + t.is( + createTableWidgetRO.message, + Messages.EXCLUDED_OR_NOT_EXISTS(copyWidgets[0].field_name), + ); + }, ); -test.serial(`${currentTest} should throw exception when connection id not passed in request`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const _connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const emptyId = ''; - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${emptyId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(createTableWidgetResponse.status, 404); -}); +test.serial( + `${currentTest} should throw exception when connection id not passed in request`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const _connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const emptyId = ""; + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${emptyId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(createTableWidgetResponse.status, 404); + }, +); -test.serial(`${currentTest} should throw exception when connection id passed in request is incorrect`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const _connectionId = JSON.parse(createdConnection.text).id; - const fakeConnectionId = faker.string.uuid(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${fakeConnectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); -}); +test.serial( + `${currentTest} should throw exception when connection id passed in request is incorrect`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const _connectionId = JSON.parse(createdConnection.text).id; + const fakeConnectionId = faker.string.uuid(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${fakeConnectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + }, +); -test.serial(`${currentTest} should throw exception when tableName passed in request is incorrect`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${fakeTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 400); - t.is(createTableWidgetRO.message, Messages.TABLE_NOT_FOUND); -}); +test.serial( + `${currentTest} should throw exception when tableName passed in request is incorrect`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${fakeTableName}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 400); + t.is(createTableWidgetRO.message, Messages.TABLE_NOT_FOUND); + }, +); -test.serial(`${currentTest} should throw exception when tableName not passed in request`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const fakeTableName = ''; - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${fakeTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 400); - t.is(createTableWidgetRO.message, Messages.TABLE_NAME_MISSING); -}); +test.serial( + `${currentTest} should throw exception when tableName not passed in request`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const fakeTableName = ""; + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${fakeTableName}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 400); + t.is(createTableWidgetRO.message, Messages.TABLE_NAME_MISSING); + }, +); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts index 5c88eb0ce..734295c0f 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts @@ -1,3725 +1,4435 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable security/detect-object-injection */ -import { faker } from '@faker-js/faker'; -import { INestApplication, ValidationPipe } from '@nestjs/common'; -import { Test } from '@nestjs/testing'; -import test from 'ava'; -import cookieParser from 'cookie-parser'; -import request from 'supertest'; -import { ApplicationModule } from '../../../src/app.module.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; -import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; -import { Messages } from '../../../src/exceptions/text/messages.js'; -import { Cacher } from '../../../src/helpers/cache/cacher.js'; -import { Constants } from '../../../src/helpers/constants/constants.js'; -import { DatabaseModule } from '../../../src/shared/database/database.module.js'; -import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { MockFactory } from '../../mock.factory.js'; -import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; -import { TestUtils } from '../../utils/test.utils.js'; -import { createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection } from '../../utils/user-with-different-permissions-utils.js'; -import { inviteUserInCompanyAndAcceptInvitation } from '../../utils/register-user-and-return-user-info.js'; -import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; -import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; -import { ValidationError } from 'class-validator'; -import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { faker } from "@faker-js/faker"; +import { INestApplication, ValidationPipe } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import test from "ava"; +import { ValidationError } from "class-validator"; +import cookieParser from "cookie-parser"; +import request from "supertest"; +import { ApplicationModule } from "../../../src/app.module.js"; +import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { + AccessLevelEnum, + QueryOrderingEnum, +} from "../../../src/enums/index.js"; +import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; +import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; +import { Messages } from "../../../src/exceptions/text/messages.js"; +import { Cacher } from "../../../src/helpers/cache/cacher.js"; +import { Constants } from "../../../src/helpers/constants/constants.js"; +import { DatabaseModule } from "../../../src/shared/database/database.module.js"; +import { DatabaseService } from "../../../src/shared/database/database.service.js"; +import { MockFactory } from "../../mock.factory.js"; +import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; +import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; +import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; +import { TestUtils } from "../../utils/test.utils.js"; +import { createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection } from "../../utils/user-with-different-permissions-utils.js"; let app: INestApplication; let _testUtils: TestUtils; let currentTest: string; const mockFactory = new MockFactory(); -const newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); +const newConnectionToPostgres = + mockFactory.generateConnectionToTestPostgresDBInDocker(); test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error("After tests error " + e); + } }); // Connection controller -currentTest = 'GET /connections/'; - -test.serial(`${currentTest} should return connections, where second user have access`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const findAll = await request(app.getHttpServer()) - .get('/connections') - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - - t.is(findAll.status, 200); - - const result = findAll.body.connections; - t.is(result.length, 1); - t.is(Object.hasOwn(result[0], 'connection'), true); - t.is(Object.hasOwn(result[0], 'accessLevel'), true); - t.is(result[0].accessLevel, AccessLevelEnum.edit); - - t.is(Object.hasOwn(result[0], 'accessLevel'), true); - t.is(Object.hasOwn(result[0].connection, 'host'), true); - t.is(Object.hasOwn(result[0].connection, 'host'), true); - t.is(typeof result[0].connection.port, 'number'); - t.is(Object.hasOwn(result[0].connection, 'port'), true); - t.is(Object.hasOwn(result[0].connection, 'username'), true); - t.is(Object.hasOwn(result[0].connection, 'database'), true); - t.is(Object.hasOwn(result[0].connection, 'sid'), true); - t.is(Object.hasOwn(result[0].connection, 'createdAt'), true); - t.is(Object.hasOwn(result[0].connection, 'updatedAt'), true); - t.is(Object.hasOwn(result[0].connection, 'password'), false); - t.is(Object.hasOwn(result[0].connection, 'groups'), false); - t.is(Object.hasOwn(result[0].connection, 'author'), false); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /connections/"; -currentTest = 'GET /connection/one/:slug'; +test.serial( + `${currentTest} should return connections, where second user have access`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const findAll = await request(app.getHttpServer()) + .get("/connections") + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + + t.is(findAll.status, 200); + + const result = findAll.body.connections; + t.is(result.length, 1); + t.is(Object.hasOwn(result[0], "connection"), true); + t.is(Object.hasOwn(result[0], "accessLevel"), true); + t.is(result[0].accessLevel, AccessLevelEnum.edit); + + t.is(Object.hasOwn(result[0], "accessLevel"), true); + t.is(Object.hasOwn(result[0].connection, "host"), true); + t.is(Object.hasOwn(result[0].connection, "host"), true); + t.is(typeof result[0].connection.port, "number"); + t.is(Object.hasOwn(result[0].connection, "port"), true); + t.is(Object.hasOwn(result[0].connection, "username"), true); + t.is(Object.hasOwn(result[0].connection, "database"), true); + t.is(Object.hasOwn(result[0].connection, "sid"), true); + t.is(Object.hasOwn(result[0].connection, "createdAt"), true); + t.is(Object.hasOwn(result[0].connection, "updatedAt"), true); + t.is(Object.hasOwn(result[0].connection, "password"), false); + t.is(Object.hasOwn(result[0].connection, "groups"), false); + t.is(Object.hasOwn(result[0].connection, "author"), false); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "GET /connection/one/:slug"; test.serial(`${currentTest} should return a found connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const searchedConnectionId = testData.connections.firstId; - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - - const result = findOneResponce.body.connection; - - t.is(result.title, newConnectionToPostgres.title); - t.is(result.type, 'postgres'); - t.is(result.host, newConnectionToPostgres.host); - t.is(typeof result.port, 'number'); - t.is(result.port, newConnectionToPostgres.port); - t.is(result.username, 'postgres'); - t.is(result.database, newConnectionToPostgres.database); - t.is(result.sid, null); - t.is(Object.hasOwn(result, 'createdAt'), true); - t.is(Object.hasOwn(result, 'updatedAt'), true); - t.is(Object.hasOwn(result, 'password'), false); - t.is(Object.hasOwn(result, 'groups'), false); - t.is(Object.hasOwn(result, 'author'), false); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const searchedConnectionId = testData.connections.firstId; + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + t.is(findOneResponce.status, 200); + + const result = findOneResponce.body.connection; + + t.is(result.title, newConnectionToPostgres.title); + t.is(result.type, "postgres"); + t.is(result.host, newConnectionToPostgres.host); + t.is(typeof result.port, "number"); + t.is(result.port, newConnectionToPostgres.port); + t.is(result.username, "postgres"); + t.is(result.database, newConnectionToPostgres.database); + t.is(result.sid, null); + t.is(Object.hasOwn(result, "createdAt"), true); + t.is(Object.hasOwn(result, "updatedAt"), true); + t.is(Object.hasOwn(result, "password"), false); + t.is(Object.hasOwn(result, "groups"), false); + t.is(Object.hasOwn(result, "author"), false); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} should throw an exception, when you do not have permission in this connection`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const searchedConnectionId = testData.connections.secondId; - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - const findOneRO = JSON.parse(findOneResponce.text); - const connectionKeys: Array = Object.keys(findOneRO.connection); - for (const keyName of connectionKeys) { - t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(keyName), true); - } - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should throw an exception, when you do not have permission in this connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const searchedConnectionId = testData.connections.secondId; + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + t.is(findOneResponce.status, 200); + const findOneRO = JSON.parse(findOneResponce.text); + const connectionKeys: Array = Object.keys(findOneRO.connection); + for (const keyName of connectionKeys) { + t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(keyName), true); + } + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'PUT /connection'; +currentTest = "PUT /connection"; test.serial(`${currentTest} should return updated connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const updateConnection = mockFactory.generateUpdateConnectionDto(); - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${testData.connections.firstId}`) - .send(updateConnection) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 200); - const result = updateConnectionResponse.body.connection; - - t.is(result.title, 'Updated Test Connection'); - t.is(result.type, 'postgres'); - t.is(result.host, 'testing_nestjs'); - t.is(typeof result.port, 'number'); - t.is(result.port, 5432); - t.is(result.username, 'admin'); - t.is(result.database, 'testing_nestjs'); - t.is(result.sid, null); - t.is(Object.hasOwn(result, 'createdAt'), true); - t.is(Object.hasOwn(result, 'updatedAt'), true); - t.is(Object.hasOwn(result, 'password'), false); - t.is(Object.hasOwn(result, 'groups'), false); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const updateConnection = mockFactory.generateUpdateConnectionDto(); + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${testData.connections.firstId}`) + .send(updateConnection) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 200); + const result = updateConnectionResponse.body.connection; + + t.is(result.title, "Updated Test Connection"); + t.is(result.type, "postgres"); + t.is(result.host, "testing_nestjs"); + t.is(typeof result.port, "number"); + t.is(result.port, 5432); + t.is(result.username, "admin"); + t.is(result.database, "testing_nestjs"); + t.is(result.sid, null); + t.is(Object.hasOwn(result, "createdAt"), true); + t.is(Object.hasOwn(result, "updatedAt"), true); + t.is(Object.hasOwn(result, "password"), false); + t.is(Object.hasOwn(result, "groups"), false); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const updateConnection = mockFactory.generateUpdateConnectionDto(); - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${testData.connections.secondId}`) - .send(updateConnection) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const updateConnection = mockFactory.generateUpdateConnectionDto(); + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${testData.connections.secondId}`) + .send(updateConnection) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'DELETE /connection/:slug'; +currentTest = "DELETE /connection/:slug"; test.serial(`${currentTest} should return delete result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const result = response.body; - - //deleted connection not found in database - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 400); - const { message } = JSON.parse(findOneResponce.text); - t.is(message, Messages.CONNECTION_NOT_FOUND); - - t.is(response.status, 200); - - t.is(Object.hasOwn(result, 'id'), false); - t.is(result.title, newConnectionToPostgres.title); - t.is(result.type, 'postgres'); - t.is(result.host, newConnectionToPostgres.host); - t.is(typeof result.port, 'number'); - t.is(result.port, newConnectionToPostgres.port); - t.is(result.username, 'postgres'); - t.is(result.database, newConnectionToPostgres.database); - t.is(result.sid, null); - t.is(Object.hasOwn(result, 'createdAt'), true); - t.is(Object.hasOwn(result, 'updatedAt'), true); - t.is(Object.hasOwn(result, 'password'), false); - t.is(Object.hasOwn(result, 'groups'), false); - t.is(Object.hasOwn(result, 'author'), false); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const result = response.body; + + //deleted connection not found in database + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 400); + const { message } = JSON.parse(findOneResponce.text); + t.is(message, Messages.CONNECTION_NOT_FOUND); + + t.is(response.status, 200); + + t.is(Object.hasOwn(result, "id"), false); + t.is(result.title, newConnectionToPostgres.title); + t.is(result.type, "postgres"); + t.is(result.host, newConnectionToPostgres.host); + t.is(typeof result.port, "number"); + t.is(result.port, newConnectionToPostgres.port); + t.is(result.username, "postgres"); + t.is(result.database, newConnectionToPostgres.database); + t.is(result.sid, null); + t.is(Object.hasOwn(result, "createdAt"), true); + t.is(Object.hasOwn(result, "updatedAt"), true); + t.is(Object.hasOwn(result, "password"), false); + t.is(Object.hasOwn(result, "groups"), false); + t.is(Object.hasOwn(result, "author"), false); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} should throw an exception, when you try to delete connection without permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${testData.connections.secondId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //connection wasn't deleted - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should throw an exception, when you try to delete connection without permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${testData.connections.secondId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //connection wasn't deleted + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'POST /connection/group/:slug'; +currentTest = "POST /connection/group/:slug"; test.serial(`${currentTest} should return a created group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - const result = JSON.parse(createGroupResponse.text); - - t.is(result.title, newGroup1.title); - t.is(Object.hasOwn(result, 'users'), true); - t.is(typeof result.users, 'object'); - t.is(result.users.length, 1); - t.is(result.users[0].email, testData.users.simpleUserEmail.toLowerCase()); - t.is(result.users[0].isActive, true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + const result = JSON.parse(createGroupResponse.text); + + t.is(result.title, newGroup1.title); + t.is(Object.hasOwn(result, "users"), true); + t.is(typeof result.users, "object"); + t.is(result.users.length, 1); + t.is(result.users[0].email, testData.users.simpleUserEmail.toLowerCase()); + t.is(result.users[0].isActive, true); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} should throw an exception when you try add group in connection without permission in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.secondId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should throw an exception when you try add group in connection without permission in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.secondId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'PUT /connection/group/delete/:slug'; - -test.serial(`${currentTest} should return connection without deleted group result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - let result = createGroupResponse.body; - - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - let response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - //after deleting group - result = response.body; - t.is(response.status, 200); - t.is(Object.hasOwn(result, 'title'), true); - t.is(result.title, createGroupRO.title); - t.is(result.isMain, false); - // check that group was deleted - - response = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - result = JSON.parse(response.text); - t.is(result.length, 1); - const _groupId = result[0].group.id; - - t.is(Object.hasOwn(result[0].group, 'title'), true); - t.is(result[0].accessLevel, AccessLevelEnum.edit); - - const index = result.findIndex((el: any) => { - return el.group.title === 'Admin'; - }); - - t.is(index >= 0, true); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "PUT /connection/group/delete/:slug"; test.serial( - `${currentTest} should throw an exception, when you try delete group in connection without permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.secondId}`) - .set('Cookie', testData.users.adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - const result = createGroupResponse.body; - - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${testData.connections.secondId}`) - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return connection without deleted group result`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + let result = createGroupResponse.body; + + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + let response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + //after deleting group + result = response.body; + t.is(response.status, 200); + t.is(Object.hasOwn(result, "title"), true); + t.is(result.title, createGroupRO.title); + t.is(result.isMain, false); + // check that group was deleted + + response = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + result = JSON.parse(response.text); + t.is(result.length, 1); + const _groupId = result[0].group.id; + + t.is(Object.hasOwn(result[0].group, "title"), true); + t.is(result[0].accessLevel, AccessLevelEnum.edit); + + const index = result.findIndex((el: any) => { + return el.group.title === "Admin"; + }); + + t.is(index >= 0, true); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'GET /connection/groups/:slug'; +test.serial( + `${currentTest} should throw an exception, when you try delete group in connection without permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.secondId}`) + .set("Cookie", testData.users.adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + const result = createGroupResponse.body; + + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${testData.connections.secondId}`) + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "GET /connection/groups/:slug"; test.serial(`${currentTest} return should groups in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - const _groupId = result[0].group.id; - - t.is(Object.hasOwn(result[1].group, 'title'), true); - t.is(result[0].accessLevel, AccessLevelEnum.edit); - - const index = result.findIndex((el: any) => el.group.title === 'Admin'); - - t.is(index >= 0, true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + const _groupId = result[0].group.id; + + t.is(Object.hasOwn(result[1].group, "title"), true); + t.is(result[0].accessLevel, AccessLevelEnum.edit); + + const index = result.findIndex((el: any) => el.group.title === "Admin"); + + t.is(index >= 0, true); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.secondId}`) - .set('Cookie', testData.users.adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.secondId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - - const result = JSON.parse(response.text); - t.is(result.length, 0); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.secondId}`) + .set("Cookie", testData.users.adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.secondId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + + const result = JSON.parse(response.text); + t.is(result.length, 0); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'GET /connection/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const result = JSON.parse(response.text); - t.is(response.status, 200); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, testData.connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.edit); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table) => table.tableName === testData.firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[0], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, false); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, false); - t.is(tables[tableIndex].accessLevel.delete, false); - t.is(tables[tableIndex].accessLevel.edit, false); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, false); - t.is(tables[tableIndex].accessLevel.visibility, false); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.edit, false); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /connection/permissions"; -currentTest = 'GET /connection/user/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, testData.connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.edit); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table) => table.tableName === testData.firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[0], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, true); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, true); - t.is(tables[tableIndex].accessLevel.delete, true); - t.is(tables[tableIndex].accessLevel.edit, true); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, true); - t.is(tables[tableIndex].accessLevel.visibility, true); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.edit, true); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const result = JSON.parse(response.text); + t.is(response.status, 200); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, testData.connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.edit); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table) => table.tableName === testData.firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[0], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is(tables[tableIndex].accessLevel.visibility, false); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, false); + t.is(tables[tableIndex].accessLevel.delete, false); + t.is(tables[tableIndex].accessLevel.edit, false); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, false); + t.is(tables[tableIndex].accessLevel.visibility, false); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.edit, false); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "GET /connection/user/permissions"; test.serial( - `${currentTest} should return permissions object for current group in current connection for current user`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.secondId}`) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${testData.connections.secondId}&groupId=${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, testData.connections.secondId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table) => table.tableName === testData.secondTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[0], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, false); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, false); - t.is(tables[tableIndex].accessLevel.delete, false); - t.is(tables[tableIndex].accessLevel.edit, false); - t.is(tables[tableIndex].accessLevel.edit, false); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, testData.connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.edit); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table) => table.tableName === testData.firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[0], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is(tables[tableIndex].accessLevel.visibility, true); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, true); + t.is(tables[tableIndex].accessLevel.delete, true); + t.is(tables[tableIndex].accessLevel.edit, true); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, true); + t.is(tables[tableIndex].accessLevel.visibility, true); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.edit, true); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +test.serial( + `${currentTest} should return permissions object for current group in current connection for current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.secondId}`) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${testData.connections.secondId}&groupId=${groupId}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, testData.connections.secondId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table) => table.tableName === testData.secondTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[0], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is(tables[tableIndex].accessLevel.visibility, false); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, false); + t.is(tables[tableIndex].accessLevel.delete, false); + t.is(tables[tableIndex].accessLevel.edit, false); + t.is(tables[tableIndex].accessLevel.edit, false); + } catch (error) { + console.error(error); + throw error; + } + }, ); //****************************** GROUP CONTROLLER -currentTest = 'GET /groups/'; - -test.serial(`${currentTest} should return found groups with current user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/groups/`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const { groups, groupsCount } = getGroupsRO; - t.is(groupsCount, 1); - t.is(groups.length, 1); - t.is(Object.hasOwn(groups[0], 'group'), true); - t.is(Object.hasOwn(groups[0], 'accessLevel'), true); - - t.is(Object.hasOwn(groups[0].group, 'title'), true); - t.is(Object.hasOwn(groups[0].group, 'isMain'), true); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /groups/"; -currentTest = 'GET /group/users/:slug'; +test.serial( + `${currentTest} should return found groups with current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/groups/`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const { groups, groupsCount } = getGroupsRO; + t.is(groupsCount, 1); + t.is(groups.length, 1); + t.is(Object.hasOwn(groups[0], "group"), true); + t.is(Object.hasOwn(groups[0], "accessLevel"), true); + + t.is(Object.hasOwn(groups[0].group, "title"), true); + t.is(Object.hasOwn(groups[0].group, "isMain"), true); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "GET /group/users/:slug"; test.serial(`${currentTest} it should return users in group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.length, 2); - t.is(getUsersRO[0].id === getUsersRO[1].id, false); - t.is(Object.hasOwn(getUsersRO[0], 'createdAt'), true); - t.is(Object.hasOwn(getUsersRO[0], 'password'), false); - t.is(Object.hasOwn(getUsersRO[0], 'isActive'), true); - t.is(Object.hasOwn(getUsersRO[0], 'email'), true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.length, 2); + t.is(getUsersRO[0].id === getUsersRO[1].id, false); + t.is(Object.hasOwn(getUsersRO[0], "createdAt"), true); + t.is(Object.hasOwn(getUsersRO[0], "password"), false); + t.is(Object.hasOwn(getUsersRO[0], "isActive"), true); + t.is(Object.hasOwn(getUsersRO[0], "email"), true); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.secondId}`) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.secondId}`) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'PUT /group/user'; +currentTest = "PUT /group/user"; test.serial(`${currentTest} should return group with added user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text).group; - - t.is(Object.hasOwn(addUserInGroupRO, 'title'), true); - t.is(Object.hasOwn(addUserInGroupRO, 'isMain'), true); - t.is(Object.hasOwn(addUserInGroupRO, 'users'), true); - const { users } = addUserInGroupRO; - t.is(users.length, 3); - t.is(users[0].id === users[1].id, false); - t.is(users[1].id === users[2].id, false); - t.is(users[2].id === users[0].id, false); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text).group; + + t.is(Object.hasOwn(addUserInGroupRO, "title"), true); + t.is(Object.hasOwn(addUserInGroupRO, "isMain"), true); + t.is(Object.hasOwn(addUserInGroupRO, "users"), true); + const { users } = addUserInGroupRO; + t.is(users.length, 3); + t.is(users[0].id === users[1].id, false); + t.is(users[1].id === users[2].id, false); + t.is(users[2].id === users[0].id, false); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw exception, when user email not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const email = faker.internet.email(); - const groupId = faker.string.uuid(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const email = faker.internet.email(); + const groupId = faker.string.uuid(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'DELETE /group/:slug'; - -test.serial(`${currentTest} should delete result after group deletion`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = JSON.parse(createGroupResponse.text).id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.title, newGroup1.title); - t.is(deleteGroupRO.isMain, false); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "DELETE /group/:slug"; -test.serial(`${currentTest} should throw an exception when you try delete admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should delete result after group deletion`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = JSON.parse(createGroupResponse.text).id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.title, newGroup1.title); + t.is(deleteGroupRO.isMain, false); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteGroupResponse.status, 404); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when you try delete admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = faker.string.uuid(); - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteGroupResponse.status, 404); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'PUT /group/user/delete'; - -test.serial(`${currentTest} should return group without deleted user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addUserInGroupResponse.status, 200); - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - - t.is(Object.hasOwn(deleteUserInGroupRO, 'title'), true); - t.is(Object.hasOwn(deleteUserInGroupRO, 'isMain'), true); - t.is(Object.hasOwn(deleteUserInGroupRO, 'users'), true); - const { users } = deleteUserInGroupRO; - t.is(users.length, 2); - t.is(users[0].id === users[1].id, false); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = faker.string.uuid(); + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const _email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "PUT /group/user/delete"; -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', testData.users.simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should return group without deleted user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addUserInGroupResponse.status, 200); + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + + t.is(Object.hasOwn(deleteUserInGroupRO, "title"), true); + t.is(Object.hasOwn(deleteUserInGroupRO, "isMain"), true); + t.is(Object.hasOwn(deleteUserInGroupRO, "users"), true); + const { users } = deleteUserInGroupRO; + t.is(users.length, 2); + t.is(users[0].id === users[1].id, false); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - let groupId = getGroupsRO[0].group.id; - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - groupId = faker.string.uuid(); - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw exception, when user email not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const _email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", testData.users.simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + let groupId = getGroupsRO[0].group.id; + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + groupId = faker.string.uuid(); + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); //****************************** PERMISSION CONTROLLER -currentTest = 'PUT permissions/:slug'; +currentTest = "PUT permissions/:slug"; test.serial( - `${currentTest} should return created complex permissions object when you create permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - accessLevel: AccessLevelEnum.readonly, - connectionId: testData.connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: newGroupId, - }, - tables: [ - { - accessLevel: { - add: true, - delete: true, - edit: false, - readonly: false, - visibility: true, - }, - tableName: testData.firstTableInfo.testTableName, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 200); - t.is(JSON.stringify(createOrUpdatePermissionRO.connection), JSON.stringify(permissions.connection)); - t.is(JSON.stringify(createOrUpdatePermissionRO.group), JSON.stringify(permissions.group)); - t.is(JSON.stringify(createOrUpdatePermissionRO.tables), JSON.stringify(permissions.tables)); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return created complex permissions object when you create permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + accessLevel: AccessLevelEnum.readonly, + connectionId: testData.connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: newGroupId, + }, + tables: [ + { + accessLevel: { + add: true, + delete: true, + edit: false, + readonly: false, + visibility: true, + }, + tableName: testData.firstTableInfo.testTableName, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 200); + t.is( + JSON.stringify(createOrUpdatePermissionRO.connection), + JSON.stringify(permissions.connection), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.group), + JSON.stringify(permissions.group), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.tables), + JSON.stringify(permissions.tables), + ); + } catch (error) { + console.error(error); + throw error; + } + }, ); test.serial( - `${currentTest} should return updated complex permissions object when you update permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - let permissions = { - connection: { - accessLevel: AccessLevelEnum.readonly, - connectionId: testData.connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: newGroupId, - }, - tables: [ - { - accessLevel: { - add: true, - delete: true, - edit: false, - readonly: false, - visibility: true, - }, - tableName: testData.firstTableInfo.testTableName, - }, - ], - }; - - let createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - let createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - JSON.stringify(createOrUpdatePermissionRO); - t.is(createOrUpdatePermissionResponse.status, 200); - t.is(JSON.stringify(createOrUpdatePermissionRO.connection), JSON.stringify(permissions.connection)); - t.is(JSON.stringify(createOrUpdatePermissionRO.group), JSON.stringify(permissions.group)); - t.is(JSON.stringify(createOrUpdatePermissionRO.tables), JSON.stringify(permissions.tables)); - - //************************ WHEN YOU UPDATE PERMISSIONS - - permissions = { - connection: { - accessLevel: AccessLevelEnum.none, - connectionId: testData.connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: newGroupId, - }, - tables: [ - { - accessLevel: { - add: false, - delete: false, - edit: true, - readonly: false, - visibility: true, - }, - tableName: testData.firstTableInfo.testTableName, - }, - ], - }; - - createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - JSON.stringify(createOrUpdatePermissionRO); - t.is(createOrUpdatePermissionResponse.status, 200); - t.is(JSON.stringify(createOrUpdatePermissionRO.connection), JSON.stringify(permissions.connection)); - t.is(JSON.stringify(createOrUpdatePermissionRO.group), JSON.stringify(permissions.group)); - t.is(JSON.stringify(createOrUpdatePermissionRO.tables), JSON.stringify(permissions.tables)); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return updated complex permissions object when you update permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + let permissions = { + connection: { + accessLevel: AccessLevelEnum.readonly, + connectionId: testData.connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: newGroupId, + }, + tables: [ + { + accessLevel: { + add: true, + delete: true, + edit: false, + readonly: false, + visibility: true, + }, + tableName: testData.firstTableInfo.testTableName, + }, + ], + }; + + let createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + let createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + JSON.stringify(createOrUpdatePermissionRO); + t.is(createOrUpdatePermissionResponse.status, 200); + t.is( + JSON.stringify(createOrUpdatePermissionRO.connection), + JSON.stringify(permissions.connection), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.group), + JSON.stringify(permissions.group), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.tables), + JSON.stringify(permissions.tables), + ); + + //************************ WHEN YOU UPDATE PERMISSIONS + + permissions = { + connection: { + accessLevel: AccessLevelEnum.none, + connectionId: testData.connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: newGroupId, + }, + tables: [ + { + accessLevel: { + add: false, + delete: false, + edit: true, + readonly: false, + visibility: true, + }, + tableName: testData.firstTableInfo.testTableName, + }, + ], + }; + + createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + JSON.stringify(createOrUpdatePermissionRO); + t.is(createOrUpdatePermissionResponse.status, 200); + t.is( + JSON.stringify(createOrUpdatePermissionRO.connection), + JSON.stringify(permissions.connection), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.group), + JSON.stringify(permissions.group), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.tables), + JSON.stringify(permissions.tables), + ); + } catch (error) { + console.error(error); + throw error; + } + }, ); -test.serial(`${currentTest} should throw an exception, when you try change admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.edit, - }, - group: { - groupId: testData.groups.firstAdminGroupId, - accessLevel: AccessLevelEnum.none, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${testData.groups.firstAdminGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 400); - t.is(createOrUpdatePermissionRO.message, Messages.CANNOT_CHANGE_ADMIN_GROUP); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception, when you try change admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.edit, + }, + group: { + groupId: testData.groups.firstAdminGroupId, + accessLevel: AccessLevelEnum.none, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${testData.groups.firstAdminGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 400); + t.is( + createOrUpdatePermissionRO.message, + Messages.CANNOT_CHANGE_ADMIN_GROUP, + ); + } catch (error) { + console.error(error); + throw error; + } + }, +); //****************************** TABLE CONTROLLER -currentTest = 'GET /connection/tables/:slug'; - -test.serial(`${currentTest} should return all tables in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - // create group without visibility table permission - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.length > 0, true); - const tableIndex = getTablesInConnectionRO.findIndex( - (tableItem) => tableItem.table === testData.firstTableInfo.testTableName, - ); - t.is(getTablesInConnectionRO[tableIndex].table, testData.firstTableInfo.testTableName); - t.is(typeof getTablesInConnectionRO[tableIndex].permissions, 'object'); - const { visibility, readonly, add, delete: del, edit } = getTablesInConnectionRO[tableIndex].permissions; - t.is(visibility, true); - t.is(readonly, false); - t.is(del, true); - t.is(edit, true); - t.is(add, true); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /connection/tables/:slug"; -test.serial(`${currentTest} should throw an exception, when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 404); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should return all tables in connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + // create group without visibility table permission + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.length > 0, true); + const tableIndex = getTablesInConnectionRO.findIndex( + (tableItem) => + tableItem.table === testData.firstTableInfo.testTableName, + ); + t.is( + getTablesInConnectionRO[tableIndex].table, + testData.firstTableInfo.testTableName, + ); + t.is(typeof getTablesInConnectionRO[tableIndex].permissions, "object"); + const { + visibility, + readonly, + add, + delete: del, + edit, + } = getTablesInConnectionRO[tableIndex].permissions; + t.is(visibility, true); + t.is(readonly, false); + t.is(del, true); + t.is(edit, true); + t.is(add, true); + } catch (error) { + console.error(error); + throw error; + } + }, +); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - // create group without visibility table permission - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: 'users', - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeConnectionId = faker.string.uuid(); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${fakeConnectionId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 400); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should throw an exception, when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 404); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'GET /table/rows/:slug'; +test.serial( + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + // create group without visibility table permission + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: "users", + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeConnectionId = faker.string.uuid(); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 400); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "GET /table/rows/:slug"; test.serial(`${currentTest} should return found rows from table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - const { rows, primaryColumns, pagination, sortable_by, structure, foreignKeys } = getTablesInConnectionRO; - t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(sortable_by.length, 0); - t.is(structure.length, 5); - t.is(foreignKeys.length, 0); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesInConnection = await request(app.getHttpServer()) + .get( + `/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + const { + rows, + primaryColumns, + pagination, + sortable_by, + structure, + foreignKeys, + } = getTablesInConnectionRO; + t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(sortable_by.length, 0); + t.is(structure.length, 5); + t.is(foreignKeys.length, 0); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/table/rows/?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 404); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/table/rows/?tableName=${testData.firstTableInfo.testTableName}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 404); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeId = faker.string.uuid(); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 403); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeId = faker.string.uuid(); + const getTablesInConnection = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 403); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/table/rows/${testData.connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 400); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesInConnection = await request(app.getHttpServer()) + .get( + `/table/rows/${testData.connections.firstId}?tableName=${fakeTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 400); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'GET /table/structure/:slug'; +currentTest = "GET /table/structure/:slug"; test.serial(`${currentTest} should return table structure`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 200); - const getTableStructureRO = JSON.parse(getTablesStructure.text); - const { structure, primaryColumns, foreignKeys, readonly_fields, table_widgets } = getTableStructureRO; - t.is(structure.length, 5); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(readonly_fields.length, 0); - t.is(table_widgets.length, 0); - t.is(foreignKeys.length, 0); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 200); + const getTableStructureRO = JSON.parse(getTablesStructure.text); + const { + structure, + primaryColumns, + foreignKeys, + readonly_fields, + table_widgets, + } = getTableStructureRO; + t.is(structure.length, 5); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(readonly_fields.length, 0); + t.is(table_widgets.length, 0); + t.is(foreignKeys.length, 0); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 404); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 404); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeConnectionId = faker.string.uuid(); - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${fakeConnectionId}?tableName=users`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeConnectionId = faker.string.uuid(); + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?tableName=users`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${testData.connections.firstId}?tableName=`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${testData.connections.firstId}?tableName=`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${testData.connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${testData.connections.firstId}?tableName=${fakeTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'POST /table/row/:slug'; +currentTest = "POST /table/row/:slug"; test.serial(`${currentTest} should return added row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTable.status, 201); - t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); - t.is(addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], randomName); - t.is(addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], randomEmail); - t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTable.status, 201); + t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); + t.is( + addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], + randomName, + ); + t.is( + addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], + randomEmail, + ); + t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(addRowInTableRO, "structure"), true); + t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'PUT /table/row/:slug'; +currentTest = "PUT /table/row/:slug"; test.serial(`${currentTest} should return updated row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=2`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(updateRowInTable.text); - t.is(updateRowInTable.status, 200); - t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); - t.is(addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], randomName); - t.is(addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], randomEmail); - t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const updateRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=2`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(updateRowInTable.text); + t.is(updateRowInTable.status, 200); + t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); + t.is( + addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], + randomName, + ); + t.is( + addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], + randomEmail, + ); + t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(addRowInTableRO, "structure"), true); + t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'DELETE /table/row/:slug'; +currentTest = "DELETE /table/row/:slug"; test.serial(`${currentTest} should return delete result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - // create group without visibility table permission - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=1`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteRowInTable.status, 200); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + // create group without visibility table permission + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=1`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteRowInTable.status, 200); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeConnectionId = faker.string.uuid(); - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - t.is(deleteRowInTable.status, 403); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeConnectionId = faker.string.uuid(); + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 403); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTabbleRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTabbleRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'GET /table/row/:slug'; +currentTest = "GET /table/row/:slug"; test.serial(`${currentTest} `, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - // create group without visibility table permission - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=5`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getRowInTable.text); - t.is(getRowInTable.status, 200); - t.is(getRowInTableRO.row.id, 5); - t.is(Object.hasOwn(getRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(getRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(getRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(getRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(getRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getRowInTableRO, 'readonly_fields'), true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + // create group without visibility table permission + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=5`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getRowInTable.text); + t.is(getRowInTable.status, 200); + t.is(getRowInTableRO.row.id, 5); + t.is(Object.hasOwn(getRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(getRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(getRowInTableRO, "structure"), true); + t.is(Object.hasOwn(getRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(getRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(getRowInTableRO, "readonly_fields"), true); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=5`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=5`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=5`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=5`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); //****************************** TABLE LOGS CONTROLLER -currentTest = 'GET /logs/:slug'; - -test.serial(`${currentTest} should return all found logs in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - /* eslint-disable */ - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${testData.connections.firstId}`) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 1); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'table_name'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'received_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'old_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'cognitoUserName'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'email'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationType'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationStatusResult'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'createdAt'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'connection_id'), true); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /logs/:slug"; + +test.serial( + `${currentTest} should return all found logs in connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + /* eslint-disable */ + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${testData.connections.firstId}`) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 1); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "table_name"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "received_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "old_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "cognitoUserName"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "email"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "operationType"), true); + t.is( + Object.hasOwn(getRowInTableRO.logs[0], "operationStatusResult"), + true, + ); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "createdAt"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "connection_id"), true); + } catch (error) { + console.error(error); + throw error; + } + }, +); test.serial( - `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - - const updateConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 200); - - const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded( - firstTableInfo.testTableName, - false, - ); - - const createConnectionPropertiesResponse = await request(app.getHttpServer()) - .post(`/connection/properties/${connections.firstId}`) - .send(newConnectionProperties) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createConnectionPropertiesResponse.status, 201); - - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + + const updateConnection = + mockFactory.generateConnectionToTestPostgresDBInDocker(); + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 200); + + const newConnectionProperties = + mockFactory.generateConnectionPropertiesUserExcluded( + firstTableInfo.testTableName, + false, + ); + + const createConnectionPropertiesResponse = await request( + app.getHttpServer(), + ) + .post(`/connection/properties/${connections.firstId}`) + .send(newConnectionProperties) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createConnectionPropertiesResponse.status, 201); + + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE SETTINGS CONTROLLER -currentTest = 'GET /settings/'; - -test.serial(`${currentTest} should return empty table settings when it was not created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${testData.connections.firstId}&tableName=users`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /settings/"; -test.serial(`${currentTest} should return table settings when it was created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(Object.hasOwn(getTableSettingsRO, 'id'), true); - t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); - t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); - t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); - t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is( - JSON.stringify(getTableSettingsRO.list_fields), - JSON.stringify(createTableSettingsDTO.list_fields.concat(['id', 'created_at', 'updated_at'])), - ); - t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); - t.is(getTableSettingsRO.list_per_page, createTableSettingsDTO.list_per_page); - t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering); - t.is(getTableSettingsRO.ordering_field, createTableSettingsDTO.ordering_field); - t.is(JSON.stringify(getTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(getTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); - t.is(JSON.stringify(getTableSettingsRO.autocomplete_columns), JSON.stringify([])); - t.is(getTableSettingsRO.connection_id, testData.connections.firstId); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should return empty table settings when it was not created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${testData.connections.firstId}&tableName=users`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); + } catch (error) { + console.error(error); + throw error; + } + }, +); test.serial( - `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get( - `/settings/?connectionId=${testData.connections.secondId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return table settings when it was created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(Object.hasOwn(getTableSettingsRO, "id"), true); + t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); + t.is( + getTableSettingsRO.display_name, + createTableSettingsDTO.display_name, + ); + t.is( + JSON.stringify(getTableSettingsRO.search_fields), + JSON.stringify(createTableSettingsDTO.search_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.excluded_fields), + JSON.stringify(createTableSettingsDTO.excluded_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.list_fields), + JSON.stringify( + createTableSettingsDTO.list_fields.concat([ + "id", + "created_at", + "updated_at", + ]), + ), + ); + t.is( + JSON.stringify(getTableSettingsRO.identification_fields), + JSON.stringify([]), + ); + t.is( + getTableSettingsRO.list_per_page, + createTableSettingsDTO.list_per_page, + ); + t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering); + t.is( + getTableSettingsRO.ordering_field, + createTableSettingsDTO.ordering_field, + ); + t.is( + JSON.stringify(getTableSettingsRO.readonly_fields), + JSON.stringify(createTableSettingsDTO.readonly_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.sortable_by), + JSON.stringify(createTableSettingsDTO.sortable_by), + ); + t.is( + JSON.stringify(getTableSettingsRO.autocomplete_columns), + JSON.stringify([]), + ); + t.is(getTableSettingsRO.connection_id, testData.connections.firstId); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'POST /settings/'; - -test.serial(`${currentTest} should return created table settings`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - t.is(Object.hasOwn(createTableSettingsRO, 'id'), true); - t.is(createTableSettingsRO.table_name, createTableSettingsDTO.table_name); - t.is(createTableSettingsRO.display_name, createTableSettingsDTO.display_name); - t.is(JSON.stringify(createTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); - t.is(JSON.stringify(createTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(createTableSettingsRO.list_fields), JSON.stringify(createTableSettingsDTO.list_fields)); - t.is(JSON.stringify(createTableSettingsRO.identification_fields), JSON.stringify([])); - t.is(createTableSettingsRO.list_per_page, createTableSettingsDTO.list_per_page); - t.is(createTableSettingsRO.ordering, createTableSettingsDTO.ordering); - t.is(createTableSettingsRO.ordering_field, createTableSettingsDTO.ordering_field); - t.is(JSON.stringify(createTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(createTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); - t.is(JSON.stringify(createTableSettingsRO.autocomplete_columns), JSON.stringify([])); - t.is(createTableSettingsRO.connection_id, testData.connections.firstId); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${testData.connections.secondId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "POST /settings/"; test.serial( - `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - - const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return created table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const createTableSettingsRO = JSON.parse( + createTableSettingsResponse.text, + ); + t.is(Object.hasOwn(createTableSettingsRO, "id"), true); + t.is(createTableSettingsRO.table_name, createTableSettingsDTO.table_name); + t.is( + createTableSettingsRO.display_name, + createTableSettingsDTO.display_name, + ); + t.is( + JSON.stringify(createTableSettingsRO.search_fields), + JSON.stringify(createTableSettingsDTO.search_fields), + ); + t.is( + JSON.stringify(createTableSettingsRO.excluded_fields), + JSON.stringify(createTableSettingsDTO.excluded_fields), + ); + t.is( + JSON.stringify(createTableSettingsRO.list_fields), + JSON.stringify(createTableSettingsDTO.list_fields), + ); + t.is( + JSON.stringify(createTableSettingsRO.identification_fields), + JSON.stringify([]), + ); + t.is( + createTableSettingsRO.list_per_page, + createTableSettingsDTO.list_per_page, + ); + t.is(createTableSettingsRO.ordering, createTableSettingsDTO.ordering); + t.is( + createTableSettingsRO.ordering_field, + createTableSettingsDTO.ordering_field, + ); + t.is( + JSON.stringify(createTableSettingsRO.readonly_fields), + JSON.stringify(createTableSettingsDTO.readonly_fields), + ); + t.is( + JSON.stringify(createTableSettingsRO.sortable_by), + JSON.stringify(createTableSettingsDTO.sortable_by), + ); + t.is( + JSON.stringify(createTableSettingsRO.autocomplete_columns), + JSON.stringify([]), + ); + t.is(createTableSettingsRO.connection_id, testData.connections.firstId); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'PUT /settings/'; - -test.serial(`${currentTest} should return updated table settings`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.ASC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .send(updateTableSettingsDTO) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const updateTableSettingsRO = JSON.parse(updateTableSettingsResponse.text); - t.is(updateTableSettingsResponse.status, 200); - - t.is(Object.hasOwn(updateTableSettingsRO, 'id'), true); - t.is(updateTableSettingsRO.table_name, updateTableSettingsDTO.table_name); - t.is(updateTableSettingsRO.display_name, updateTableSettingsDTO.display_name); - t.is(JSON.stringify(updateTableSettingsRO.search_fields), JSON.stringify(updateTableSettingsDTO.search_fields)); - t.is(JSON.stringify(updateTableSettingsRO.excluded_fields), JSON.stringify(updateTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(updateTableSettingsRO.list_fields), JSON.stringify(updateTableSettingsDTO.list_fields)); - // t.is(JSON.stringify(updateTableSettingsRO.identification_fields)).toBe(JSON.stringify([])); - t.is(updateTableSettingsRO.list_per_page, updateTableSettingsDTO.list_per_page); - t.is(updateTableSettingsRO.ordering, updateTableSettingsDTO.ordering); - t.is(updateTableSettingsRO.ordering_field, updateTableSettingsDTO.ordering_field); - t.is(JSON.stringify(updateTableSettingsRO.readonly_fields), JSON.stringify(updateTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(updateTableSettingsRO.sortable_by), JSON.stringify(updateTableSettingsDTO.sortable_by)); - // t.is(JSON.stringify(updateTableSettingsRO.autocomplete_columns)).toBe(JSON.stringify([])); - t.is(updateTableSettingsRO.connection_id, testData.connections.firstId); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + + const createTableSettingsRO = JSON.parse( + createTableSettingsResponse.text, + ); + t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "PUT /settings/"; test.serial( - `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.secondId, - testData.secondTableInfo.testTableName, - ['id'], - [testData.secondTableInfo.testTableSecondColumnName], - [testData.secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.secondTableInfo.testTableName, - ['id'], - [testData.secondTableInfo.testTableSecondColumnName], - [testData.secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.ASC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put( - `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, - ) - .send(updateTableSettingsDTO) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return updated table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.ASC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const updateTableSettingsRO = JSON.parse( + updateTableSettingsResponse.text, + ); + t.is(updateTableSettingsResponse.status, 200); + + t.is(Object.hasOwn(updateTableSettingsRO, "id"), true); + t.is(updateTableSettingsRO.table_name, updateTableSettingsDTO.table_name); + t.is( + updateTableSettingsRO.display_name, + updateTableSettingsDTO.display_name, + ); + t.is( + JSON.stringify(updateTableSettingsRO.search_fields), + JSON.stringify(updateTableSettingsDTO.search_fields), + ); + t.is( + JSON.stringify(updateTableSettingsRO.excluded_fields), + JSON.stringify(updateTableSettingsDTO.excluded_fields), + ); + t.is( + JSON.stringify(updateTableSettingsRO.list_fields), + JSON.stringify(updateTableSettingsDTO.list_fields), + ); + // t.is(JSON.stringify(updateTableSettingsRO.identification_fields)).toBe(JSON.stringify([])); + t.is( + updateTableSettingsRO.list_per_page, + updateTableSettingsDTO.list_per_page, + ); + t.is(updateTableSettingsRO.ordering, updateTableSettingsDTO.ordering); + t.is( + updateTableSettingsRO.ordering_field, + updateTableSettingsDTO.ordering_field, + ); + t.is( + JSON.stringify(updateTableSettingsRO.readonly_fields), + JSON.stringify(updateTableSettingsDTO.readonly_fields), + ); + t.is( + JSON.stringify(updateTableSettingsRO.sortable_by), + JSON.stringify(updateTableSettingsDTO.sortable_by), + ); + // t.is(JSON.stringify(updateTableSettingsRO.autocomplete_columns)).toBe(JSON.stringify([])); + t.is(updateTableSettingsRO.connection_id, testData.connections.firstId); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'DELETE /settings/'; - -test.serial(`${currentTest} should return array without deleted table settings`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete( - `/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteTableSettingsResponse.status, 200); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.secondId, + testData.secondTableInfo.testTableName, + ["id"], + [testData.secondTableInfo.testTableSecondColumnName], + [testData.secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.secondTableInfo.testTableName, + ["id"], + [testData.secondTableInfo.testTableSecondColumnName], + [testData.secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.ASC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "DELETE /settings/"; test.serial( - `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.secondId, - testData.secondTableInfo.testTableName, - ['id'], - [testData.secondTableInfo.testTableSecondColumnName], - [testData.secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete( - `/settings/?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, - ) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteTableSettingsRO = JSON.parse(deleteTableSettingsResponse.text); - t.is(deleteTableSettingsResponse.status, 403); - t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return array without deleted table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteTableSettingsResponse.status, 200); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.secondId, + testData.secondTableInfo.testTableName, + ["id"], + [testData.secondTableInfo.testTableSecondColumnName], + [testData.secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteTableSettingsRO = JSON.parse( + deleteTableSettingsResponse.text, + ); + t.is(deleteTableSettingsResponse.status, 403); + t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, ); //****************************** TABLE WIDGETS CONTROLLER -currentTest = 'GET /widgets/:slug'; +currentTest = "GET /widgets/:slug"; test.skip(`${currentTest} should return empty widgets array when widgets not created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 200); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 0); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 200); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 0); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.firstTableInfo.testTableSecondColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - getTableWidgetsRO.sort((a, b) => a.field_name.localeCompare(b.field_name)) - newTableWidgets.sort((a, b) => a.field_name.localeCompare(b.field_name)) - - t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); - t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); - - t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - getTableStructureRO.table_widgets.sort((a, b) => a.field_name.localeCompare(b.field_name)) - - t.is(getTableStructureRO.table_widgets.length, 2); - t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); - t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should return array of table widgets for table`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.firstTableInfo.testTableSecondColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + getTableWidgetsRO.sort((a, b) => + a.field_name.localeCompare(b.field_name), + ); + newTableWidgets.sort((a, b) => a.field_name.localeCompare(b.field_name)); + + t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); + t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); + + t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + getTableStructureRO.table_widgets.sort((a, b) => + a.field_name.localeCompare(b.field_name), + ); + + t.is(getTableStructureRO.table_widgets.length, 2); + t.is( + getTableStructureRO.table_widgets[0].field_name, + newTableWidgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[1].widget_type, + newTableWidgets[1].widget_type, + ); + t.is( + compareTableWidgetsArrays( + getTableStructureRO.table_widgets, + newTableWidgets, + ), + true, + ); + } catch (error) { + console.error(error); + throw error; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.secondTableInfo.testTableSecondColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 403); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.secondTableInfo.testTableSecondColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 403); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'POST /widget/:slug'; - -test.serial(`${currentTest} should return table settings with created table widget field`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.firstTableInfo.testTableSecondColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "POST /widget/:slug"; + +test.serial( + `${currentTest} should return table settings with created table widget field`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.firstTableInfo.testTableSecondColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + } catch (error) { + console.error(error); + throw error; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.firstTableInfo.testTableSecondColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${testData.connections.secondId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.firstTableInfo.testTableSecondColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${testData.connections.secondId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, ); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts index 4d3fc1483..6a0f21722 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts @@ -1,2961 +1,3577 @@ /* eslint-disable security/detect-object-injection */ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { faker } from '@faker-js/faker'; -import { INestApplication, ValidationPipe } from '@nestjs/common'; -import { Test } from '@nestjs/testing'; -import test from 'ava'; -import cookieParser from 'cookie-parser'; -import request from 'supertest'; -import { ApplicationModule } from '../../../src/app.module.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; -import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; -import { Messages } from '../../../src/exceptions/text/messages.js'; -import { Cacher } from '../../../src/helpers/cache/cacher.js'; -import { Constants } from '../../../src/helpers/constants/constants.js'; -import { DatabaseModule } from '../../../src/shared/database/database.module.js'; -import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { MockFactory } from '../../mock.factory.js'; -import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; -import { TestUtils } from '../../utils/test.utils.js'; -import { createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions } from '../../utils/user-with-different-permissions-utils.js'; -import { inviteUserInCompanyAndAcceptInvitation } from '../../utils/register-user-and-return-user-info.js'; -import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; -import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; -import { ValidationError } from 'class-validator'; -import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { faker } from "@faker-js/faker"; +import { INestApplication, ValidationPipe } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import test from "ava"; +import { ValidationError } from "class-validator"; +import cookieParser from "cookie-parser"; +import request from "supertest"; +import { ApplicationModule } from "../../../src/app.module.js"; +import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { + AccessLevelEnum, + QueryOrderingEnum, +} from "../../../src/enums/index.js"; +import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; +import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; +import { Messages } from "../../../src/exceptions/text/messages.js"; +import { Cacher } from "../../../src/helpers/cache/cacher.js"; +import { Constants } from "../../../src/helpers/constants/constants.js"; +import { DatabaseModule } from "../../../src/shared/database/database.module.js"; +import { DatabaseService } from "../../../src/shared/database/database.service.js"; +import { MockFactory } from "../../mock.factory.js"; +import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; +import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; +import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; +import { TestUtils } from "../../utils/test.utils.js"; +import { createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions } from "../../utils/user-with-different-permissions-utils.js"; let app: INestApplication; let _testUtils: TestUtils; let currentTest: string; const mockFactory = new MockFactory(); -const newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); +const newConnectionToPostgres = + mockFactory.generateConnectionToTestPostgresDBInDocker(); const updateConnection = mockFactory.generateUpdateConnectionDto(); const newGroup1 = mockFactory.generateCreateGroupDto1(); const tablePermissions = { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, }; test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error("After tests error " + e); + } }); //***************************************** USER NOT ADDED INTO ADMIN GROUP //****************************** CONNECTION CONTROLLER -currentTest = 'GET /connections/'; - -test.serial(`${currentTest} should return connections, where second user have access`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const findAll = await request(app.getHttpServer()) - .get('/connections') - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - t.is(findAll.status, 200); - - const result = findAll.body.connections; - t.is(result.length, 1); - t.is(Object.hasOwn(result[0], 'connection'), true); - t.is(Object.hasOwn(result[0], 'accessLevel'), true); - - t.is(Object.hasOwn(result[0], 'accessLevel'), true); - t.is(Object.hasOwn(result[0].connection, 'host'), true); - t.is(Object.hasOwn(result[0].connection, 'host'), true); - t.is(typeof result[0].connection.port, 'number'); - t.is(Object.hasOwn(result[0].connection, 'port'), true); - t.is(Object.hasOwn(result[0].connection, 'username'), true); - t.is(Object.hasOwn(result[0].connection, 'database'), true); - t.is(Object.hasOwn(result[0].connection, 'sid'), true); - t.is(Object.hasOwn(result[0].connection, 'createdAt'), true); - t.is(Object.hasOwn(result[0].connection, 'updatedAt'), true); - t.is(Object.hasOwn(result[0].connection, 'password'), false); - t.is(Object.hasOwn(result[0].connection, 'groups'), false); - t.is(Object.hasOwn(result[0].connection, 'author'), false); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /connections/"; + +test.serial( + `${currentTest} should return connections, where second user have access`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const findAll = await request(app.getHttpServer()) + .get("/connections") + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + t.is(findAll.status, 200); + + const result = findAll.body.connections; + t.is(result.length, 1); + t.is(Object.hasOwn(result[0], "connection"), true); + t.is(Object.hasOwn(result[0], "accessLevel"), true); + + t.is(Object.hasOwn(result[0], "accessLevel"), true); + t.is(Object.hasOwn(result[0].connection, "host"), true); + t.is(Object.hasOwn(result[0].connection, "host"), true); + t.is(typeof result[0].connection.port, "number"); + t.is(Object.hasOwn(result[0].connection, "port"), true); + t.is(Object.hasOwn(result[0].connection, "username"), true); + t.is(Object.hasOwn(result[0].connection, "database"), true); + t.is(Object.hasOwn(result[0].connection, "sid"), true); + t.is(Object.hasOwn(result[0].connection, "createdAt"), true); + t.is(Object.hasOwn(result[0].connection, "updatedAt"), true); + t.is(Object.hasOwn(result[0].connection, "password"), false); + t.is(Object.hasOwn(result[0].connection, "groups"), false); + t.is(Object.hasOwn(result[0].connection, "author"), false); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'GET /connection/one/:slug'; +currentTest = "GET /connection/one/:slug"; test.serial(`${currentTest} should return a found connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.firstId; - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - - const result = findOneResponce.body.connection; - - t.is(result.title, newConnectionToPostgres.title); - t.is(result.type, 'postgres'); - t.is(result.host, newConnectionToPostgres.host); - t.is(typeof result.port, 'number'); - t.is(result.port, newConnectionToPostgres.port); - t.is(result.username, 'postgres'); - t.is(result.database, newConnectionToPostgres.database); - t.is(result.sid, null); - t.is(Object.hasOwn(result, 'createdAt'), true); - t.is(Object.hasOwn(result, 'updatedAt'), true); - t.is(Object.hasOwn(result, 'password'), false); - t.is(Object.hasOwn(result, 'groups'), false); - t.is(Object.hasOwn(result, 'author'), false); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.firstId; + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(findOneResponce.status, 200); + + const result = findOneResponce.body.connection; + + t.is(result.title, newConnectionToPostgres.title); + t.is(result.type, "postgres"); + t.is(result.host, newConnectionToPostgres.host); + t.is(typeof result.port, "number"); + t.is(result.port, newConnectionToPostgres.port); + t.is(result.username, "postgres"); + t.is(result.database, newConnectionToPostgres.database); + t.is(result.sid, null); + t.is(Object.hasOwn(result, "createdAt"), true); + t.is(Object.hasOwn(result, "updatedAt"), true); + t.is(Object.hasOwn(result, "password"), false); + t.is(Object.hasOwn(result, "groups"), false); + t.is(Object.hasOwn(result, "author"), false); + } catch (e) { + console.error(e); + } }); test.serial( - `${currentTest} should throw an exception, when you do not have permission in this connection`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.secondId; - - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - // todo add checking connection object properties - t.is(findOneResponce.status, 200); - const findOneRO = JSON.parse(findOneResponce.text); - t.is(Object.hasOwn(findOneRO, 'host'), false); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'PUT /connection'; - -test.serial(`${currentTest} should throw exception you do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception, when you do not have permission in this connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.secondId; + + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + // todo add checking connection object properties + t.is(findOneResponce.status, 200); + const findOneRO = JSON.parse(findOneResponce.text); + t.is(Object.hasOwn(findOneRO, "host"), false); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "PUT /connection"; test.serial( - `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.secondId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'DELETE /connection/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //deleted connection found in database - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw exception you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to delete connection without permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //connection wasn't deleted - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'POST /connection/group/:slug'; - -test.serial(`${currentTest} should throw an exception don not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.secondId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "DELETE /connection/:slug"; test.serial( - `${currentTest} should throw an exception when you try add group in connection without permission in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'PUT /connection/group/:slug'; - -test.serial(`${currentTest} should return connection without deleted group result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - let result = createGroupResponse.body; - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - //after deleting group - result = response.body; - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //deleted connection found in database + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try to delete connection without permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //connection wasn't deleted + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "POST /connection/group/:slug"; test.serial( - `${currentTest} should throw an exception, when you try delete group in connection without permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - const result = createGroupResponse.body; - - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'GET /connection/groups/:slug'; + `${currentTest} should throw an exception don not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try add group in connection without permission in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "PUT /connection/group/:slug"; + +test.serial( + `${currentTest} should return connection without deleted group result`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + let result = createGroupResponse.body; + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + //after deleting group + result = response.body; + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try delete group in connection without permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + const result = createGroupResponse.body; + + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "GET /connection/groups/:slug"; test.serial(`${currentTest} should groups in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newRandomGroup2) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - const _groupId = result[0].group.id; - - t.is(Object.hasOwn(result[0].group, 'title'), true); - t.is(result[0].accessLevel, AccessLevelEnum.edit); - - const index = result.findIndex((el: any) => { - return el.group.title === 'Admin'; - }); - - t.is(index >= 0, false); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newRandomGroup2) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + const _groupId = result[0].group.id; + + t.is(Object.hasOwn(result[0].group, "title"), true); + t.is(result[0].accessLevel, AccessLevelEnum.edit); + + const index = result.findIndex((el: any) => { + return el.group.title === "Admin"; + }); + + t.is(index >= 0, false); + } catch (e) { + console.error(e); + } }); test.serial( - `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - - const result = JSON.parse(response.text); - t.is(result.length, 0); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'GET /connection/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const result = JSON.parse(response.text); - t.is(response.status, 200); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.readonly); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table: any) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[tableIndex], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - } -}); + `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + + const result = JSON.parse(response.text); + t.is(result.length, 0); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'GET /connection/user/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.readonly); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const foundTableIndex = tables.findIndex((table) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[foundTableIndex], 'object'); - t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); - t.is(tables[foundTableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[foundTableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /connection/permissions"; test.serial( - `${currentTest} should return permissions object for current group in current connection for current user`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.secondId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const foundTableIndex = tables.findIndex((table) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[0], 'object'); - t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); - t.is(tables[foundTableIndex].accessLevel.visibility, false); - t.is(tables[foundTableIndex].accessLevel.readonly, false); - t.is(tables[foundTableIndex].accessLevel.add, false); - t.is(tables[foundTableIndex].accessLevel.delete, false); - t.is(tables[foundTableIndex].accessLevel.edit, false); - t.is(tables[foundTableIndex].accessLevel.edit, false); - } catch (e) { - console.error(e); - } - }, + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const result = JSON.parse(response.text); + t.is(response.status, 200); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.readonly); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table: any) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[tableIndex], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is( + tables[tableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); + t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "GET /connection/user/permissions"; + +test.serial( + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.readonly); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const foundTableIndex = tables.findIndex( + (table) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[foundTableIndex], "object"); + t.is(Object.hasOwn(tables[foundTableIndex], "accessLevel"), true); + t.is( + tables[foundTableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is( + tables[foundTableIndex].accessLevel.readonly, + tablePermissions.readonly, + ); + t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should return permissions object for current group in current connection for current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.secondId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const foundTableIndex = tables.findIndex( + (table) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[0], "object"); + t.is(Object.hasOwn(tables[foundTableIndex], "accessLevel"), true); + t.is(tables[foundTableIndex].accessLevel.visibility, false); + t.is(tables[foundTableIndex].accessLevel.readonly, false); + t.is(tables[foundTableIndex].accessLevel.add, false); + t.is(tables[foundTableIndex].accessLevel.delete, false); + t.is(tables[foundTableIndex].accessLevel.edit, false); + t.is(tables[foundTableIndex].accessLevel.edit, false); + } catch (e) { + console.error(e); + } + }, ); //****************************** GROUP CONTROLLER ******************************// -currentTest = 'GET /groups/'; - -test.serial(`${currentTest} should return found groups with current user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - users: { simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/groups/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const { groups, groupsCount } = getGroupsRO; - t.is(groupsCount, 1); - t.is(groups.length, 1); - t.is(Object.hasOwn(groups[0], 'group'), true); - t.is(Object.hasOwn(groups[0], 'accessLevel'), true); - - t.is(Object.hasOwn(groups[0].group, 'title'), true); - t.is(Object.hasOwn(groups[0].group, 'isMain'), true); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /groups/"; -currentTest = 'GET /group/users/:slug'; +test.serial( + `${currentTest} should return found groups with current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + users: { simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/groups/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const { groups, groupsCount } = getGroupsRO; + t.is(groupsCount, 1); + t.is(groups.length, 1); + t.is(Object.hasOwn(groups[0], "group"), true); + t.is(Object.hasOwn(groups[0], "accessLevel"), true); + + t.is(Object.hasOwn(groups[0].group, "title"), true); + t.is(Object.hasOwn(groups[0].group, "isMain"), true); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "GET /group/users/:slug"; test.serial(`${currentTest} it should return users in group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { - return !element.group.isMain; - }); - const groupId = getGroupsRO[nonAdminGroupIndex].group.id; - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.length, 2); - t.is(getUsersRO[0].id === getUsersRO[1].id, false); - t.is(Object.hasOwn(getUsersRO[0], 'createdAt'), true); - t.is(Object.hasOwn(getUsersRO[0], 'password'), false); - t.is(Object.hasOwn(getUsersRO[0], 'isActive'), true); - t.is(Object.hasOwn(getUsersRO[0], 'email'), true); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { + return !element.group.isMain; + }); + const groupId = getGroupsRO[nonAdminGroupIndex].group.id; + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.length, 2); + t.is(getUsersRO[0].id === getUsersRO[1].id, false); + t.is(Object.hasOwn(getUsersRO[0], "createdAt"), true); + t.is(Object.hasOwn(getUsersRO[0], "password"), false); + t.is(Object.hasOwn(getUsersRO[0], "isActive"), true); + t.is(Object.hasOwn(getUsersRO[0], "email"), true); + } catch (e) { + console.error(e); + } }); test.serial( - `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'PUT /group/user'; + `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "PUT /group/user"; test.serial(`${currentTest} should return group with added user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text).group; - - t.is(Object.hasOwn(addUserInGroupRO, 'title'), true); - t.is(Object.hasOwn(addUserInGroupRO, 'isMain'), true); - t.is(Object.hasOwn(addUserInGroupRO, 'users'), true); - const { users } = addUserInGroupRO; - t.is(users.length, 3); - t.is(users[0].id === users[1].id, false); - t.is(users[1].id === users[2].id, false); - t.is(users[2].id === users[0].id, false); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text).group; + + t.is(Object.hasOwn(addUserInGroupRO, "title"), true); + t.is(Object.hasOwn(addUserInGroupRO, "isMain"), true); + t.is(Object.hasOwn(addUserInGroupRO, "users"), true); + const { users } = addUserInGroupRO; + t.is(users.length, 3); + t.is(users[0].id === users[1].id, false); + t.is(users[1].id === users[2].id, false); + t.is(users[2].id === users[0].id, false); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw exception, when user email not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const email = faker.internet.email(); - const groupId = faker.string.uuid(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const email = faker.internet.email(); + const groupId = faker.string.uuid(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'DELETE /group/:slug'; - -test.serial(`${currentTest} should delete result after group deletion`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.isMain, false); - } catch (e) { - console.error(e); - } -}); +currentTest = "DELETE /group/:slug"; -test.serial(`${currentTest} should throw an exception when you try delete admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const adminGroupIndex = getGroupsRO.findIndex((group) => group.group.isMain); - - const groupId = getGroupsRO[adminGroupIndex].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should delete result after group deletion`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.isMain, false); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteGroupResponse.status, 404); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when you try delete admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const adminGroupIndex = getGroupsRO.findIndex( + (group) => group.group.isMain, + ); + + const groupId = getGroupsRO[adminGroupIndex].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = faker.string.uuid(); - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteGroupResponse.status, 404); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'PUT /group/user/delete'; - -test.serial(`${currentTest} should return group without deleted user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); - - const email = thirdTestUser.email; - - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addUserInGroupResponse.status, 200); - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - - t.is(Object.hasOwn(deleteUserInGroupRO, 'title'), true); - t.is(Object.hasOwn(deleteUserInGroupRO, 'isMain'), true); - t.is(Object.hasOwn(deleteUserInGroupRO, 'users'), true); - const { users } = deleteUserInGroupRO; - t.is(users.length, 2); - t.is(users[0].id === users[1].id, false); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = faker.string.uuid(); + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); - - const _email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ groupId }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (e) { - console.error(e); - } -}); +currentTest = "PUT /group/user/delete"; -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should return group without deleted user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addUserInGroupResponse.status, 200); + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + + t.is(Object.hasOwn(deleteUserInGroupRO, "title"), true); + t.is(Object.hasOwn(deleteUserInGroupRO, "isMain"), true); + t.is(Object.hasOwn(deleteUserInGroupRO, "users"), true); + const { users } = deleteUserInGroupRO; + t.is(users.length, 2); + t.is(users[0].id === users[1].id, false); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - let groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); - - const email = thirdTestUser.email; - - groupId = faker.string.uuid(); - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw exception, when user email not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + adminUserToken, + undefined, + app, + undefined, + ); + + const _email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ groupId }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + let groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + groupId = faker.string.uuid(); + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + } + }, +); //****************************** PERMISSION CONTROLLER TESTS ******************************// -currentTest = 'PUT permissions/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - t.is(createGroupResponse.status, 201); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +currentTest = "PUT permissions/:slug"; test.serial( - `${currentTest} should return updated complex permissions object when you update permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const permissions = { - connection: { - accessLevel: AccessLevelEnum.none, - connectionId: connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: groupId, - }, - tables: [ - { - accessLevel: { - add: false, - delete: false, - edit: true, - readonly: false, - visibility: true, - }, - tableName: firstTableInfo.testTableName, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - } catch (e) { - console.error(e); - } - }, -); - -test.serial(`${currentTest} should throw an exception, when you try change admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups: { firstAdminGroupId }, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.edit, - }, - group: { - groupId: firstAdminGroupId, - accessLevel: AccessLevelEnum.none, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${firstAdminGroupId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + t.is(createGroupResponse.status, 201); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should return updated complex permissions object when you update permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const permissions = { + connection: { + accessLevel: AccessLevelEnum.none, + connectionId: connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: groupId, + }, + tables: [ + { + accessLevel: { + add: false, + delete: false, + edit: true, + readonly: false, + visibility: true, + }, + tableName: firstTableInfo.testTableName, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try change admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups: { firstAdminGroupId }, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.edit, + }, + group: { + groupId: firstAdminGroupId, + accessLevel: AccessLevelEnum.none, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${firstAdminGroupId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); //****************************** TABLE CONTROLLER TESTS ******************************// -currentTest = 'GET /connection/tables/:slug'; - -test.serial(`${currentTest} should return all tables in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.length > 0, true); - const tableIndex = getTablesInConnectionRO.findIndex( - (table: any) => table.tableName === testData.firstTableInfo.testTableName, - ); - t.is(getTablesInConnectionRO[tableIndex].table, testData.firstTableInfo.testTableName); - t.is(typeof getTablesInConnectionRO[tableIndex].permissions, 'object'); - const { visibility, readonly, add, delete: del, edit } = getTablesInConnectionRO[0].permissions; - t.is(visibility, tablePermissions.visibility); - t.is(readonly, tablePermissions.readonly); - t.is(del, tablePermissions.delete); - t.is(edit, tablePermissions.edit); - t.is(add, tablePermissions.add); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /connection/tables/:slug"; -test.serial(`${currentTest} should throw an exception, when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 404); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should return all tables in connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.length > 0, true); + const tableIndex = getTablesInConnectionRO.findIndex( + (table: any) => + table.tableName === testData.firstTableInfo.testTableName, + ); + t.is( + getTablesInConnectionRO[tableIndex].table, + testData.firstTableInfo.testTableName, + ); + t.is(typeof getTablesInConnectionRO[tableIndex].permissions, "object"); + const { + visibility, + readonly, + add, + delete: del, + edit, + } = getTablesInConnectionRO[0].permissions; + t.is(visibility, tablePermissions.visibility); + t.is(readonly, tablePermissions.readonly); + t.is(del, tablePermissions.delete); + t.is(edit, tablePermissions.edit); + t.is(add, tablePermissions.add); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 404); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${fakeConnectionId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 400); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'GET /table/rows/:slug'; + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 400); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "GET /table/rows/:slug"; test.serial(`${currentTest} should return found rows from table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 200); - const getTableRowsRO = JSON.parse(getTableRows.text); - const { rows, primaryColumns, pagination, sortable_by, structure, foreignKeys } = getTableRowsRO; - t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(sortable_by.length, 0); - t.is(structure.length, 5); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 200); + const getTableRowsRO = JSON.parse(getTableRows.text); + const { + rows, + primaryColumns, + pagination, + sortable_by, + structure, + foreignKeys, + } = getTableRowsRO; + t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(sortable_by.length, 0); + t.is(structure.length, 5); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 404); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 404); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrec`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeId = faker.string.uuid(); - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTableRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrec`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeId = faker.string.uuid(); + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTableRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTablesRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTablesRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'GET /table/structure/:slug'; +currentTest = "GET /table/structure/:slug"; test.serial(`${currentTest} should return table structure`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTablesStructure.text); - - t.is(getTablesStructure.status, 200); - const { structure, primaryColumns, foreignKeys, readonly_fields, table_widgets } = getTableStructureRO; - t.is(structure.length, 5); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(readonly_fields.length, 0); - t.is(table_widgets.length, 0); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTablesStructure.text); + + t.is(getTablesStructure.status, 200); + const { + structure, + primaryColumns, + foreignKeys, + readonly_fields, + table_widgets, + } = getTableStructureRO; + t.is(structure.length, 5); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(readonly_fields.length, 0); + t.is(table_widgets.length, 0); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 404); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 404); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const fakeConnectionId = faker.string.uuid(); - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const fakeConnectionId = faker.string.uuid(); + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${connections.firstId}?tableName=`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${fakeTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'POST /table/row/:slug'; +currentTest = "POST /table/row/:slug"; test.serial(`${currentTest} should return added row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTable.status, 201); - t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); - t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); - t.is(addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], randomEmail); - t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTable.status, 201); + t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); + t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); + t.is( + addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], + randomEmail, + ); + t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(addRowInTableRO, "structure"), true); + t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'PUT /table/row/:slug'; - -test.serial( - `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(updateRowInTable.text); - t.is(updateRowInTable.status, 403); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +currentTest = "PUT /table/row/:slug"; -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const updateRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(updateRowInTable.text); + t.is(updateRowInTable.status, 403); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'DELETE /table/row/:slug'; +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "DELETE /table/row/:slug"; test.serial(`${currentTest} should return delete result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTable.status, 200); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteRowInTable.status, 200); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - t.is(deleteRowInTable.status, 403); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 403); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'GET /table/row/:slug'; +currentTest = "GET /table/row/:slug"; test.serial(`${currentTest} should return row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getRowInTable.text); - t.is(getRowInTable.status, 200); - t.is(getRowInTableRO.row.id, 7); - t.is(Object.hasOwn(getRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(getRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(getRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(getRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(getRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getRowInTable.text); + t.is(getRowInTable.status, 200); + t.is(getRowInTableRO.row.id, 7); + t.is(Object.hasOwn(getRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(getRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(getRowInTableRO, "structure"), true); + t.is(Object.hasOwn(getRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(getRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(getRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); //****************************** TABLE LOGS CONTROLLER TESTS ******************************// -currentTest = 'GET /logs/:slug'; - -test.serial(`${currentTest} should return all found logs in connection'`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 1); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'table_name'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'received_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'old_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'cognitoUserName'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'email'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationType'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationStatusResult'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'createdAt'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'connection_id'), true); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /logs/:slug"; + +test.serial( + `${currentTest} should return all found logs in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 1); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "table_name"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "received_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "old_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "cognitoUserName"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "email"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "operationType"), true); + t.is( + Object.hasOwn(getRowInTableRO.logs[0], "operationStatusResult"), + true, + ); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "createdAt"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "connection_id"), true); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - - const updateConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 200); - - const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded( - firstTableInfo.testTableName, - false, - ); - - const createConnectionPropertiesResponse = await request(app.getHttpServer()) - .post(`/connection/properties/${connections.firstId}`) - .send(newConnectionProperties) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createConnectionPropertiesResponse.status, 201); - - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + + const updateConnection = + mockFactory.generateConnectionToTestPostgresDBInDocker(); + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 200); + + const newConnectionProperties = + mockFactory.generateConnectionPropertiesUserExcluded( + firstTableInfo.testTableName, + false, + ); + + const createConnectionPropertiesResponse = await request( + app.getHttpServer(), + ) + .post(`/connection/properties/${connections.firstId}`) + .send(newConnectionProperties) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createConnectionPropertiesResponse.status, 201); + + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE SETTINGS CONTROLLER TESTS ******************************// -currentTest = 'GET /settings/'; +currentTest = "GET /settings/"; test.skip(`${currentTest} should return empty table settings when it was not created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} 'should return table settings when it was created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(Object.hasOwn(getTableSettingsRO, 'id'), true); - t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); - t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); - t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); - t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(getTableSettingsRO.list_fields), JSON.stringify(createTableSettingsDTO.list_fields.concat(['id', 'created_at', 'updated_at']))); - t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); - t.is(getTableSettingsRO.list_per_page, createTableSettingsDTO.list_per_page); - t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering); - t.is(getTableSettingsRO.ordering_field, createTableSettingsDTO.ordering_field); - t.is(JSON.stringify(getTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(getTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); - t.is(JSON.stringify(getTableSettingsRO.autocomplete_columns), JSON.stringify([])); - t.is(getTableSettingsRO.connection_id, connections.firstId); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} 'should return table settings when it was created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(Object.hasOwn(getTableSettingsRO, "id"), true); + t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); + t.is( + getTableSettingsRO.display_name, + createTableSettingsDTO.display_name, + ); + t.is( + JSON.stringify(getTableSettingsRO.search_fields), + JSON.stringify(createTableSettingsDTO.search_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.excluded_fields), + JSON.stringify(createTableSettingsDTO.excluded_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.list_fields), + JSON.stringify( + createTableSettingsDTO.list_fields.concat([ + "id", + "created_at", + "updated_at", + ]), + ), + ); + t.is( + JSON.stringify(getTableSettingsRO.identification_fields), + JSON.stringify([]), + ); + t.is( + getTableSettingsRO.list_per_page, + createTableSettingsDTO.list_per_page, + ); + t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering); + t.is( + getTableSettingsRO.ordering_field, + createTableSettingsDTO.ordering_field, + ); + t.is( + JSON.stringify(getTableSettingsRO.readonly_fields), + JSON.stringify(createTableSettingsDTO.readonly_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.sortable_by), + JSON.stringify(createTableSettingsDTO.sortable_by), + ); + t.is( + JSON.stringify(getTableSettingsRO.autocomplete_columns), + JSON.stringify([]), + ); + t.is(getTableSettingsRO.connection_id, connections.firstId); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'POST /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - 'users', - ['id'], - ['email'], - ['name'], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - t.is(JSON.parse(createTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "POST /settings/"; test.serial( - `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - - const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'PUT /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + "users", + ["id"], + ["email"], + ["name"], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + t.is( + JSON.parse(createTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'DELETE /settings/'; - -test.serial(`${currentTest} should return array without deleted table settings`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteTableSettingsResponse.status, 403); - t.is(JSON.parse(deleteTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + + const createTableSettingsRO = JSON.parse( + createTableSettingsResponse.text, + ); + t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "PUT /settings/"; test.serial( - `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteTableSettingsRO = JSON.parse(deleteTableSettingsResponse.text); - t.is(deleteTableSettingsResponse.status, 403); - t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "DELETE /settings/"; + +test.serial( + `${currentTest} should return array without deleted table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteTableSettingsResponse.status, 403); + t.is( + JSON.parse(deleteTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteTableSettingsRO = JSON.parse( + deleteTableSettingsResponse.text, + ); + t.is(deleteTableSettingsResponse.status, 403); + t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, ); //****************************** TABLE WIDGETS CONTROLLER TESTS ******************************// -currentTest = 'GET /widgets/:slug'; - -test.serial(`${currentTest} should return empty widgets array when widgets not created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 200); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 0); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /widgets/:slug"; -test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); - t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 2); - t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); - t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should return empty widgets array when widgets not created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 200); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 0); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 403); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - t.pass(); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'POST /widget/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should return array of table widgets for table`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); + t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); + t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 2); + t.is( + getTableStructureRO.table_widgets[0].field_name, + newTableWidgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[1].widget_type, + newTableWidgets[1].widget_type, + ); + t.is( + compareTableWidgetsArrays( + getTableStructureRO.table_widgets, + newTableWidgets, + ), + true, + ); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 403); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + t.pass(); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "POST /widget/:slug"; + +test.serial( + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, + `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, ); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-table-different-group-connection-readonly-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-table-different-group-connection-readonly-permissions-e2e.test.ts index 7abcc52fe..8757dc121 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-table-different-group-connection-readonly-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-table-different-group-connection-readonly-permissions-e2e.test.ts @@ -1,2939 +1,3429 @@ /* eslint-disable security/detect-object-injection */ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { faker } from '@faker-js/faker'; -import { INestApplication, ValidationPipe } from '@nestjs/common'; -import { Test } from '@nestjs/testing'; -import test from 'ava'; -import cookieParser from 'cookie-parser'; -import request from 'supertest'; -import { ApplicationModule } from '../../../src/app.module.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; -import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; -import { Messages } from '../../../src/exceptions/text/messages.js'; -import { Cacher } from '../../../src/helpers/cache/cacher.js'; -import { Constants } from '../../../src/helpers/constants/constants.js'; -import { DatabaseModule } from '../../../src/shared/database/database.module.js'; -import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { MockFactory } from '../../mock.factory.js'; -import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; -import { TestUtils } from '../../utils/test.utils.js'; -import { createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions } from '../../utils/user-with-different-permissions-utils.js'; -import { inviteUserInCompanyAndAcceptInvitation } from '../../utils/register-user-and-return-user-info.js'; -import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; -import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; -import { ValidationError } from 'class-validator'; -import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { faker } from "@faker-js/faker"; +import { INestApplication, ValidationPipe } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import test from "ava"; +import { ValidationError } from "class-validator"; +import cookieParser from "cookie-parser"; +import request from "supertest"; +import { ApplicationModule } from "../../../src/app.module.js"; +import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { + AccessLevelEnum, + QueryOrderingEnum, +} from "../../../src/enums/index.js"; +import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; +import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; +import { Messages } from "../../../src/exceptions/text/messages.js"; +import { Cacher } from "../../../src/helpers/cache/cacher.js"; +import { Constants } from "../../../src/helpers/constants/constants.js"; +import { DatabaseModule } from "../../../src/shared/database/database.module.js"; +import { DatabaseService } from "../../../src/shared/database/database.service.js"; +import { MockFactory } from "../../mock.factory.js"; +import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; +import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; +import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; +import { TestUtils } from "../../utils/test.utils.js"; +import { createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions } from "../../utils/user-with-different-permissions-utils.js"; let app: INestApplication; let _testUtils: TestUtils; let currentTest: string; const mockFactory = new MockFactory(); -const newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); +const newConnectionToPostgres = + mockFactory.generateConnectionToTestPostgresDBInDocker(); const updateConnection = mockFactory.generateUpdateConnectionDto(); const newGroup1 = mockFactory.generateCreateGroupDto1(); const tablePermissions = { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, }; test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error("After tests error " + e); + } }); //***************************************** USER NOT ADDED INTO ADMIN GROUP //****************************** CONNECTION CONTROLLER -currentTest = 'GET /connections/'; - -test.serial(`${currentTest} should return connections, where second user have access`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const findAll = await request(app.getHttpServer()) - .get('/connections') - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - t.is(findAll.status, 200); - - t.is(findAll.status, 200); - - const result = findAll.body.connections; - const nonTestConnection = result.find(({ connection }) => connection.id === connections.firstId); - t.is(result.length, 1); - t.is(Object.hasOwn(nonTestConnection, 'connection'), true); - t.is(Object.hasOwn(nonTestConnection, 'accessLevel'), true); - t.is(nonTestConnection.accessLevel, AccessLevelEnum.readonly); - - t.is(Object.hasOwn(nonTestConnection.connection, 'host'), true); - t.is(Object.hasOwn(result[0].connection, 'host'), true); - t.is(typeof result[0].connection.port, 'number'); - t.is(Object.hasOwn(result[0].connection, 'port'), true); - t.is(Object.hasOwn(result[0].connection, 'username'), true); - t.is(Object.hasOwn(result[0].connection, 'database'), true); - t.is(Object.hasOwn(result[0].connection, 'sid'), true); - t.is(Object.hasOwn(result[0].connection, 'createdAt'), true); - t.is(Object.hasOwn(result[0].connection, 'updatedAt'), true); - t.is(Object.hasOwn(result[0].connection, 'password'), false); - t.is(Object.hasOwn(result[0].connection, 'groups'), false); - t.is(Object.hasOwn(result[0].connection, 'author'), false); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connections/"; -currentTest = 'GET /connection/one/:slug'; +test.serial( + `${currentTest} should return connections, where second user have access`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const findAll = await request(app.getHttpServer()) + .get("/connections") + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + t.is(findAll.status, 200); + + t.is(findAll.status, 200); + + const result = findAll.body.connections; + const nonTestConnection = result.find( + ({ connection }) => connection.id === connections.firstId, + ); + t.is(result.length, 1); + t.is(Object.hasOwn(nonTestConnection, "connection"), true); + t.is(Object.hasOwn(nonTestConnection, "accessLevel"), true); + t.is(nonTestConnection.accessLevel, AccessLevelEnum.readonly); + + t.is(Object.hasOwn(nonTestConnection.connection, "host"), true); + t.is(Object.hasOwn(result[0].connection, "host"), true); + t.is(typeof result[0].connection.port, "number"); + t.is(Object.hasOwn(result[0].connection, "port"), true); + t.is(Object.hasOwn(result[0].connection, "username"), true); + t.is(Object.hasOwn(result[0].connection, "database"), true); + t.is(Object.hasOwn(result[0].connection, "sid"), true); + t.is(Object.hasOwn(result[0].connection, "createdAt"), true); + t.is(Object.hasOwn(result[0].connection, "updatedAt"), true); + t.is(Object.hasOwn(result[0].connection, "password"), false); + t.is(Object.hasOwn(result[0].connection, "groups"), false); + t.is(Object.hasOwn(result[0].connection, "author"), false); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /connection/one/:slug"; test.serial(`${currentTest} should return a found connection`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.firstId; - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - - const result = findOneResponce.body.connection; - - t.is(result.title, newConnectionToPostgres.title); - t.is(result.type, 'postgres'); - t.is(result.host, newConnectionToPostgres.host); - t.is(typeof result.port, 'number'); - t.is(result.port, newConnectionToPostgres.port); - t.is(result.username, 'postgres'); - t.is(result.database, newConnectionToPostgres.database); - t.is(result.sid, null); - t.is(Object.hasOwn(result, 'createdAt'), true); - t.is(Object.hasOwn(result, 'updatedAt'), true); - t.is(Object.hasOwn(result, 'password'), false); - t.is(Object.hasOwn(result, 'groups'), false); - t.is(Object.hasOwn(result, 'author'), false); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.firstId; + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(findOneResponce.status, 200); + + const result = findOneResponce.body.connection; + + t.is(result.title, newConnectionToPostgres.title); + t.is(result.type, "postgres"); + t.is(result.host, newConnectionToPostgres.host); + t.is(typeof result.port, "number"); + t.is(result.port, newConnectionToPostgres.port); + t.is(result.username, "postgres"); + t.is(result.database, newConnectionToPostgres.database); + t.is(result.sid, null); + t.is(Object.hasOwn(result, "createdAt"), true); + t.is(Object.hasOwn(result, "updatedAt"), true); + t.is(Object.hasOwn(result, "password"), false); + t.is(Object.hasOwn(result, "groups"), false); + t.is(Object.hasOwn(result, "author"), false); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} should throw an exception, when you do not have permission in this connection`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.secondId; - - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - // todo add checking connection object properties - t.is(findOneResponce.status, 200); - const findOneRO = JSON.parse(findOneResponce.text); - t.is(Object.hasOwn(findOneRO, 'host'), false); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception, when you do not have permission in this connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.secondId; + + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + // todo add checking connection object properties + t.is(findOneResponce.status, 200); + const findOneRO = JSON.parse(findOneResponce.text); + t.is(Object.hasOwn(findOneRO, "host"), false); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'PUT /connection'; - -test.serial(`${currentTest} should throw exception you do not have permission`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT /connection"; test.serial( - `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.secondId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw exception you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'DELETE /connection/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //deleted connection found in database - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.secondId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "DELETE /connection/:slug"; test.serial( - `${currentTest} should throw an exception, when you try to delete connection without permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //connection wasn't deleted - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //deleted connection found in database + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'POST /connection/group/:slug'; - -test.serial(`${currentTest} should throw an exception don not have permission`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception, when you try to delete connection without permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //connection wasn't deleted + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "POST /connection/group/:slug"; test.serial( - `${currentTest} should throw an exception when you try add group in connection without permission in it`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception don not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'PUT /connection/group/:slug'; - -test.serial(`${currentTest} should return connection without deleted group result`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - let result = createGroupResponse.body; - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - //after deleting group - result = response.body; - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when you try add group in connection without permission in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /connection/group/:slug"; + +test.serial( + `${currentTest} should return connection without deleted group result`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + let result = createGroupResponse.body; + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + //after deleting group + result = response.body; + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try delete group in connection without permissions`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - const result = createGroupResponse.body; - - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception, when you try delete group in connection without permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + const result = createGroupResponse.body; + + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'GET /connection/groups/:slug'; +currentTest = "GET /connection/groups/:slug"; test.serial(`${currentTest} should groups in connection`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newRandomGroup2) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - const _groupId = result[0].group.id; - - t.is(Object.hasOwn(result[0].group, 'title'), true); - t.is(result[0].accessLevel, AccessLevelEnum.readonly); - - const index = result.findIndex((el: any) => { - return el.group.title === 'Admin'; - }); - - t.is(index >= 0, false); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newRandomGroup2) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + const _groupId = result[0].group.id; + + t.is(Object.hasOwn(result[0].group, "title"), true); + t.is(result[0].accessLevel, AccessLevelEnum.readonly); + + const index = result.findIndex((el: any) => { + return el.group.title === "Admin"; + }); + + t.is(index >= 0, false); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - - const result = JSON.parse(response.text); - t.is(result.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + + const result = JSON.parse(response.text); + t.is(result.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'GET /connection/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const result = JSON.parse(response.text); - t.is(response.status, 200); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.readonly); - t.is(result.group.accessLevel, AccessLevelEnum.readonly); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table: any) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[tableIndex], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connection/permissions"; -currentTest = 'GET /connection/user/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.readonly); - t.is(result.group.accessLevel, AccessLevelEnum.readonly); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const foundTableIndex = tables.findIndex((table) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[foundTableIndex], 'object'); - t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); - t.is(tables[foundTableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[foundTableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const result = JSON.parse(response.text); + t.is(response.status, 200); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.readonly); + t.is(result.group.accessLevel, AccessLevelEnum.readonly); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table: any) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[tableIndex], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is( + tables[tableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); + t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /connection/user/permissions"; test.serial( - `${currentTest} should return permissions object for current group in current connection for current user`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.secondId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.readonly); + t.is(result.group.accessLevel, AccessLevelEnum.readonly); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const foundTableIndex = tables.findIndex( + (table) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[foundTableIndex], "object"); + t.is(Object.hasOwn(tables[foundTableIndex], "accessLevel"), true); + t.is( + tables[foundTableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is( + tables[foundTableIndex].accessLevel.readonly, + tablePermissions.readonly, + ); + t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return permissions object for current group in current connection for current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.secondId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** GROUP CONTROLLER ******************************// -currentTest = 'GET /groups/'; - -test.serial(`${currentTest} should return found groups with current user`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - users: { simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/groups/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const { groups, groupsCount } = getGroupsRO; - t.is(groupsCount, 1); - t.is(groups.length, 1); - t.is(Object.hasOwn(groups[0], 'group'), true); - t.is(Object.hasOwn(groups[0], 'accessLevel'), true); - - t.is(Object.hasOwn(groups[0].group, 'title'), true); - t.is(Object.hasOwn(groups[0].group, 'isMain'), true); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /groups/"; -currentTest = 'GET /group/users/:slug'; +test.serial( + `${currentTest} should return found groups with current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + users: { simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/groups/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const { groups, groupsCount } = getGroupsRO; + t.is(groupsCount, 1); + t.is(groups.length, 1); + t.is(Object.hasOwn(groups[0], "group"), true); + t.is(Object.hasOwn(groups[0], "accessLevel"), true); + + t.is(Object.hasOwn(groups[0].group, "title"), true); + t.is(Object.hasOwn(groups[0].group, "isMain"), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /group/users/:slug"; test.serial(`${currentTest} it should return users in groups`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { - return !element.group.isMain; - }); - const groupId = getGroupsRO[nonAdminGroupIndex].group.id; - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - const _getUsersRO = JSON.parse(response.text); - t.is(getGroupsRO.length, 2); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { + return !element.group.isMain; + }); + const groupId = getGroupsRO[nonAdminGroupIndex].group.id; + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + const _getUsersRO = JSON.parse(response.text); + t.is(getGroupsRO.length, 2); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'PUT /group/user'; - -test.serial(`${currentTest} should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 403); - t.is(Object.hasOwn(addUserInGroupRO, 'message'), true); - t.is(addUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT /group/user"; -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 403); + t.is(Object.hasOwn(addUserInGroupRO, "message"), true); + t.is(addUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const email = faker.internet.email(); - const groupId = faker.string.uuid(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'DELETE /group/:slug'; - -test.serial(`${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupResponse.status, 403); - t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const email = faker.internet.email(); + const groupId = faker.string.uuid(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when you try delete admin group`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const adminGroupIndex = getGroupsRO.findIndex((group) => group.group.isMain); - - const groupId = getGroupsRO[adminGroupIndex].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "DELETE /group/:slug"; -test.serial(`${currentTest} should throw an exception when group id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteGroupResponse.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupResponse.status, 403); + t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when group id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = faker.string.uuid(); - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when you try delete admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const adminGroupIndex = getGroupsRO.findIndex( + (group) => group.group.isMain, + ); + + const groupId = getGroupsRO[adminGroupIndex].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'PUT /group/user/delete'; - -test.serial(`${currentTest} should throw an exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteUserInGroupResponse.status, 403); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteGroupResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteUserInGroupResponse.status, 400); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = faker.string.uuid(); + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /group/user/delete"; + +test.serial( + `${currentTest} should throw an exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteUserInGroupResponse.status, 403); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteUserInGroupResponse.status, 400); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** PERMISSION CONTROLLER TESTS ******************************// -currentTest = 'PUT permissions/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - t.is(createGroupResponse.status, 201); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT permissions/:slug"; test.serial( - `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception object when you update permissions`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const permissions = { - connection: { - accessLevel: AccessLevelEnum.none, - connectionId: connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: groupId, - }, - tables: [ - { - accessLevel: { - add: false, - delete: false, - edit: true, - readonly: false, - visibility: true, - }, - tableName: firstTableInfo.testTableName, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + t.is(createGroupResponse.status, 201); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); -test.serial(`${currentTest} should throw an exception, when you try change admin group`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups: { firstAdminGroupId }, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.edit, - }, - group: { - groupId: firstAdminGroupId, - accessLevel: AccessLevelEnum.none, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${firstAdminGroupId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception object when you update permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const permissions = { + connection: { + accessLevel: AccessLevelEnum.none, + connectionId: connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: groupId, + }, + tables: [ + { + accessLevel: { + add: false, + delete: false, + edit: true, + readonly: false, + visibility: true, + }, + tableName: firstTableInfo.testTableName, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try change admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups: { firstAdminGroupId }, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.edit, + }, + group: { + groupId: firstAdminGroupId, + accessLevel: AccessLevelEnum.none, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${firstAdminGroupId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** TABLE CONTROLLER TESTS ******************************// -currentTest = 'GET /connection/tables/:slug'; - -test.serial(`${currentTest} should return all tables in connection`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.length > 0, true); - const tableIndex = getTablesInConnectionRO.findIndex( - (table: any) => table.table === testData.firstTableInfo.testTableName, - ); - t.is(getTablesInConnectionRO[tableIndex].table, testData.firstTableInfo.testTableName); - t.is(typeof getTablesInConnectionRO[tableIndex].permissions, 'object'); - const { visibility, readonly, add, delete: del, edit } = getTablesInConnectionRO[0].permissions; - t.is(visibility, tablePermissions.visibility); - t.is(readonly, tablePermissions.readonly); - t.is(del, tablePermissions.delete); - t.is(edit, tablePermissions.edit); - t.is(add, tablePermissions.add); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connection/tables/:slug"; -test.serial(`${currentTest} should throw an exception, when connection id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return all tables in connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.length > 0, true); + const tableIndex = getTablesInConnectionRO.findIndex( + (table: any) => table.table === testData.firstTableInfo.testTableName, + ); + t.is( + getTablesInConnectionRO[tableIndex].table, + testData.firstTableInfo.testTableName, + ); + t.is(typeof getTablesInConnectionRO[tableIndex].permissions, "object"); + const { + visibility, + readonly, + add, + delete: del, + edit, + } = getTablesInConnectionRO[0].permissions; + t.is(visibility, tablePermissions.visibility); + t.is(readonly, tablePermissions.readonly); + t.is(del, tablePermissions.delete); + t.is(edit, tablePermissions.edit); + t.is(add, tablePermissions.add); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${fakeConnectionId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 400); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 400); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'GET /table/rows/:slug'; +currentTest = "GET /table/rows/:slug"; test.serial(`${currentTest} should return found rows from table`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 200); - const getTableRowsRO = JSON.parse(getTableRows.text); - const { rows, primaryColumns, pagination, sortable_by, structure, foreignKeys } = getTableRowsRO; - t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(sortable_by.length, 0); - t.is(structure.length, 5); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 200); + const getTableRowsRO = JSON.parse(getTableRows.text); + const { + rows, + primaryColumns, + pagination, + sortable_by, + structure, + foreignKeys, + } = getTableRowsRO; + t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(sortable_by.length, 0); + t.is(structure.length, 5); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrec`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeId = faker.string.uuid(); - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTableRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrec`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeId = faker.string.uuid(); + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTableRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTablesRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTablesRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /table/structure/:slug'; +currentTest = "GET /table/structure/:slug"; test.serial(`${currentTest} should return table structure`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTablesStructure.text); - - t.is(getTablesStructure.status, 200); - const { structure, primaryColumns, foreignKeys, readonly_fields, table_widgets } = getTableStructureRO; - t.is(structure.length, 5); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(readonly_fields.length, 0); - t.is(table_widgets.length, 0); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTablesStructure.text); + + t.is(getTablesStructure.status, 200); + const { + structure, + primaryColumns, + foreignKeys, + readonly_fields, + table_widgets, + } = getTableStructureRO; + t.is(structure.length, 5); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(readonly_fields.length, 0); + t.is(table_widgets.length, 0); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const fakeConnectionId = faker.string.uuid(); - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const fakeConnectionId = faker.string.uuid(); + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${connections.firstId}?tableName=`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${fakeTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'POST /table/row/:slug'; +currentTest = "POST /table/row/:slug"; test.serial(`${currentTest} should return added row`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTable.status, 201); - t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); - t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); - t.is(addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], randomEmail); - t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTable.status, 201); + t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); + t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); + t.is( + addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], + randomEmail, + ); + t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(addRowInTableRO, "structure"), true); + t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'PUT /table/row/:slug'; +currentTest = "PUT /table/row/:slug"; test.serial( - `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(updateRowInTable.text); - t.is(updateRowInTable.status, 403); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const updateRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(updateRowInTable.text); + t.is(updateRowInTable.status, 403); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'DELETE /table/row/:slug'; +currentTest = "DELETE /table/row/:slug"; test.serial(`${currentTest} should return delete result`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTable.status, 200); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteRowInTable.status, 200); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - t.is(deleteRowInTable.status, 403); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 403); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /table/row/:slug'; +currentTest = "GET /table/row/:slug"; test.serial(`${currentTest} should return row`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getRowInTable.text); - t.is(getRowInTable.status, 200); - t.is(getRowInTableRO.row.id, 7); - t.is(Object.hasOwn(getRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(getRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(getRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(getRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(getRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getRowInTable.text); + t.is(getRowInTable.status, 200); + t.is(getRowInTableRO.row.id, 7); + t.is(Object.hasOwn(getRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(getRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(getRowInTableRO, "structure"), true); + t.is(Object.hasOwn(getRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(getRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(getRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** TABLE LOGS CONTROLLER TESTS ******************************// -currentTest = 'GET /logs/:slug'; - -test.serial(`${currentTest} should return all found logs in connection'`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 1); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'table_name'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'received_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'old_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'cognitoUserName'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'email'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationType'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationStatusResult'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'createdAt'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'connection_id'), true); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /logs/:slug"; test.serial( - `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - - const updateConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 200); - - const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded( - firstTableInfo.testTableName, - false, - ); - - const createConnectionPropertiesResponse = await request(app.getHttpServer()) - .post(`/connection/properties/${connections.firstId}`) - .send(newConnectionProperties) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const createConnectionPropertiesResponseRO = JSON.parse(createConnectionPropertiesResponse.text); - console.log('🚀 ~ test ~ createConnectionPropertiesResponseRO:', createConnectionPropertiesResponseRO); - t.is(createConnectionPropertiesResponse.status, 201); - - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found logs in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 1); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "table_name"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "received_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "old_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "cognitoUserName"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "email"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "operationType"), true); + t.is( + Object.hasOwn(getRowInTableRO.logs[0], "operationStatusResult"), + true, + ); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "createdAt"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "connection_id"), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + + const updateConnection = + mockFactory.generateConnectionToTestPostgresDBInDocker(); + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 200); + + const newConnectionProperties = + mockFactory.generateConnectionPropertiesUserExcluded( + firstTableInfo.testTableName, + false, + ); + + const createConnectionPropertiesResponse = await request( + app.getHttpServer(), + ) + .post(`/connection/properties/${connections.firstId}`) + .send(newConnectionProperties) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const createConnectionPropertiesResponseRO = JSON.parse( + createConnectionPropertiesResponse.text, + ); + console.log( + "🚀 ~ test ~ createConnectionPropertiesResponseRO:", + createConnectionPropertiesResponseRO, + ); + t.is(createConnectionPropertiesResponse.status, 201); + + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE SETTINGS CONTROLLER TESTS ******************************// -currentTest = 'GET /settings/'; +currentTest = "GET /settings/"; test.skip(`${currentTest} should return empty object when table settings was not created`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.deepEqual(getTableSettingsRO, {}); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.deepEqual(getTableSettingsRO, {}); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} 'should should return created table settings`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} 'should should return created table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'POST /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - 'users', - ['id'], - ['email'], - ['name'], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - t.is(JSON.parse(createTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "POST /settings/"; test.serial( - `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - - const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + "users", + ["id"], + ["email"], + ["name"], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + t.is( + JSON.parse(createTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'PUT /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + + const createTableSettingsRO = JSON.parse( + createTableSettingsResponse.text, + ); + t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /settings/"; test.serial( - `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'DELETE /settings/'; - -test.serial(`${currentTest} should return array without deleted table settings`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteTableSettingsResponse.status, 403); - t.is(JSON.parse(deleteTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "DELETE /settings/"; test.serial( - `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteTableSettingsRO = JSON.parse(deleteTableSettingsResponse.text); - t.is(deleteTableSettingsResponse.status, 403); - t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return array without deleted table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteTableSettingsResponse.status, 403); + t.is( + JSON.parse(deleteTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteTableSettingsRO = JSON.parse( + deleteTableSettingsResponse.text, + ); + t.is(deleteTableSettingsResponse.status, 403); + t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE WIDGETS CONTROLLER TESTS ******************************// -currentTest = 'GET /widgets/:slug'; - -test.serial(`${currentTest} should return empty widgets array when widgets not created`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 200); - t.is(getTableWidgetsRO.length, 0); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /widgets/:slug"; -test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgetsRO.length, 2); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 2); - t.truthy(getTableStructureRO.table_widgets.some((w) => w.field_name === newTableWidgets[0].field_name)); - t.truthy(getTableStructureRO.table_widgets.some((w) => w.widget_type === newTableWidgets[1].widget_type)); - t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return empty widgets array when widgets not created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 200); + t.is(getTableWidgetsRO.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 403); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return array of table widgets for table`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgetsRO.length, 2); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 2); + t.truthy( + getTableStructureRO.table_widgets.some( + (w) => w.field_name === newTableWidgets[0].field_name, + ), + ); + t.truthy( + getTableStructureRO.table_widgets.some( + (w) => w.widget_type === newTableWidgets[1].widget_type, + ), + ); + t.is( + compareTableWidgetsArrays( + getTableStructureRO.table_widgets, + newTableWidgets, + ), + true, + ); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'POST /widget/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 403); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "POST /widget/:slug"; + +test.serial( + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-with-table-only-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-with-table-only-permissions-e2e.test.ts index 49d880fa2..77c37b172 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-with-table-only-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-with-table-only-permissions-e2e.test.ts @@ -1,2849 +1,3410 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable security/detect-object-injection */ -import { faker } from '@faker-js/faker'; -import { INestApplication, ValidationPipe } from '@nestjs/common'; -import { Test } from '@nestjs/testing'; -import test from 'ava'; -import cookieParser from 'cookie-parser'; -import request from 'supertest'; -import { ApplicationModule } from '../../../src/app.module.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; -import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; -import { Messages } from '../../../src/exceptions/text/messages.js'; -import { Cacher } from '../../../src/helpers/cache/cacher.js'; -import { Constants } from '../../../src/helpers/constants/constants.js'; -import { DatabaseModule } from '../../../src/shared/database/database.module.js'; -import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { MockFactory } from '../../mock.factory.js'; -import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; -import { TestUtils } from '../../utils/test.utils.js'; -import { createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions } from '../../utils/user-with-different-permissions-utils.js'; -import { inviteUserInCompanyAndAcceptInvitation } from '../../utils/register-user-and-return-user-info.js'; -import { setSaasEnvVariable } from '../../utils/set-saas-env-variable.js'; -import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; -import { ValidationError } from 'class-validator'; -import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { faker } from "@faker-js/faker"; +import { INestApplication, ValidationPipe } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import test from "ava"; +import { ValidationError } from "class-validator"; +import cookieParser from "cookie-parser"; +import request from "supertest"; +import { ApplicationModule } from "../../../src/app.module.js"; +import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { + AccessLevelEnum, + QueryOrderingEnum, +} from "../../../src/enums/index.js"; +import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; +import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; +import { Messages } from "../../../src/exceptions/text/messages.js"; +import { Cacher } from "../../../src/helpers/cache/cacher.js"; +import { Constants } from "../../../src/helpers/constants/constants.js"; +import { DatabaseModule } from "../../../src/shared/database/database.module.js"; +import { DatabaseService } from "../../../src/shared/database/database.service.js"; +import { MockFactory } from "../../mock.factory.js"; +import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; +import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; +import { setSaasEnvVariable } from "../../utils/set-saas-env-variable.js"; +import { TestUtils } from "../../utils/test.utils.js"; +import { createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions } from "../../utils/user-with-different-permissions-utils.js"; let app: INestApplication; let _testUtils: TestUtils; let currentTest: string; const mockFactory = new MockFactory(); -const _newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); +const _newConnectionToPostgres = + mockFactory.generateConnectionToTestPostgresDBInDocker(); const updateConnection = mockFactory.generateUpdateConnectionDto(); const newGroup1 = mockFactory.generateCreateGroupDto1(); const tablePermissions = { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, }; test.before(async () => { - setSaasEnvVariable(); - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + setSaasEnvVariable(); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error("After tests error " + e); + } }); //***************************************** USER NOT ADDED INTO ADMIN GROUP //****************************** CONNECTION CONTROLLER -currentTest = 'GET /connections/'; - -test.serial(`${currentTest} should return connections, where second user have access`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const findAll = await request(app.getHttpServer()) - .get('/connections') - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - t.is(findAll.status, 200); - const _resultRO = JSON.parse(findAll.text); - const result = findAll.body.connections; - t.is(result.length, 1); - const nonTestConnection = result.find(({ connection }) => connection.id === connections.firstId); - for (const key in nonTestConnection.connection) { - t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(key), true); - } - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connections/"; + +test.serial( + `${currentTest} should return connections, where second user have access`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const findAll = await request(app.getHttpServer()) + .get("/connections") + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + t.is(findAll.status, 200); + const _resultRO = JSON.parse(findAll.text); + const result = findAll.body.connections; + t.is(result.length, 1); + const nonTestConnection = result.find( + ({ connection }) => connection.id === connections.firstId, + ); + for (const key in nonTestConnection.connection) { + t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(key), true); + } + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /connection/one/:slug'; +currentTest = "GET /connection/one/:slug"; test.serial(`${currentTest} should return a found connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.firstId; - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - - const result = findOneResponce.body.connection; - for (const key in result) { - t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(key), true); - } - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.firstId; + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(findOneResponce.status, 200); + + const result = findOneResponce.body.connection; + for (const key in result) { + t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(key), true); + } + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} should throw an exception, when you do not have permission in this connection`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.secondId; - - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - // todo add checking connection object properties - t.is(findOneResponce.status, 200); - const findOneRO = JSON.parse(findOneResponce.text); - t.is(Object.hasOwn(findOneRO, 'host'), false); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'PUT /connection'; - -test.serial(`${currentTest} should throw exception you do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should throw an exception, when you do not have permission in this connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.secondId; + + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + // todo add checking connection object properties + t.is(findOneResponce.status, 200); + const findOneRO = JSON.parse(findOneResponce.text); + t.is(Object.hasOwn(findOneRO, "host"), false); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /connection"; test.serial( - `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.secondId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'DELETE /connection/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //deleted connection found in database - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should throw exception you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to delete connection without permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //connection wasn't deleted - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'POST /connection/group/:slug'; - -test.serial(`${currentTest} should throw an exception don not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.secondId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "DELETE /connection/:slug"; test.serial( - `${currentTest} should throw an exception when you try add group in connection without permission in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'PUT /connection/group/:slug'; - -test.serial(`${currentTest} should return connection without deleted group result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - let result = createGroupResponse.body; - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - //after deleting group - result = response.body; - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //deleted connection found in database + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try to delete connection without permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //connection wasn't deleted + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "POST /connection/group/:slug"; test.serial( - `${currentTest} should throw an exception, when you try delete group in connection without permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - const result = createGroupResponse.body; - - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'GET /connection/groups/:slug'; + `${currentTest} should throw an exception don not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try add group in connection without permission in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /connection/group/:slug"; + +test.serial( + `${currentTest} should return connection without deleted group result`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + let result = createGroupResponse.body; + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + //after deleting group + result = response.body; + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try delete group in connection without permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + const result = createGroupResponse.body; + + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /connection/groups/:slug"; test.serial(`${currentTest} should groups in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newRandomGroup2) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - const _groupId = result[0].group.id; - - t.is(Object.hasOwn(result[0].group, 'title'), true); - t.is(result[0].accessLevel, AccessLevelEnum.none); - - const index = result.findIndex((el: any) => { - return el.group.title === 'Admin'; - }); - - t.is(index >= 0, false); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newRandomGroup2) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + const _groupId = result[0].group.id; + + t.is(Object.hasOwn(result[0].group, "title"), true); + t.is(result[0].accessLevel, AccessLevelEnum.none); + + const index = result.findIndex((el: any) => { + return el.group.title === "Admin"; + }); + + t.is(index >= 0, false); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - - const result = JSON.parse(response.text); - t.is(result.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'GET /connection/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const result = JSON.parse(response.text); - t.is(response.status, 200); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table: any) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[tableIndex], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + + const result = JSON.parse(response.text); + t.is(result.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /connection/user/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const foundTableIndex = tables.findIndex((table) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[foundTableIndex], 'object'); - t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); - t.is(tables[foundTableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[foundTableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connection/permissions"; test.serial( - `${currentTest} should return permissions object for current group in current connection for current user`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.secondId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const result = JSON.parse(response.text); + t.is(response.status, 200); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table: any) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[tableIndex], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is( + tables[tableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); + t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /connection/user/permissions"; + +test.serial( + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const foundTableIndex = tables.findIndex( + (table) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[foundTableIndex], "object"); + t.is(Object.hasOwn(tables[foundTableIndex], "accessLevel"), true); + t.is( + tables[foundTableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is( + tables[foundTableIndex].accessLevel.readonly, + tablePermissions.readonly, + ); + t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return permissions object for current group in current connection for current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.secondId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** GROUP CONTROLLER ******************************// -currentTest = 'GET /groups/'; - -test.serial(`${currentTest} should return found groups with current user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - users: { simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/groups/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const { groups, groupsCount } = getGroupsRO; - t.is(groupsCount, 1); - t.is(groups.length, 1); - t.is(Object.hasOwn(groups[0], 'group'), true); - t.is(Object.hasOwn(groups[0], 'accessLevel'), true); - - t.is(Object.hasOwn(groups[0].group, 'title'), true); - t.is(Object.hasOwn(groups[0].group, 'isMain'), true); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /groups/"; -currentTest = 'GET /group/users/:slug'; -test.serial(`${currentTest} it should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { - return !element.group.isMain; - }); - const groupId = getGroupsRO[nonAdminGroupIndex].group.id; - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - const getUsersRO = JSON.parse(response.text); - t.is(Object.hasOwn(getUsersRO, 'message'), true); - t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return found groups with current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + users: { simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/groups/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const { groups, groupsCount } = getGroupsRO; + t.is(groupsCount, 1); + t.is(groups.length, 1); + t.is(Object.hasOwn(groups[0], "group"), true); + t.is(Object.hasOwn(groups[0], "accessLevel"), true); + + t.is(Object.hasOwn(groups[0].group, "title"), true); + t.is(Object.hasOwn(groups[0].group, "isMain"), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); +currentTest = "GET /group/users/:slug"; test.serial( - `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'PUT /group/user'; - -test.serial(`${currentTest} should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 403); - t.is(Object.hasOwn(addUserInGroupRO, 'message'), true); - t.is(addUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} it should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { + return !element.group.isMain; + }); + const groupId = getGroupsRO[nonAdminGroupIndex].group.id; + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + const getUsersRO = JSON.parse(response.text); + t.is(Object.hasOwn(getUsersRO, "message"), true); + t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const email = faker.internet.email(); - const groupId = faker.string.uuid(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT /group/user"; -currentTest = 'DELETE /group/:slug'; - -test.serial(`${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupResponse.status, 403); - t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 403); + t.is(Object.hasOwn(addUserInGroupRO, "message"), true); + t.is(addUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when you try delete admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const adminGroupIndex = getGroupsRO.findIndex((group) => group.group.isMain); - - const groupId = getGroupsRO[adminGroupIndex].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteGroupResponse.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const email = faker.internet.email(); + const groupId = faker.string.uuid(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = faker.string.uuid(); - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "DELETE /group/:slug"; -currentTest = 'PUT /group/user/delete'; - -test.serial(`${currentTest} should throw an exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteUserInGroupResponse.status, 403); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupResponse.status, 403); + t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation(adminUserToken, undefined, app, undefined); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteUserInGroupResponse.status, 400); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when you try delete admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const adminGroupIndex = getGroupsRO.findIndex( + (group) => group.group.isMain, + ); + + const groupId = getGroupsRO[adminGroupIndex].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteGroupResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = faker.string.uuid(); + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /group/user/delete"; + +test.serial( + `${currentTest} should throw an exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteUserInGroupResponse.status, 403); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteUserInGroupResponse.status, 400); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** PERMISSION CONTROLLER TESTS ******************************// -currentTest = 'PUT permissions/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - t.is(createGroupResponse.status, 201); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT permissions/:slug"; test.serial( - `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception object when you update permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const permissions = { - connection: { - accessLevel: AccessLevelEnum.none, - connectionId: connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: groupId, - }, - tables: [ - { - accessLevel: { - add: false, - delete: false, - edit: true, - readonly: false, - visibility: true, - }, - tableName: firstTableInfo.testTableName, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -test.serial(`${currentTest} should throw an exception, when you try change admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups: { firstAdminGroupId }, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.edit, - }, - group: { - groupId: firstAdminGroupId, - accessLevel: AccessLevelEnum.none, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${firstAdminGroupId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + t.is(createGroupResponse.status, 201); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception object when you update permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const permissions = { + connection: { + accessLevel: AccessLevelEnum.none, + connectionId: connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: groupId, + }, + tables: [ + { + accessLevel: { + add: false, + delete: false, + edit: true, + readonly: false, + visibility: true, + }, + tableName: firstTableInfo.testTableName, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try change admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups: { firstAdminGroupId }, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.edit, + }, + group: { + groupId: firstAdminGroupId, + accessLevel: AccessLevelEnum.none, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${firstAdminGroupId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** TABLE CONTROLLER TESTS ******************************// -currentTest = 'GET /connection/tables/:slug'; - -test.serial(`${currentTest} should return all tables in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.length > 0, true); - const tableIndex = getTablesInConnectionRO.findIndex( - (table: any) => table.table === testData.firstTableInfo.testTableName, - ); - t.is(getTablesInConnectionRO[tableIndex].table, testData.firstTableInfo.testTableName); - t.is(typeof getTablesInConnectionRO[tableIndex].permissions, 'object'); - const { visibility, readonly, add, delete: del, edit } = getTablesInConnectionRO[0].permissions; - t.is(visibility, tablePermissions.visibility); - t.is(readonly, tablePermissions.readonly); - t.is(del, tablePermissions.delete); - t.is(edit, tablePermissions.edit); - t.is(add, tablePermissions.add); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connection/tables/:slug"; -test.serial(`${currentTest} should throw an exception, when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return all tables in connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.length > 0, true); + const tableIndex = getTablesInConnectionRO.findIndex( + (table: any) => table.table === testData.firstTableInfo.testTableName, + ); + t.is( + getTablesInConnectionRO[tableIndex].table, + testData.firstTableInfo.testTableName, + ); + t.is(typeof getTablesInConnectionRO[tableIndex].permissions, "object"); + const { + visibility, + readonly, + add, + delete: del, + edit, + } = getTablesInConnectionRO[0].permissions; + t.is(visibility, tablePermissions.visibility); + t.is(readonly, tablePermissions.readonly); + t.is(del, tablePermissions.delete); + t.is(edit, tablePermissions.edit); + t.is(add, tablePermissions.add); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${fakeConnectionId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 400); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'GET /table/rows/:slug'; + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 400); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /table/rows/:slug"; test.serial(`${currentTest} should return found rows from table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 200); - const getTableRowsRO = JSON.parse(getTableRows.text); - const { rows, primaryColumns, pagination, sortable_by, structure, foreignKeys } = getTableRowsRO; - t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(sortable_by.length, 0); - t.is(structure.length, 5); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 200); + const getTableRowsRO = JSON.parse(getTableRows.text); + const { + rows, + primaryColumns, + pagination, + sortable_by, + structure, + foreignKeys, + } = getTableRowsRO; + t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(sortable_by.length, 0); + t.is(structure.length, 5); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrec`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeId = faker.string.uuid(); - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTableRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrec`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeId = faker.string.uuid(); + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTableRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTablesRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTablesRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /table/structure/:slug'; +currentTest = "GET /table/structure/:slug"; test.serial(`${currentTest} should return table structure`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTablesStructure.text); - - t.is(getTablesStructure.status, 200); - const { structure, primaryColumns, foreignKeys, readonly_fields, table_widgets } = getTableStructureRO; - t.is(structure.length, 5); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(readonly_fields.length, 0); - t.is(table_widgets.length, 0); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTablesStructure.text); + + t.is(getTablesStructure.status, 200); + const { + structure, + primaryColumns, + foreignKeys, + readonly_fields, + table_widgets, + } = getTableStructureRO; + t.is(structure.length, 5); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(readonly_fields.length, 0); + t.is(table_widgets.length, 0); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const fakeConnectionId = faker.string.uuid(); - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const fakeConnectionId = faker.string.uuid(); + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${connections.firstId}?tableName=`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${fakeTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'POST /table/row/:slug'; +currentTest = "POST /table/row/:slug"; test.serial(`${currentTest} should return added row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTable.status, 201); - t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); - t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); - t.is(addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], randomEmail); - t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTable.status, 201); + t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); + t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); + t.is( + addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], + randomEmail, + ); + t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(addRowInTableRO, "structure"), true); + t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'PUT /table/row/:slug'; - -test.serial( - `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(updateRowInTable.text); - t.is(updateRowInTable.status, 403); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT /table/row/:slug"; -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const updateRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(updateRowInTable.text); + t.is(updateRowInTable.status, 403); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'DELETE /table/row/:slug'; +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "DELETE /table/row/:slug"; test.serial(`${currentTest} should return delete result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTable.status, 200); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteRowInTable.status, 200); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - t.is(deleteRowInTable.status, 403); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 403); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /table/row/:slug'; +currentTest = "GET /table/row/:slug"; test.serial(`${currentTest} should return row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getRowInTable.text); - t.is(getRowInTable.status, 200); - t.is(getRowInTableRO.row.id, 7); - t.is(Object.hasOwn(getRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(getRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(getRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(getRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(getRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getRowInTable.text); + t.is(getRowInTable.status, 200); + t.is(getRowInTableRO.row.id, 7); + t.is(Object.hasOwn(getRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(getRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(getRowInTableRO, "structure"), true); + t.is(Object.hasOwn(getRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(getRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(getRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** TABLE LOGS CONTROLLER TESTS ******************************// -currentTest = 'GET /logs/:slug'; - -test.serial(`${currentTest} should return all found logs in connection'`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 1); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'table_name'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'received_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'old_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'cognitoUserName'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'email'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationType'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationStatusResult'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'createdAt'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'connection_id'), true); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /logs/:slug"; test.serial( - `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - - const updateConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 200); - - const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded( - firstTableInfo.testTableName, - false, - ); - newConnectionProperties.hidden_tables = []; - newConnectionProperties.tables_audit = false; - - const createConnectionPropertiesResponse = await request(app.getHttpServer()) - .post(`/connection/properties/${connections.firstId}`) - .send(newConnectionProperties) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const _connectionPropertiesResult = JSON.parse(createConnectionPropertiesResponse.text); - - t.is(createConnectionPropertiesResponse.status, 201); - - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found logs in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 1); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "table_name"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "received_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "old_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "cognitoUserName"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "email"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "operationType"), true); + t.is( + Object.hasOwn(getRowInTableRO.logs[0], "operationStatusResult"), + true, + ); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "createdAt"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "connection_id"), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + + const updateConnection = + mockFactory.generateConnectionToTestPostgresDBInDocker(); + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 200); + + const newConnectionProperties = + mockFactory.generateConnectionPropertiesUserExcluded( + firstTableInfo.testTableName, + false, + ); + newConnectionProperties.hidden_tables = []; + newConnectionProperties.tables_audit = false; + + const createConnectionPropertiesResponse = await request( + app.getHttpServer(), + ) + .post(`/connection/properties/${connections.firstId}`) + .send(newConnectionProperties) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const _connectionPropertiesResult = JSON.parse( + createConnectionPropertiesResponse.text, + ); + + t.is(createConnectionPropertiesResponse.status, 201); + + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE SETTINGS CONTROLLER TESTS ******************************// -currentTest = 'GET /settings/'; - -test.serial( - `${currentTest} should exception ${Messages.DONT_HAVE_PERMISSIONS} when table settings was not created`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -test.serial(`${currentTest} 'should should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /settings/"; test.serial( - `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'POST /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - 'users', - ['id'], - ['email'], - ['name'], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - t.is(JSON.parse(createTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should exception ${Messages.DONT_HAVE_PERMISSIONS} when table settings was not created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - - const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'PUT /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} 'should should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'DELETE /settings/'; - -test.serial(`${currentTest} should return array without deleted table settings`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteTableSettingsResponse.status, 403); - t.is(JSON.parse(deleteTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "POST /settings/"; + +test.serial( + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + "users", + ["id"], + ["email"], + ["name"], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + t.is( + JSON.parse(createTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + + const createTableSettingsRO = JSON.parse( + createTableSettingsResponse.text, + ); + t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /settings/"; test.serial( - `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteTableSettingsRO = JSON.parse(deleteTableSettingsResponse.text); - t.is(deleteTableSettingsResponse.status, 403); - t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "DELETE /settings/"; + +test.serial( + `${currentTest} should return array without deleted table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteTableSettingsResponse.status, 403); + t.is( + JSON.parse(deleteTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteTableSettingsRO = JSON.parse( + deleteTableSettingsResponse.text, + ); + t.is(deleteTableSettingsResponse.status, 403); + t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE WIDGETS CONTROLLER TESTS ******************************// -currentTest = 'GET /widgets/:slug'; - -test.serial(`${currentTest} should return empty widgets array when widgets not created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 403); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /widgets/:slug"; -test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 403); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 2); - getTableStructureRO.table_widgets.sort((a, b) => a.field_name.localeCompare(b.field_name)) - newTableWidgets.sort((a, b) => a.field_name.localeCompare(b.field_name)) - t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); - t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return empty widgets array when widgets not created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 403); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 403); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'POST /widget/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should return array of table widgets for table`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 403); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 2); + getTableStructureRO.table_widgets.sort((a, b) => + a.field_name.localeCompare(b.field_name), + ); + newTableWidgets.sort((a, b) => a.field_name.localeCompare(b.field_name)); + t.is( + getTableStructureRO.table_widgets[0].field_name, + newTableWidgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[1].widget_type, + newTableWidgets[1].widget_type, + ); + t.is( + compareTableWidgetsArrays( + getTableStructureRO.table_widgets, + newTableWidgets, + ), + true, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 403); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "POST /widget/:slug"; + +test.serial( + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); diff --git a/backend/test/ava-tests/saas-tests/table-widgets-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-widgets-e2e.test.ts index 0ec02dfc5..d5a5d71cc 100644 --- a/backend/test/ava-tests/saas-tests/table-widgets-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-widgets-e2e.test.ts @@ -1,1273 +1,1455 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { DynamoDB, PutItemCommand, PutItemCommandInput } from '@aws-sdk/client-dynamodb'; -import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb'; -import { faker } from '@faker-js/faker'; -import { INestApplication, ValidationPipe } from '@nestjs/common'; -import { Test } from '@nestjs/testing'; -import test from 'ava'; -import { ValidationError } from 'class-validator'; -import cookieParser from 'cookie-parser'; -import ibmdb from 'ibm_db'; -import JSON5 from 'json5'; -import { MongoClient } from 'mongodb'; -import request from 'supertest'; -import { ApplicationModule } from '../../../src/app.module.js'; -import { CreateOrUpdateTableWidgetsDto } from '../../../src/entities/widget/dto/create-table-widget.dto.js'; -import { WidgetTypeEnum } from '../../../src/enums/widget-type.enum.js'; -import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; -import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; -import { Messages } from '../../../src/exceptions/text/messages.js'; -import { Cacher } from '../../../src/helpers/cache/cacher.js'; -import { DatabaseModule } from '../../../src/shared/database/database.module.js'; -import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { MockFactory } from '../../mock.factory.js'; -import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; -import { createTestTable } from '../../utils/create-test-table.js'; -import { getRandomTestTableName } from '../../utils/get-random-test-table-name.js'; -import { getTestData } from '../../utils/get-test-data.js'; -import { getTestKnex } from '../../utils/get-test-knex.js'; -import { registerUserAndReturnUserInfo } from '../../utils/register-user-and-return-user-info.js'; -import { TestUtils } from '../../utils/test.utils.js'; -import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { + DynamoDB, + PutItemCommand, + PutItemCommandInput, +} from "@aws-sdk/client-dynamodb"; +import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"; +import { faker } from "@faker-js/faker"; +import { INestApplication, ValidationPipe } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import test from "ava"; +import { ValidationError } from "class-validator"; +import cookieParser from "cookie-parser"; +import ibmdb from "ibm_db"; +import JSON5 from "json5"; +import { MongoClient } from "mongodb"; +import request from "supertest"; +import { ApplicationModule } from "../../../src/app.module.js"; +import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { CreateOrUpdateTableWidgetsDto } from "../../../src/entities/widget/dto/create-table-widget.dto.js"; +import { WidgetTypeEnum } from "../../../src/enums/widget-type.enum.js"; +import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; +import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; +import { Messages } from "../../../src/exceptions/text/messages.js"; +import { Cacher } from "../../../src/helpers/cache/cacher.js"; +import { DatabaseModule } from "../../../src/shared/database/database.module.js"; +import { DatabaseService } from "../../../src/shared/database/database.service.js"; +import { MockFactory } from "../../mock.factory.js"; +import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; +import { createTestTable } from "../../utils/create-test-table.js"; +import { getRandomTestTableName } from "../../utils/get-random-test-table-name.js"; +import { getTestData } from "../../utils/get-test-data.js"; +import { getTestKnex } from "../../utils/get-test-knex.js"; +import { registerUserAndReturnUserInfo } from "../../utils/register-user-and-return-user-info.js"; +import { TestUtils } from "../../utils/test.utils.js"; const mockFactory = new MockFactory(); let app: INestApplication; let _testUtils: TestUtils; let currentTest; -const tableNameForWidgets = 'connection'; +const tableNameForWidgets = "connection"; -const _uuidRegex: RegExp = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i; +const _uuidRegex: RegExp = + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i; test.before(async () => { - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error("After tests error " + e); + } }); -currentTest = 'GET /widgets/:slug'; - -test.serial(`${currentTest} should return empty array, table widgets not created`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 200); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 0); -}); +currentTest = "GET /widgets/:slug"; -test.skip( - `${currentTest} should return automatically created widgets array, if table contains specific data`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; - const { testTableName } = await createTestTable(connectionToTestDB, undefined, undefined, false, true); - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', firstUserToken) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createdConnection.status, 201); - const connectionId = JSON.parse(createdConnection.text).id; - - // wait 3 seconds to let the system create widgets automatically in the background - - await new Promise((resolve) => setTimeout(resolve, 3000)); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', firstUserToken) - .set('Accept', 'application/json'); - - const foundRows = await request(app.getHttpServer()) - .get(`/table/rows/${connectionId}?tableName=${testTableName}`) - .set('Cookie', firstUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(foundRows.status, 200); - const _foundRowsRO = JSON.parse(foundRows.text); - - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgets.status, 200); - t.is(getTableWidgetsRO.length, 8); - const phoneWidget = getTableWidgetsRO.find((w) => w.widget_type === WidgetTypeEnum.Phone); - t.truthy(phoneWidget); - const uuidWidget = getTableWidgetsRO.find((w) => w.widget_type === WidgetTypeEnum.UUID); - t.truthy(uuidWidget); - const countryCodeWidget = getTableWidgetsRO.find((w) => w.widget_type === WidgetTypeEnum.Country); - t.truthy(countryCodeWidget); - const emailWidget = getTableWidgetsRO.find((w) => w.widget_type === WidgetTypeEnum.String); - t.truthy(emailWidget); - t.is(emailWidget.widget_params.includes('"validate": "isEmail"'), true); - const urlWidget = getTableWidgetsRO.find((w) => w.widget_type === WidgetTypeEnum.URL); - t.truthy(urlWidget); - const foundColorWIdgets = getTableWidgetsRO.filter((w) => w.widget_type === WidgetTypeEnum.Color); - t.is(foundColorWIdgets.length, 3); - }, +test.serial( + `${currentTest} should return empty array, table widgets not created`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 200); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 0); + }, ); -test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); - t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 2); - t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); - t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); +test.skip(`${currentTest} should return automatically created widgets array, if table contains specific data`, async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; + const firstUserToken = (await registerUserAndReturnUserInfo(app)).token; + const { testTableName } = await createTestTable( + connectionToTestDB, + undefined, + undefined, + false, + true, + ); + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(connectionToTestDB) + .set("Cookie", firstUserToken) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createdConnection.status, 201); + const connectionId = JSON.parse(createdConnection.text).id; + + // wait 3 seconds to let the system create widgets automatically in the background + + await new Promise((resolve) => setTimeout(resolve, 3000)); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${testTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", firstUserToken) + .set("Accept", "application/json"); + + const foundRows = await request(app.getHttpServer()) + .get(`/table/rows/${connectionId}?tableName=${testTableName}`) + .set("Cookie", firstUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(foundRows.status, 200); + const _foundRowsRO = JSON.parse(foundRows.text); + + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgets.status, 200); + t.is(getTableWidgetsRO.length, 8); + const phoneWidget = getTableWidgetsRO.find( + (w) => w.widget_type === WidgetTypeEnum.Phone, + ); + t.truthy(phoneWidget); + const uuidWidget = getTableWidgetsRO.find( + (w) => w.widget_type === WidgetTypeEnum.UUID, + ); + t.truthy(uuidWidget); + const countryCodeWidget = getTableWidgetsRO.find( + (w) => w.widget_type === WidgetTypeEnum.Country, + ); + t.truthy(countryCodeWidget); + const emailWidget = getTableWidgetsRO.find( + (w) => w.widget_type === WidgetTypeEnum.String, + ); + t.truthy(emailWidget); + t.is(emailWidget.widget_params.includes('"validate": "isEmail"'), true); + const urlWidget = getTableWidgetsRO.find( + (w) => w.widget_type === WidgetTypeEnum.URL, + ); + t.truthy(urlWidget); + const foundColorWIdgets = getTableWidgetsRO.filter( + (w) => w.widget_type === WidgetTypeEnum.Color, + ); + t.is(foundColorWIdgets.length, 3); }); -test.serial(`${currentTest} should throw exception when connection id not passed in request`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const emptyConnectionId = ''; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${emptyConnectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 404); -}); +test.serial( + `${currentTest} should return array of table widgets for table`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Cookie", token) + .set("Content-Type", "application/json") + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); + t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get(`/table/structure/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 2); + t.is( + getTableStructureRO.table_widgets[0].field_name, + newTableWidgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[1].widget_type, + newTableWidgets[1].widget_type, + ); + t.is( + compareTableWidgetsArrays( + getTableStructureRO.table_widgets, + newTableWidgets, + ), + true, + ); + }, +); -test.serial(`${currentTest} should throw exception when connection id passed in request is incorrect`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const fakeConnectionId = faker.string.uuid(); - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${fakeConnectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - - t.is(getTableWidgets.status, 403); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); -}); +test.serial( + `${currentTest} should throw exception when connection id not passed in request`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Cookie", token) + .set("Content-Type", "application/json") + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + + const emptyConnectionId = ""; + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${emptyConnectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 404); + }, +); -test.serial(`${currentTest} should throw exception when tableName passed in request is incorrect`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 400); - - t.is(getTableWidgetsRO.message, Messages.TABLE_NOT_FOUND); -}); +test.serial( + `${currentTest} should throw exception when connection id passed in request is incorrect`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + + const fakeConnectionId = faker.string.uuid(); + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${fakeConnectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + + t.is(getTableWidgets.status, 403); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + }, +); -test.serial(`${currentTest} should throw exception when tableName not passed in request`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(Array.isArray(createTableWidgetRO), true); - t.is(createTableWidgetRO.length, newTableWidgets.length); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); - - const fakeTableName = ''; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 400); - - t.is(getTableWidgetsRO.message, Messages.TABLE_NAME_MISSING); -}); +test.serial( + `${currentTest} should throw exception when tableName passed in request is incorrect`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 400); + + t.is(getTableWidgetsRO.message, Messages.TABLE_NOT_FOUND); + }, +); -currentTest = 'POST /widget/:slug'; +test.serial( + `${currentTest} should throw exception when tableName not passed in request`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(Array.isArray(createTableWidgetRO), true); + t.is(createTableWidgetRO.length, newTableWidgets.length); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + t.is(createTableWidgetRO[0].description, newTableWidgets[0].description); + + const fakeTableName = ""; + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${fakeTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 400); + + t.is(getTableWidgetsRO.message, Messages.TABLE_NAME_MISSING); + }, +); + +currentTest = "POST /widget/:slug"; test.serial(`${currentTest} should return created table widgets`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidget = mockFactory.generateCreateWidgetDTOForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=connection`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=connection`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].widget_type, newTableWidget.widget_type); - t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidget = + mockFactory.generateCreateWidgetDTOForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=connection`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=connection`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].widget_type, newTableWidget.widget_type); + t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); }); test.serial(`${currentTest} hould return updated table widgets`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - const updatedTableWidgets = mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); - const updateTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: updatedTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); - - t.is(updateTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].widget_type, updatedTableWidgets[0].widget_type); - t.is(compareTableWidgetsArrays(getTableWidgetsRO, updatedTableWidgets), true); + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + const updatedTableWidgets = + mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); + const updateTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: updatedTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); + + t.is(updateTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].widget_type, updatedTableWidgets[0].widget_type); + t.is(compareTableWidgetsArrays(getTableWidgetsRO, updatedTableWidgets), true); }); -test.serial(`${currentTest} should return updated table widgets when old widget updated and new added`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const connectionId = JSON.parse(createdConnection.text).id; - newTableWidgets.shift(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - const updatedTableWidgets = mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); - const updateTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: updatedTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); - - t.is(updateTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('masterpwd', 'ahalaimahalai') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].widget_type, updatedTableWidgets[0].widget_type); - - t.is(compareTableWidgetsArrays(getTableWidgetsRO, updatedTableWidgets), true); -}); +test.serial( + `${currentTest} should return updated table widgets when old widget updated and new added`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const connectionId = JSON.parse(createdConnection.text).id; + newTableWidgets.shift(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + const updatedTableWidgets = + mockFactory.generateUpdateWidgetDTOsArrayForConnectionTable(); + const updateTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: updatedTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); + + t.is(updateTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("masterpwd", "ahalaimahalai") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].widget_type, updatedTableWidgets[0].widget_type); + + t.is( + compareTableWidgetsArrays(getTableWidgetsRO, updatedTableWidgets), + true, + ); + }, +); -test.serial(`${currentTest} should return table widgets without deleted widget`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - const copyWidgets = [...newTableWidgets]; - copyWidgets.splice(1, 1); - - const updateTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: copyWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); - t.is(updateTableWidgetRO.length, 1); - - t.is(updateTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 1); -}); +test.serial( + `${currentTest} should return table widgets without deleted widget`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const copyWidgets = [...newTableWidgets]; + copyWidgets.splice(1, 1); + + const updateTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: copyWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const updateTableWidgetRO = JSON.parse(updateTableWidgetResponse.text); + t.is(updateTableWidgetRO.length, 1); + + t.is(updateTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${tableNameForWidgets}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 1); + }, +); test.skip(`${currentTest} should throw exception when table widget with incorrect type passed in request`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const copyWidgets = [...newTableWidgets]; - copyWidgets[0].widget_type = faker.lorem.words(1); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: copyWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 400); - t.is(createTableWidgetRO.message, Messages.WIDGET_TYPE_INCORRECT); + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const copyWidgets = [...newTableWidgets]; + copyWidgets[0].widget_type = faker.lorem.words(1); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: copyWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 400); + t.is(createTableWidgetRO.message, Messages.WIDGET_TYPE_INCORRECT); }); test.serial( - `${currentTest} should throw exception when table widget passed in request has incorrect field_name`, - async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const copyWidgets = [...newTableWidgets]; - copyWidgets[0].field_name = faker.lorem.words(1); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 400); - t.is(createTableWidgetRO.message, Messages.EXCLUDED_OR_NOT_EXISTS(copyWidgets[0].field_name)); - }, + `${currentTest} should throw exception when table widget passed in request has incorrect field_name`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const copyWidgets = [...newTableWidgets]; + copyWidgets[0].field_name = faker.lorem.words(1); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 400); + t.is( + createTableWidgetRO.message, + Messages.EXCLUDED_OR_NOT_EXISTS(copyWidgets[0].field_name), + ); + }, ); -test.serial(`${currentTest} should throw exception when connection id not passed in request`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const _connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const emptyId = ''; - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${emptyId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - t.is(createTableWidgetResponse.status, 404); -}); +test.serial( + `${currentTest} should throw exception when connection id not passed in request`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const _connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const emptyId = ""; + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${emptyId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + t.is(createTableWidgetResponse.status, 404); + }, +); -test.serial(`${currentTest} should throw exception when connection id passed in request is incorrect`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const _connectionId = JSON.parse(createdConnection.text).id; - const fakeConnectionId = faker.string.uuid(); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${fakeConnectionId}?tableName=${tableNameForWidgets}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); -}); +test.serial( + `${currentTest} should throw exception when connection id passed in request is incorrect`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const _connectionId = JSON.parse(createdConnection.text).id; + const fakeConnectionId = faker.string.uuid(); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${fakeConnectionId}?tableName=${tableNameForWidgets}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + }, +); -test.serial(`${currentTest} should throw exception when tableName passed in request is incorrect`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${fakeTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 400); - t.is(createTableWidgetRO.message, Messages.TABLE_NOT_FOUND); -}); +test.serial( + `${currentTest} should throw exception when tableName passed in request is incorrect`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${fakeTableName}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 400); + t.is(createTableWidgetRO.message, Messages.TABLE_NOT_FOUND); + }, +); -test.serial(`${currentTest} should throw exception when tableName not passed in request`, async (t) => { - const { token } = await registerUserAndReturnUserInfo(app); - const newConnection = getTestData(mockFactory).newEncryptedConnection; - const createdConnection = await request(app.getHttpServer()) - .post('/connection') - .send(newConnection) - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const connectionId = JSON.parse(createdConnection.text).id; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); - const fakeTableName = ''; - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${fakeTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('masterpwd', 'ahalaimahalai') - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 400); - t.is(createTableWidgetRO.message, Messages.TABLE_NAME_MISSING); -}); +test.serial( + `${currentTest} should throw exception when tableName not passed in request`, + async (t) => { + const { token } = await registerUserAndReturnUserInfo(app); + const newConnection = getTestData(mockFactory).newEncryptedConnection; + const createdConnection = await request(app.getHttpServer()) + .post("/connection") + .send(newConnection) + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const connectionId = JSON.parse(createdConnection.text).id; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForConnectionTable(); + const fakeTableName = ""; + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${fakeTableName}`) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("masterpwd", "ahalaimahalai") + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 400); + t.is(createTableWidgetRO.message, Messages.TABLE_NAME_MISSING); + }, +); //foreign key widget tests -currentTest = 'POST /widget/:slug/'; +currentTest = "POST /widget/:slug/"; test.serial( - `${currentTest} should return created table widgets for postgres database and return rows with attached foreign entities info`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; - const { token } = await registerUserAndReturnUserInfo(app); - const firstTableData = await createTestTable(connectionToTestDB); - const connectionParamsCopy = { - ...connectionToTestDB, - }; - if (connectionToTestDB.type === 'mysql') { - connectionParamsCopy.type = 'mysql2'; - } - - const Knex = getTestKnex(connectionParamsCopy); - const referencedTableTableName = `referenced_table_${faker.string.uuid()}`; - const referencedColumnName = 'referenced_on_id'; - const secondColumnInReferencedTable = faker.lorem.words(1); - await Knex.schema.createTable(referencedTableTableName, (table) => { - table.increments(); - table.integer(referencedColumnName); - table.string(secondColumnInReferencedTable); - table.timestamps(); - }); - - for (let index = 0; index < 42; index++) { - await Knex(referencedTableTableName).insert({ - [referencedColumnName]: faker.number.int({ min: 1, max: 42 }), - [secondColumnInReferencedTable]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } - - const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { - widgets: [ - { - widget_type: WidgetTypeEnum.Foreign_key, - widget_params: JSON.stringify({ - referenced_column_name: 'id', - referenced_table_name: firstTableData.testTableName, - constraint_name: 'manually_created_constraint', - column_name: referencedColumnName, - }), - field_name: referencedColumnName, - description: 'User ID as foreign key', - name: 'User ID', - widget_options: JSON.stringify({}), - }, - ], - }; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const connectionId = createConnectionRO.id; - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${referencedTableTableName}`) - .send(foreignKeyWidgetsDTO) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 1); - - t.is(getTableWidgetsRO[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(getTableStructureResponse.status, 200); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 1); - t.is(getTableStructureRO.table_widgets[0].field_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.table_widgets[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - t.is(getTableStructureRO.foreignKeys.length, 1); - t.is(getTableStructureRO.foreignKeys[0].column_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.foreignKeys[0].referenced_table_name, firstTableData.testTableName); - const widgetParams = JSON5.parse(getTableStructureRO.table_widgets[0].widget_params); - t.is(widgetParams.referenced_table_name, firstTableData.testTableName); - t.is(widgetParams.referenced_column_name, 'id'); - t.is(widgetParams.constraint_name, 'manually_created_constraint'); - t.is(widgetParams.column_name, referencedColumnName); - t.is(Object.hasOwn(getTableStructureRO.foreignKeys[0], 'autocomplete_columns'), true); - t.is(getTableStructureRO.foreignKeys[0].autocomplete_columns.length, 5); - - // check table rows received with foreign keys from widget - - const getRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getRowsResponse.status, 200); - const getRowsRO = JSON.parse(getRowsResponse.text); - t.is(typeof getRowsRO.rows[0], 'object'); - for (const row of getRowsRO.rows) { - t.is(Object.hasOwn(row, 'id'), true); - t.is(Object.hasOwn(row, referencedColumnName), true); - t.is(Object.hasOwn(row[referencedColumnName], 'id'), true); - } - }, + `${currentTest} should return created table widgets for postgres database and return rows with attached foreign entities info`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToPostgres; + const { token } = await registerUserAndReturnUserInfo(app); + const firstTableData = await createTestTable(connectionToTestDB); + const connectionParamsCopy = { + ...connectionToTestDB, + }; + if (connectionToTestDB.type === "mysql") { + connectionParamsCopy.type = "mysql2"; + } + + const Knex = getTestKnex(connectionParamsCopy); + const referencedTableTableName = `referenced_table_${faker.string.uuid()}`; + const referencedColumnName = "referenced_on_id"; + const secondColumnInReferencedTable = faker.lorem.words(1); + await Knex.schema.createTable(referencedTableTableName, (table) => { + table.increments(); + table.integer(referencedColumnName); + table.string(secondColumnInReferencedTable); + table.timestamps(); + }); + + for (let index = 0; index < 42; index++) { + await Knex(referencedTableTableName).insert({ + [referencedColumnName]: faker.number.int({ min: 1, max: 42 }), + [secondColumnInReferencedTable]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } + + const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { + widgets: [ + { + widget_type: WidgetTypeEnum.Foreign_key, + widget_params: JSON.stringify({ + referenced_column_name: "id", + referenced_table_name: firstTableData.testTableName, + constraint_name: "manually_created_constraint", + column_name: referencedColumnName, + }), + field_name: referencedColumnName, + description: "User ID as foreign key", + name: "User ID", + widget_options: JSON.stringify({}), + }, + ], + }; + + const createConnectionResponse = await request(app.getHttpServer()) + .post("/connection") + .send(connectionToTestDB) + .set("Cookie", token) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const connectionId = createConnectionRO.id; + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${referencedTableTableName}`) + .send(foreignKeyWidgetsDTO) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${referencedTableTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 1); + + t.is( + getTableWidgetsRO[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connectionId}?tableName=${referencedTableTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(getTableStructureResponse.status, 200); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 1); + t.is( + getTableStructureRO.table_widgets[0].field_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + t.is(Object.hasOwn(getTableStructureRO, "foreignKeys"), true); + t.is(getTableStructureRO.foreignKeys.length, 1); + t.is( + getTableStructureRO.foreignKeys[0].column_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.foreignKeys[0].referenced_table_name, + firstTableData.testTableName, + ); + const widgetParams = JSON5.parse( + getTableStructureRO.table_widgets[0].widget_params, + ); + t.is(widgetParams.referenced_table_name, firstTableData.testTableName); + t.is(widgetParams.referenced_column_name, "id"); + t.is(widgetParams.constraint_name, "manually_created_constraint"); + t.is(widgetParams.column_name, referencedColumnName); + t.is( + Object.hasOwn(getTableStructureRO.foreignKeys[0], "autocomplete_columns"), + true, + ); + t.is(getTableStructureRO.foreignKeys[0].autocomplete_columns.length, 5); + + // check table rows received with foreign keys from widget + + const getRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${connectionId}?tableName=${referencedTableTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getRowsResponse.status, 200); + const getRowsRO = JSON.parse(getRowsResponse.text); + t.is(typeof getRowsRO.rows[0], "object"); + for (const row of getRowsRO.rows) { + t.is(Object.hasOwn(row, "id"), true); + t.is(Object.hasOwn(row, referencedColumnName), true); + t.is(Object.hasOwn(row[referencedColumnName], "id"), true); + } + }, ); test.serial( - `${currentTest} should return created table widgets for mysql database and return rows with attached foreign entities info`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToMySQL; - const { token } = await registerUserAndReturnUserInfo(app); - const firstTableData = await createTestTable(connectionToTestDB); - const connectionParamsCopy = { - ...connectionToTestDB, - }; - if (connectionToTestDB.type === 'mysql') { - connectionParamsCopy.type = 'mysql2'; - } - - const Knex = getTestKnex(connectionParamsCopy); - const referencedTableTableName = `referenced_table_${faker.string.uuid()}`; - const referencedColumnName = 'referenced_on_id'; - const secondColumnInReferencedTable = faker.lorem.words(1); - await Knex.schema.createTable(referencedTableTableName, (table) => { - table.increments(); - table.integer(referencedColumnName); - table.string(secondColumnInReferencedTable); - table.timestamps(); - }); - - for (let index = 0; index < 42; index++) { - await Knex(referencedTableTableName).insert({ - [referencedColumnName]: faker.number.int({ min: 1, max: 42 }), - [secondColumnInReferencedTable]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } - - const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { - widgets: [ - { - widget_type: WidgetTypeEnum.Foreign_key, - widget_params: JSON.stringify({ - referenced_column_name: 'id', - referenced_table_name: firstTableData.testTableName, - constraint_name: 'manually_created_constraint', - column_name: referencedColumnName, - }), - field_name: referencedColumnName, - description: 'User ID as foreign key', - name: 'User ID', - widget_options: JSON.stringify({}), - }, - ], - }; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const connectionId = createConnectionRO.id; - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${referencedTableTableName}`) - .send(foreignKeyWidgetsDTO) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 1); - - t.is(getTableWidgetsRO[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(getTableStructureResponse.status, 200); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 1); - t.is(getTableStructureRO.table_widgets[0].field_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.table_widgets[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - t.is(getTableStructureRO.foreignKeys.length, 1); - t.is(getTableStructureRO.foreignKeys[0].column_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.foreignKeys[0].referenced_table_name, firstTableData.testTableName); - const widgetParams = JSON5.parse(getTableStructureRO.table_widgets[0].widget_params); - t.is(widgetParams.referenced_table_name, firstTableData.testTableName); - t.is(widgetParams.referenced_column_name, 'id'); - t.is(widgetParams.constraint_name, 'manually_created_constraint'); - t.is(widgetParams.column_name, referencedColumnName); - t.is(Object.hasOwn(getTableStructureRO.foreignKeys[0], 'autocomplete_columns'), true); - t.is(getTableStructureRO.foreignKeys[0].autocomplete_columns.length, 5); - - // check table rows received with foreign keys from widget - - const getRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getRowsResponse.status, 200); - const getRowsRO = JSON.parse(getRowsResponse.text); - t.is(typeof getRowsRO.rows[0], 'object'); - for (const row of getRowsRO.rows) { - t.is(Object.hasOwn(row, 'id'), true); - } - }, + `${currentTest} should return created table widgets for mysql database and return rows with attached foreign entities info`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToMySQL; + const { token } = await registerUserAndReturnUserInfo(app); + const firstTableData = await createTestTable(connectionToTestDB); + const connectionParamsCopy = { + ...connectionToTestDB, + }; + if (connectionToTestDB.type === "mysql") { + connectionParamsCopy.type = "mysql2"; + } + + const Knex = getTestKnex(connectionParamsCopy); + const referencedTableTableName = `referenced_table_${faker.string.uuid()}`; + const referencedColumnName = "referenced_on_id"; + const secondColumnInReferencedTable = faker.lorem.words(1); + await Knex.schema.createTable(referencedTableTableName, (table) => { + table.increments(); + table.integer(referencedColumnName); + table.string(secondColumnInReferencedTable); + table.timestamps(); + }); + + for (let index = 0; index < 42; index++) { + await Knex(referencedTableTableName).insert({ + [referencedColumnName]: faker.number.int({ min: 1, max: 42 }), + [secondColumnInReferencedTable]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } + + const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { + widgets: [ + { + widget_type: WidgetTypeEnum.Foreign_key, + widget_params: JSON.stringify({ + referenced_column_name: "id", + referenced_table_name: firstTableData.testTableName, + constraint_name: "manually_created_constraint", + column_name: referencedColumnName, + }), + field_name: referencedColumnName, + description: "User ID as foreign key", + name: "User ID", + widget_options: JSON.stringify({}), + }, + ], + }; + + const createConnectionResponse = await request(app.getHttpServer()) + .post("/connection") + .send(connectionToTestDB) + .set("Cookie", token) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const connectionId = createConnectionRO.id; + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${referencedTableTableName}`) + .send(foreignKeyWidgetsDTO) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${referencedTableTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 1); + + t.is( + getTableWidgetsRO[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connectionId}?tableName=${referencedTableTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(getTableStructureResponse.status, 200); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 1); + t.is( + getTableStructureRO.table_widgets[0].field_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + t.is(Object.hasOwn(getTableStructureRO, "foreignKeys"), true); + t.is(getTableStructureRO.foreignKeys.length, 1); + t.is( + getTableStructureRO.foreignKeys[0].column_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.foreignKeys[0].referenced_table_name, + firstTableData.testTableName, + ); + const widgetParams = JSON5.parse( + getTableStructureRO.table_widgets[0].widget_params, + ); + t.is(widgetParams.referenced_table_name, firstTableData.testTableName); + t.is(widgetParams.referenced_column_name, "id"); + t.is(widgetParams.constraint_name, "manually_created_constraint"); + t.is(widgetParams.column_name, referencedColumnName); + t.is( + Object.hasOwn(getTableStructureRO.foreignKeys[0], "autocomplete_columns"), + true, + ); + t.is(getTableStructureRO.foreignKeys[0].autocomplete_columns.length, 5); + + // check table rows received with foreign keys from widget + + const getRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${connectionId}?tableName=${referencedTableTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getRowsResponse.status, 200); + const getRowsRO = JSON.parse(getRowsResponse.text); + t.is(typeof getRowsRO.rows[0], "object"); + for (const row of getRowsRO.rows) { + t.is(Object.hasOwn(row, "id"), true); + } + }, ); test.serial( - `${currentTest} should return created table widgets for oracle database and return rows with attached foreign entities info`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToOracleDB; - const { token } = await registerUserAndReturnUserInfo(app); - const firstTableData = await createTestTable(connectionToTestDB); - const connectionParamsCopy = { - ...connectionToTestDB, - }; - if (connectionToTestDB.type === 'mysql') { - connectionParamsCopy.type = 'mysql2'; - } - - const Knex = getTestKnex(connectionParamsCopy); - const referencedTableTableName = `referenced_table_${faker.string.uuid()}`; - const referencedColumnName = 'referenced_on_id'; - const secondColumnInReferencedTable = faker.lorem.words(1); - await Knex.schema.createTable(referencedTableTableName, (table) => { - table.increments(); - table.integer(referencedColumnName); - table.string(secondColumnInReferencedTable); - table.timestamps(); - }); - - for (let index = 0; index < 42; index++) { - await Knex(referencedTableTableName).insert({ - [referencedColumnName]: faker.number.int({ min: 1, max: 42 }), - [secondColumnInReferencedTable]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } - - const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { - widgets: [ - { - widget_type: WidgetTypeEnum.Foreign_key, - widget_params: JSON.stringify({ - referenced_column_name: 'id', - referenced_table_name: firstTableData.testTableName, - constraint_name: 'manually_created_constraint', - column_name: referencedColumnName, - }), - field_name: referencedColumnName, - description: 'User ID as foreign key', - name: 'User ID', - widget_options: JSON.stringify({}), - }, - ], - }; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const connectionId = createConnectionRO.id; - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${referencedTableTableName}`) - .send(foreignKeyWidgetsDTO) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 1); - - t.is(getTableWidgetsRO[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(getTableStructureResponse.status, 200); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 1); - t.is(getTableStructureRO.table_widgets[0].field_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.table_widgets[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - t.is(getTableStructureRO.foreignKeys.length, 1); - t.is(getTableStructureRO.foreignKeys[0].column_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.foreignKeys[0].referenced_table_name, firstTableData.testTableName); - const widgetParams = JSON5.parse(getTableStructureRO.table_widgets[0].widget_params); - t.is(widgetParams.referenced_table_name, firstTableData.testTableName); - t.is(widgetParams.referenced_column_name, 'id'); - t.is(widgetParams.constraint_name, 'manually_created_constraint'); - t.is(widgetParams.column_name, referencedColumnName); - t.is(Object.hasOwn(getTableStructureRO.foreignKeys[0], 'autocomplete_columns'), true); - t.is(getTableStructureRO.foreignKeys[0].autocomplete_columns.length, 5); - - // check table rows received with foreign keys from widget - - const getRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getRowsResponse.status, 200); - const getRowsRO = JSON.parse(getRowsResponse.text); - t.is(typeof getRowsRO.rows[0], 'object'); - for (const row of getRowsRO.rows) { - t.is(Object.hasOwn(row, 'id'), true); - } - }, + `${currentTest} should return created table widgets for oracle database and return rows with attached foreign entities info`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToOracleDB; + const { token } = await registerUserAndReturnUserInfo(app); + const firstTableData = await createTestTable(connectionToTestDB); + const connectionParamsCopy = { + ...connectionToTestDB, + }; + if (connectionToTestDB.type === "mysql") { + connectionParamsCopy.type = "mysql2"; + } + + const Knex = getTestKnex(connectionParamsCopy); + const referencedTableTableName = `referenced_table_${faker.string.uuid()}`; + const referencedColumnName = "referenced_on_id"; + const secondColumnInReferencedTable = faker.lorem.words(1); + await Knex.schema.createTable(referencedTableTableName, (table) => { + table.increments(); + table.integer(referencedColumnName); + table.string(secondColumnInReferencedTable); + table.timestamps(); + }); + + for (let index = 0; index < 42; index++) { + await Knex(referencedTableTableName).insert({ + [referencedColumnName]: faker.number.int({ min: 1, max: 42 }), + [secondColumnInReferencedTable]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } + + const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { + widgets: [ + { + widget_type: WidgetTypeEnum.Foreign_key, + widget_params: JSON.stringify({ + referenced_column_name: "id", + referenced_table_name: firstTableData.testTableName, + constraint_name: "manually_created_constraint", + column_name: referencedColumnName, + }), + field_name: referencedColumnName, + description: "User ID as foreign key", + name: "User ID", + widget_options: JSON.stringify({}), + }, + ], + }; + + const createConnectionResponse = await request(app.getHttpServer()) + .post("/connection") + .send(connectionToTestDB) + .set("Cookie", token) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const connectionId = createConnectionRO.id; + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${referencedTableTableName}`) + .send(foreignKeyWidgetsDTO) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${referencedTableTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 1); + + t.is( + getTableWidgetsRO[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connectionId}?tableName=${referencedTableTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(getTableStructureResponse.status, 200); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 1); + t.is( + getTableStructureRO.table_widgets[0].field_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + t.is(Object.hasOwn(getTableStructureRO, "foreignKeys"), true); + t.is(getTableStructureRO.foreignKeys.length, 1); + t.is( + getTableStructureRO.foreignKeys[0].column_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.foreignKeys[0].referenced_table_name, + firstTableData.testTableName, + ); + const widgetParams = JSON5.parse( + getTableStructureRO.table_widgets[0].widget_params, + ); + t.is(widgetParams.referenced_table_name, firstTableData.testTableName); + t.is(widgetParams.referenced_column_name, "id"); + t.is(widgetParams.constraint_name, "manually_created_constraint"); + t.is(widgetParams.column_name, referencedColumnName); + t.is( + Object.hasOwn(getTableStructureRO.foreignKeys[0], "autocomplete_columns"), + true, + ); + t.is(getTableStructureRO.foreignKeys[0].autocomplete_columns.length, 5); + + // check table rows received with foreign keys from widget + + const getRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${connectionId}?tableName=${referencedTableTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getRowsResponse.status, 200); + const getRowsRO = JSON.parse(getRowsResponse.text); + t.is(typeof getRowsRO.rows[0], "object"); + for (const row of getRowsRO.rows) { + t.is(Object.hasOwn(row, "id"), true); + } + }, ); test.serial( - `${currentTest} should return created table widgets for MSSQL database and return rows with attached foreign entities info`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToTestMSSQL; - const { token } = await registerUserAndReturnUserInfo(app); - const firstTableData = await createTestTable(connectionToTestDB); - const connectionParamsCopy = { - ...connectionToTestDB, - }; - if (connectionToTestDB.type === 'mysql') { - connectionParamsCopy.type = 'mysql2'; - } - - const Knex = getTestKnex(connectionParamsCopy); - const referencedTableTableName = `referenced_table_${faker.string.uuid()}`; - const referencedColumnName = 'referenced_on_id'; - const secondColumnInReferencedTable = faker.lorem.words(1); - await Knex.schema.createTable(referencedTableTableName, (table) => { - table.increments(); - table.integer(referencedColumnName); - table.string(secondColumnInReferencedTable); - table.timestamps(); - }); - - for (let index = 0; index < 42; index++) { - await Knex(referencedTableTableName).insert({ - [referencedColumnName]: faker.number.int({ min: 1, max: 42 }), - [secondColumnInReferencedTable]: faker.internet.email(), - created_at: new Date(), - updated_at: new Date(), - }); - } - - const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { - widgets: [ - { - widget_type: WidgetTypeEnum.Foreign_key, - widget_params: JSON.stringify({ - referenced_column_name: 'id', - referenced_table_name: firstTableData.testTableName, - constraint_name: 'manually_created_constraint', - column_name: referencedColumnName, - }), - field_name: referencedColumnName, - description: 'User ID as foreign key', - name: 'User ID', - widget_options: JSON.stringify({}), - }, - ], - }; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const connectionId = createConnectionRO.id; - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${referencedTableTableName}`) - .send(foreignKeyWidgetsDTO) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 1); - - t.is(getTableWidgetsRO[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(getTableStructureResponse.status, 200); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 1); - t.is(getTableStructureRO.table_widgets[0].field_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.table_widgets[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - t.is(getTableStructureRO.foreignKeys.length, 1); - t.is(getTableStructureRO.foreignKeys[0].column_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.foreignKeys[0].referenced_table_name, firstTableData.testTableName); - const widgetParams = JSON5.parse(getTableStructureRO.table_widgets[0].widget_params); - t.is(widgetParams.referenced_table_name, firstTableData.testTableName); - t.is(widgetParams.referenced_column_name, 'id'); - t.is(widgetParams.constraint_name, 'manually_created_constraint'); - t.is(widgetParams.column_name, referencedColumnName); - t.is(Object.hasOwn(getTableStructureRO.foreignKeys[0], 'autocomplete_columns'), true); - t.is(getTableStructureRO.foreignKeys[0].autocomplete_columns.length, 5); - - // check table rows received with foreign keys from widget - - const getRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${connectionId}?tableName=${referencedTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getRowsResponse.status, 200); - const getRowsRO = JSON.parse(getRowsResponse.text); - t.is(typeof getRowsRO.rows[0], 'object'); - for (const row of getRowsRO.rows) { - t.is(Object.hasOwn(row, 'id'), true); - } - }, + `${currentTest} should return created table widgets for MSSQL database and return rows with attached foreign entities info`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToTestMSSQL; + const { token } = await registerUserAndReturnUserInfo(app); + const firstTableData = await createTestTable(connectionToTestDB); + const connectionParamsCopy = { + ...connectionToTestDB, + }; + if (connectionToTestDB.type === "mysql") { + connectionParamsCopy.type = "mysql2"; + } + + const Knex = getTestKnex(connectionParamsCopy); + const referencedTableTableName = `referenced_table_${faker.string.uuid()}`; + const referencedColumnName = "referenced_on_id"; + const secondColumnInReferencedTable = faker.lorem.words(1); + await Knex.schema.createTable(referencedTableTableName, (table) => { + table.increments(); + table.integer(referencedColumnName); + table.string(secondColumnInReferencedTable); + table.timestamps(); + }); + + for (let index = 0; index < 42; index++) { + await Knex(referencedTableTableName).insert({ + [referencedColumnName]: faker.number.int({ min: 1, max: 42 }), + [secondColumnInReferencedTable]: faker.internet.email(), + created_at: new Date(), + updated_at: new Date(), + }); + } + + const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { + widgets: [ + { + widget_type: WidgetTypeEnum.Foreign_key, + widget_params: JSON.stringify({ + referenced_column_name: "id", + referenced_table_name: firstTableData.testTableName, + constraint_name: "manually_created_constraint", + column_name: referencedColumnName, + }), + field_name: referencedColumnName, + description: "User ID as foreign key", + name: "User ID", + widget_options: JSON.stringify({}), + }, + ], + }; + + const createConnectionResponse = await request(app.getHttpServer()) + .post("/connection") + .send(connectionToTestDB) + .set("Cookie", token) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const connectionId = createConnectionRO.id; + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${referencedTableTableName}`) + .send(foreignKeyWidgetsDTO) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${referencedTableTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 1); + + t.is( + getTableWidgetsRO[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connectionId}?tableName=${referencedTableTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(getTableStructureResponse.status, 200); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 1); + t.is( + getTableStructureRO.table_widgets[0].field_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + t.is(Object.hasOwn(getTableStructureRO, "foreignKeys"), true); + t.is(getTableStructureRO.foreignKeys.length, 1); + t.is( + getTableStructureRO.foreignKeys[0].column_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.foreignKeys[0].referenced_table_name, + firstTableData.testTableName, + ); + const widgetParams = JSON5.parse( + getTableStructureRO.table_widgets[0].widget_params, + ); + t.is(widgetParams.referenced_table_name, firstTableData.testTableName); + t.is(widgetParams.referenced_column_name, "id"); + t.is(widgetParams.constraint_name, "manually_created_constraint"); + t.is(widgetParams.column_name, referencedColumnName); + t.is( + Object.hasOwn(getTableStructureRO.foreignKeys[0], "autocomplete_columns"), + true, + ); + t.is(getTableStructureRO.foreignKeys[0].autocomplete_columns.length, 5); + + // check table rows received with foreign keys from widget + + const getRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${connectionId}?tableName=${referencedTableTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getRowsResponse.status, 200); + const getRowsRO = JSON.parse(getRowsResponse.text); + t.is(typeof getRowsRO.rows[0], "object"); + for (const row of getRowsRO.rows) { + t.is(Object.hasOwn(row, "id"), true); + } + }, ); test.serial( - `${currentTest} should return created table widgets for IBMDB2 database and return rows with attached foreign entities info`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; - const { token } = await registerUserAndReturnUserInfo(app); - const firstTableData = await createTestTable(connectionToTestDB); - const connectionParamsCopy = { - ...connectionToTestDB, - }; - if (connectionToTestDB.type === 'mysql') { - connectionParamsCopy.type = 'mysql2'; - } - - const connStr = `DATABASE=${connectionToTestDB.database};HOSTNAME=${connectionToTestDB.host};UID=${connectionToTestDB.username};PWD=${connectionToTestDB.password};PORT=${connectionToTestDB.port};PROTOCOL=TCPIP`; - const ibmDatabase = ibmdb(); - await ibmDatabase.open(connStr); - - const referencedByTableTableName = getRandomTestTableName().toUpperCase(); - const referencedColumnName = 'REFERENCED_ON_ID'; - - const queryCheckSchemaExists = `SELECT COUNT(*) FROM SYSCAT.SCHEMATA WHERE SCHEMANAME = '${connectionToTestDB.schema}'`; - const schemaExists = await ibmDatabase.query(queryCheckSchemaExists); - - if (!schemaExists.length || !schemaExists[0]['1']) { - const queryCreateSchema = `CREATE SCHEMA ${connectionToTestDB.schema}`; - try { - await ibmDatabase.query(queryCreateSchema); - } catch (error) { - console.error(`Error while creating schema: ${error}`); - console.info(`Query: ${queryCreateSchema}`); - } - } - - const queryCheckTableExists = `SELECT COUNT(*) FROM SYSCAT.TABLES WHERE TABNAME = '${referencedByTableTableName}' AND TABSCHEMA = '${connectionToTestDB.schema}'`; - const tableExists = await ibmDatabase.query(queryCheckTableExists); - - if (tableExists.length && tableExists[0]['1']) { - await ibmDatabase.query(`DROP TABLE ${connectionToTestDB.schema}.${referencedByTableTableName}`); - } - - const testColumnName = `product_description`; - const query = ` + `${currentTest} should return created table widgets for IBMDB2 database and return rows with attached foreign entities info`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).connectionToIbmDb2; + const { token } = await registerUserAndReturnUserInfo(app); + const firstTableData = await createTestTable(connectionToTestDB); + const connectionParamsCopy = { + ...connectionToTestDB, + }; + if (connectionToTestDB.type === "mysql") { + connectionParamsCopy.type = "mysql2"; + } + + const connStr = `DATABASE=${connectionToTestDB.database};HOSTNAME=${connectionToTestDB.host};UID=${connectionToTestDB.username};PWD=${connectionToTestDB.password};PORT=${connectionToTestDB.port};PROTOCOL=TCPIP`; + const ibmDatabase = ibmdb(); + await ibmDatabase.open(connStr); + + const referencedByTableTableName = getRandomTestTableName().toUpperCase(); + const referencedColumnName = "REFERENCED_ON_ID"; + + const queryCheckSchemaExists = `SELECT COUNT(*) FROM SYSCAT.SCHEMATA WHERE SCHEMANAME = '${connectionToTestDB.schema}'`; + const schemaExists = await ibmDatabase.query(queryCheckSchemaExists); + + if (!schemaExists.length || !schemaExists[0]["1"]) { + const queryCreateSchema = `CREATE SCHEMA ${connectionToTestDB.schema}`; + try { + await ibmDatabase.query(queryCreateSchema); + } catch (error) { + console.error(`Error while creating schema: ${error}`); + console.info(`Query: ${queryCreateSchema}`); + } + } + + const queryCheckTableExists = `SELECT COUNT(*) FROM SYSCAT.TABLES WHERE TABNAME = '${referencedByTableTableName}' AND TABSCHEMA = '${connectionToTestDB.schema}'`; + const tableExists = await ibmDatabase.query(queryCheckTableExists); + + if (tableExists.length && tableExists[0]["1"]) { + await ibmDatabase.query( + `DROP TABLE ${connectionToTestDB.schema}.${referencedByTableTableName}`, + ); + } + + const testColumnName = `product_description`; + const query = ` CREATE TABLE ${connectionToTestDB.schema}.${referencedByTableTableName} ( id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), ${referencedColumnName} INTEGER, @@ -1277,428 +1459,486 @@ test.serial( PRIMARY KEY (id) )`; - try { - await ibmDatabase.query(query); - } catch (error) { - console.error(`Error while creating table: ${error}`); - console.info(`Query: ${query}`); - } - - for (let index = 0; index < 42; index++) { - const insertQuery = `INSERT INTO ${ - connectionToTestDB.schema - }.${referencedByTableTableName} (${referencedColumnName}, ${testColumnName}, created_at, updated_at) VALUES (${faker.number.int({ min: 1, max: 42 })}, '${faker.lorem.words(1).replace(/["']/g, '')}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`; - - await ibmDatabase.query(insertQuery); - } - - const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { - widgets: [ - { - widget_type: WidgetTypeEnum.Foreign_key, - widget_params: JSON.stringify({ - referenced_column_name: 'ID', - referenced_table_name: firstTableData.testTableName, - constraint_name: 'manually_created_constraint', - column_name: referencedColumnName, - }), - field_name: referencedColumnName, - description: 'User ID as foreign key', - name: 'User ID', - widget_options: JSON.stringify({}), - }, - ], - }; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const connectionId = createConnectionRO.id; - - const findTablesResponse = await request(app.getHttpServer()) - .get(`/connection/tables/${connectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - const _findTablesRO = JSON.parse(findTablesResponse.text); - t.is(findTablesResponse.status, 200); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${referencedByTableTableName}`) - .send(foreignKeyWidgetsDTO) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${referencedByTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 1); - - t.is(getTableWidgetsRO[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connectionId}?tableName=${referencedByTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(getTableStructureResponse.status, 200); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 1); - t.is(getTableStructureRO.table_widgets[0].field_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.table_widgets[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - t.is(getTableStructureRO.foreignKeys.length, 1); - t.is(getTableStructureRO.foreignKeys[0].column_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.foreignKeys[0].referenced_table_name, firstTableData.testTableName); - const widgetParams = JSON5.parse(getTableStructureRO.table_widgets[0].widget_params); - t.is(widgetParams.referenced_table_name, firstTableData.testTableName); - t.is(widgetParams.referenced_column_name, 'ID'); - t.is(widgetParams.constraint_name, 'manually_created_constraint'); - t.is(widgetParams.column_name, referencedColumnName); - t.is(Object.hasOwn(getTableStructureRO.foreignKeys[0], 'autocomplete_columns'), true); - t.is(getTableStructureRO.foreignKeys[0].autocomplete_columns.length, 5); - - // check table rows received with foreign keys from widget - - const getRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${connectionId}?tableName=${referencedByTableTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - const getRowsRO = JSON.parse(getRowsResponse.text); - t.is(getRowsResponse.status, 200); - - t.is(typeof getRowsRO.rows[0], 'object'); - for (const row of getRowsRO.rows) { - t.is(Object.hasOwn(row, 'ID'), true); - t.is(Object.hasOwn(row, referencedColumnName), true); - t.is(Object.hasOwn(row[referencedColumnName], 'ID'), true); - } - }, + try { + await ibmDatabase.query(query); + } catch (error) { + console.error(`Error while creating table: ${error}`); + console.info(`Query: ${query}`); + } + + for (let index = 0; index < 42; index++) { + const insertQuery = `INSERT INTO ${ + connectionToTestDB.schema + }.${referencedByTableTableName} (${referencedColumnName}, ${testColumnName}, created_at, updated_at) VALUES (${faker.number.int({ min: 1, max: 42 })}, '${faker.lorem.words(1).replace(/["']/g, "")}', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`; + + await ibmDatabase.query(insertQuery); + } + + const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { + widgets: [ + { + widget_type: WidgetTypeEnum.Foreign_key, + widget_params: JSON.stringify({ + referenced_column_name: "ID", + referenced_table_name: firstTableData.testTableName, + constraint_name: "manually_created_constraint", + column_name: referencedColumnName, + }), + field_name: referencedColumnName, + description: "User ID as foreign key", + name: "User ID", + widget_options: JSON.stringify({}), + }, + ], + }; + + const createConnectionResponse = await request(app.getHttpServer()) + .post("/connection") + .send(connectionToTestDB) + .set("Cookie", token) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const connectionId = createConnectionRO.id; + + const findTablesResponse = await request(app.getHttpServer()) + .get(`/connection/tables/${connectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + const _findTablesRO = JSON.parse(findTablesResponse.text); + t.is(findTablesResponse.status, 200); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${referencedByTableTableName}`) + .send(foreignKeyWidgetsDTO) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${referencedByTableTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 1); + + t.is( + getTableWidgetsRO[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connectionId}?tableName=${referencedByTableTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(getTableStructureResponse.status, 200); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 1); + t.is( + getTableStructureRO.table_widgets[0].field_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + t.is(Object.hasOwn(getTableStructureRO, "foreignKeys"), true); + t.is(getTableStructureRO.foreignKeys.length, 1); + t.is( + getTableStructureRO.foreignKeys[0].column_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.foreignKeys[0].referenced_table_name, + firstTableData.testTableName, + ); + const widgetParams = JSON5.parse( + getTableStructureRO.table_widgets[0].widget_params, + ); + t.is(widgetParams.referenced_table_name, firstTableData.testTableName); + t.is(widgetParams.referenced_column_name, "ID"); + t.is(widgetParams.constraint_name, "manually_created_constraint"); + t.is(widgetParams.column_name, referencedColumnName); + t.is( + Object.hasOwn(getTableStructureRO.foreignKeys[0], "autocomplete_columns"), + true, + ); + t.is(getTableStructureRO.foreignKeys[0].autocomplete_columns.length, 5); + + // check table rows received with foreign keys from widget + + const getRowsResponse = await request(app.getHttpServer()) + .get( + `/table/rows/${connectionId}?tableName=${referencedByTableTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + const getRowsRO = JSON.parse(getRowsResponse.text); + t.is(getRowsResponse.status, 200); + + t.is(typeof getRowsRO.rows[0], "object"); + for (const row of getRowsRO.rows) { + t.is(Object.hasOwn(row, "ID"), true); + t.is(Object.hasOwn(row, referencedColumnName), true); + t.is(Object.hasOwn(row[referencedColumnName], "ID"), true); + } + }, ); // Table widgets for mongodb database test.serial( - `${currentTest} should return created table widgets as foreign keys, when database is mongodb`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; - const { token } = await registerUserAndReturnUserInfo(app); - - const mongoConnectionString = - `mongodb://${connectionToTestDB.username}` + - `:${connectionToTestDB.password}` + - `@${connectionToTestDB.host}` + - `:${connectionToTestDB.port}` + - `/${connectionToTestDB.database}`; - - const referencedOnTableTableName = `users`; - const referencedByTableName = `orders`; - const testTableColumnName = `user_name`; - const testReferencedColumnsName = `product_description`; - const referencedByColumnName = 'user_id'; - const referencedOnColumnName = '_id'; - - const client = new MongoClient(mongoConnectionString); - await client.connect(); - const db = client.db(connectionToTestDB.database); - const referencedCollection = db.collection(referencedOnTableTableName); - const referencedByCollection = db.collection(referencedByTableName); - - await referencedCollection.drop(); - await referencedByCollection.drop(); - - const insertedReferencedIds = []; - for (let index = 0; index < 42; index++) { - const insertedReferencedId = await referencedCollection.insertOne({ - [testTableColumnName]: faker.person.fullName(), - created_at: new Date(), - updated_at: new Date(), - }); - insertedReferencedIds.push(insertedReferencedId.insertedId.toHexString()); - } - - for (let index = 0; index < 42; index++) { - await referencedByCollection.insertOne({ - [referencedByColumnName]: insertedReferencedIds[index], - [testReferencedColumnsName]: faker.lorem.lines(), - created_at: new Date(), - updated_at: new Date(), - }); - } - - const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { - widgets: [ - { - widget_type: WidgetTypeEnum.Foreign_key, - widget_params: JSON.stringify({ - referenced_column_name: referencedOnColumnName, - referenced_table_name: referencedOnTableTableName, - constraint_name: 'manually_created_constraint', - column_name: referencedByColumnName, - }), - field_name: referencedByColumnName, - description: 'User ID as foreign key', - name: 'User ID', - widget_options: JSON.stringify({}), - }, - ], - }; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const connectionId = createConnectionRO.id; - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${referencedByTableName}`) - .send(foreignKeyWidgetsDTO) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${referencedByTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 1); - - t.is(getTableWidgetsRO[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connectionId}?tableName=${referencedByTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - - t.is(getTableStructureResponse.status, 200); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 1); - t.is(getTableStructureRO.table_widgets[0].field_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.table_widgets[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - t.is(getTableStructureRO.foreignKeys.length, 1); - t.is(getTableStructureRO.foreignKeys[0].column_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.foreignKeys[0].referenced_table_name, referencedOnTableTableName); - - // check table rows received with foreign keys from widget - - const getRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${connectionId}?tableName=${referencedByTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getRowsResponse.status, 200); - const getRowsRO = JSON.parse(getRowsResponse.text); - t.is(typeof getRowsRO.rows[0], 'object'); - for (const row of getRowsRO.rows) { - t.is(Object.hasOwn(row, referencedByColumnName), true); - t.is(Object.hasOwn(row[referencedByColumnName], '_id'), true); - } - }, + `${currentTest} should return created table widgets as foreign keys, when database is mongodb`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).mongoDbConnection; + const { token } = await registerUserAndReturnUserInfo(app); + + const mongoConnectionString = + `mongodb://${connectionToTestDB.username}` + + `:${connectionToTestDB.password}` + + `@${connectionToTestDB.host}` + + `:${connectionToTestDB.port}` + + `/${connectionToTestDB.database}`; + + const referencedOnTableTableName = `users`; + const referencedByTableName = `orders`; + const testTableColumnName = `user_name`; + const testReferencedColumnsName = `product_description`; + const referencedByColumnName = "user_id"; + const referencedOnColumnName = "_id"; + + const client = new MongoClient(mongoConnectionString); + await client.connect(); + const db = client.db(connectionToTestDB.database); + const referencedCollection = db.collection(referencedOnTableTableName); + const referencedByCollection = db.collection(referencedByTableName); + + await referencedCollection.drop(); + await referencedByCollection.drop(); + + const insertedReferencedIds = []; + for (let index = 0; index < 42; index++) { + const insertedReferencedId = await referencedCollection.insertOne({ + [testTableColumnName]: faker.person.fullName(), + created_at: new Date(), + updated_at: new Date(), + }); + insertedReferencedIds.push(insertedReferencedId.insertedId.toHexString()); + } + + for (let index = 0; index < 42; index++) { + await referencedByCollection.insertOne({ + [referencedByColumnName]: insertedReferencedIds[index], + [testReferencedColumnsName]: faker.lorem.lines(), + created_at: new Date(), + updated_at: new Date(), + }); + } + + const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { + widgets: [ + { + widget_type: WidgetTypeEnum.Foreign_key, + widget_params: JSON.stringify({ + referenced_column_name: referencedOnColumnName, + referenced_table_name: referencedOnTableTableName, + constraint_name: "manually_created_constraint", + column_name: referencedByColumnName, + }), + field_name: referencedByColumnName, + description: "User ID as foreign key", + name: "User ID", + widget_options: JSON.stringify({}), + }, + ], + }; + + const createConnectionResponse = await request(app.getHttpServer()) + .post("/connection") + .send(connectionToTestDB) + .set("Cookie", token) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const connectionId = createConnectionRO.id; + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${referencedByTableName}`) + .send(foreignKeyWidgetsDTO) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${referencedByTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 1); + + t.is( + getTableWidgetsRO[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connectionId}?tableName=${referencedByTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + + t.is(getTableStructureResponse.status, 200); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 1); + t.is( + getTableStructureRO.table_widgets[0].field_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + t.is(Object.hasOwn(getTableStructureRO, "foreignKeys"), true); + t.is(getTableStructureRO.foreignKeys.length, 1); + t.is( + getTableStructureRO.foreignKeys[0].column_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.foreignKeys[0].referenced_table_name, + referencedOnTableTableName, + ); + + // check table rows received with foreign keys from widget + + const getRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${connectionId}?tableName=${referencedByTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getRowsResponse.status, 200); + const getRowsRO = JSON.parse(getRowsResponse.text); + t.is(typeof getRowsRO.rows[0], "object"); + for (const row of getRowsRO.rows) { + t.is(Object.hasOwn(row, referencedByColumnName), true); + t.is(Object.hasOwn(row[referencedByColumnName], "_id"), true); + } + }, ); // Table widgets for dynamodb database test.serial( - `${currentTest} should return created table widgets as foreign keys, when database is dynamodb`, - async (t) => { - const connectionToTestDB = getTestData(mockFactory).dynamoDBConnection; - const { token } = await registerUserAndReturnUserInfo(app); - - const referencedOnTableTableName = `users`; - const referencedByTableName = `orders`; - const testTableColumnName = `user_name`; - const testReferencedColumnsName = `product_description`; - const referencedByColumnName = 'user_id'; - const referencedOnColumnName = 'id'; - - const dynamoDb = new DynamoDB({ - endpoint: connectionToTestDB.host, - credentials: { - accessKeyId: connectionToTestDB.username, - secretAccessKey: connectionToTestDB.password, - }, - region: 'localhost', - }); - - const referencedOnTableTableNameTableParams = { - TableName: referencedOnTableTableName, - KeySchema: [ - { AttributeName: 'id', KeyType: 'HASH' }, // Primary key - ], - AttributeDefinitions: [{ AttributeName: 'id', AttributeType: 'N' }], - ProvisionedThroughput: { - ReadCapacityUnits: 5, - WriteCapacityUnits: 5, - }, - } as any; - - const referencedByTableTableNameTableParams = { - TableName: referencedByTableName, - KeySchema: [ - { AttributeName: 'id', KeyType: 'HASH' }, // Primary key - ], - AttributeDefinitions: [{ AttributeName: 'id', AttributeType: 'N' }], - ProvisionedThroughput: { - ReadCapacityUnits: 5, - WriteCapacityUnits: 5, - }, - } as any; - - try { - await dynamoDb.createTable(referencedOnTableTableNameTableParams); - await dynamoDb.createTable(referencedByTableTableNameTableParams); - } catch (error) { - console.error(`Error creating dynamodb table: ${error.message}`); - } - - const documentClient = DynamoDBDocumentClient.from(dynamoDb); - - for (let index = 0; index < 42; index++) { - const item = { - id: { N: index + 1 }, - [testTableColumnName]: { S: faker.person.firstName() }, - email: { S: faker.internet.email() }, - age: { - N: faker.number.int({ min: 16, max: 80 }), - }, - created_at: { S: new Date().toISOString() }, - updated_at: { S: new Date().toISOString() }, - }; - - const params: PutItemCommandInput = { - TableName: referencedOnTableTableName, - Item: item as any, - }; - await documentClient.send(new PutItemCommand(params)); - } - - for (let index = 0; index < 42; index++) { - const item = { - id: { N: index + 1 }, - [testReferencedColumnsName]: { S: faker.lorem.lines() }, - [referencedByColumnName]: { N: faker.number.int({ min: 1, max: 42 }) }, - created_at: { S: new Date().toISOString() }, - updated_at: { S: new Date().toISOString() }, - }; - - const params: PutItemCommandInput = { - TableName: referencedByTableName, - Item: item as any, - }; - await documentClient.send(new PutItemCommand(params)); - } - - const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { - widgets: [ - { - widget_type: WidgetTypeEnum.Foreign_key, - widget_params: JSON.stringify({ - referenced_column_name: referencedOnColumnName, - referenced_table_name: referencedOnTableTableName, - constraint_name: 'manually_created_constraint', - column_name: referencedByColumnName, - }), - field_name: referencedByColumnName, - description: 'User ID as foreign key', - name: 'User ID', - widget_options: JSON.stringify({}), - }, - ], - }; - - const createConnectionResponse = await request(app.getHttpServer()) - .post('/connection') - .send(connectionToTestDB) - .set('Cookie', token) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createConnectionRO = JSON.parse(createConnectionResponse.text); - t.is(createConnectionResponse.status, 201); - const connectionId = createConnectionRO.id; - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connectionId}?tableName=${referencedByTableName}`) - .send(foreignKeyWidgetsDTO) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connectionId}?tableName=${referencedByTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 1); - - t.is(getTableWidgetsRO[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connectionId}?tableName=${referencedByTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - - t.is(getTableStructureResponse.status, 200); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 1); - t.is(getTableStructureRO.table_widgets[0].field_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.table_widgets[0].widget_type, foreignKeyWidgetsDTO.widgets[0].widget_type); - t.is(Object.hasOwn(getTableStructureRO, 'foreignKeys'), true); - t.is(getTableStructureRO.foreignKeys.length, 1); - t.is(getTableStructureRO.foreignKeys[0].column_name, foreignKeyWidgetsDTO.widgets[0].field_name); - t.is(getTableStructureRO.foreignKeys[0].referenced_table_name, referencedOnTableTableName); - - // check table rows received with foreign keys from widget - - const getRowsResponse = await request(app.getHttpServer()) - .get(`/table/rows/${connectionId}?tableName=${referencedByTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', token) - .set('Accept', 'application/json'); - const getRowsRO = JSON.parse(getRowsResponse.text); - - t.is(getRowsResponse.status, 200); - - t.is(typeof getRowsRO.rows[0], 'object'); - for (const row of getRowsRO.rows) { - t.is(Object.hasOwn(row, referencedByColumnName), true); - t.is(Object.hasOwn(row[referencedByColumnName], 'id'), true); - } - }, + `${currentTest} should return created table widgets as foreign keys, when database is dynamodb`, + async (t) => { + const connectionToTestDB = getTestData(mockFactory).dynamoDBConnection; + const { token } = await registerUserAndReturnUserInfo(app); + + const referencedOnTableTableName = `users`; + const referencedByTableName = `orders`; + const testTableColumnName = `user_name`; + const testReferencedColumnsName = `product_description`; + const referencedByColumnName = "user_id"; + const referencedOnColumnName = "id"; + + const dynamoDb = new DynamoDB({ + endpoint: connectionToTestDB.host, + credentials: { + accessKeyId: connectionToTestDB.username, + secretAccessKey: connectionToTestDB.password, + }, + region: "localhost", + }); + + const referencedOnTableTableNameTableParams = { + TableName: referencedOnTableTableName, + KeySchema: [ + { AttributeName: "id", KeyType: "HASH" }, // Primary key + ], + AttributeDefinitions: [{ AttributeName: "id", AttributeType: "N" }], + ProvisionedThroughput: { + ReadCapacityUnits: 5, + WriteCapacityUnits: 5, + }, + } as any; + + const referencedByTableTableNameTableParams = { + TableName: referencedByTableName, + KeySchema: [ + { AttributeName: "id", KeyType: "HASH" }, // Primary key + ], + AttributeDefinitions: [{ AttributeName: "id", AttributeType: "N" }], + ProvisionedThroughput: { + ReadCapacityUnits: 5, + WriteCapacityUnits: 5, + }, + } as any; + + try { + await dynamoDb.createTable(referencedOnTableTableNameTableParams); + await dynamoDb.createTable(referencedByTableTableNameTableParams); + } catch (error) { + console.error(`Error creating dynamodb table: ${error.message}`); + } + + const documentClient = DynamoDBDocumentClient.from(dynamoDb); + + for (let index = 0; index < 42; index++) { + const item = { + id: { N: index + 1 }, + [testTableColumnName]: { S: faker.person.firstName() }, + email: { S: faker.internet.email() }, + age: { + N: faker.number.int({ min: 16, max: 80 }), + }, + created_at: { S: new Date().toISOString() }, + updated_at: { S: new Date().toISOString() }, + }; + + const params: PutItemCommandInput = { + TableName: referencedOnTableTableName, + Item: item as any, + }; + await documentClient.send(new PutItemCommand(params)); + } + + for (let index = 0; index < 42; index++) { + const item = { + id: { N: index + 1 }, + [testReferencedColumnsName]: { S: faker.lorem.lines() }, + [referencedByColumnName]: { N: faker.number.int({ min: 1, max: 42 }) }, + created_at: { S: new Date().toISOString() }, + updated_at: { S: new Date().toISOString() }, + }; + + const params: PutItemCommandInput = { + TableName: referencedByTableName, + Item: item as any, + }; + await documentClient.send(new PutItemCommand(params)); + } + + const foreignKeyWidgetsDTO: CreateOrUpdateTableWidgetsDto = { + widgets: [ + { + widget_type: WidgetTypeEnum.Foreign_key, + widget_params: JSON.stringify({ + referenced_column_name: referencedOnColumnName, + referenced_table_name: referencedOnTableTableName, + constraint_name: "manually_created_constraint", + column_name: referencedByColumnName, + }), + field_name: referencedByColumnName, + description: "User ID as foreign key", + name: "User ID", + widget_options: JSON.stringify({}), + }, + ], + }; + + const createConnectionResponse = await request(app.getHttpServer()) + .post("/connection") + .send(connectionToTestDB) + .set("Cookie", token) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createConnectionRO = JSON.parse(createConnectionResponse.text); + t.is(createConnectionResponse.status, 201); + const connectionId = createConnectionRO.id; + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post(`/widget/${connectionId}?tableName=${referencedByTableName}`) + .send(foreignKeyWidgetsDTO) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + const _createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + const getTableWidgets = await request(app.getHttpServer()) + .get(`/widgets/${connectionId}?tableName=${referencedByTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 1); + + t.is( + getTableWidgetsRO[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connectionId}?tableName=${referencedByTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + + t.is(getTableStructureResponse.status, 200); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 1); + t.is( + getTableStructureRO.table_widgets[0].field_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[0].widget_type, + foreignKeyWidgetsDTO.widgets[0].widget_type, + ); + t.is(Object.hasOwn(getTableStructureRO, "foreignKeys"), true); + t.is(getTableStructureRO.foreignKeys.length, 1); + t.is( + getTableStructureRO.foreignKeys[0].column_name, + foreignKeyWidgetsDTO.widgets[0].field_name, + ); + t.is( + getTableStructureRO.foreignKeys[0].referenced_table_name, + referencedOnTableTableName, + ); + + // check table rows received with foreign keys from widget + + const getRowsResponse = await request(app.getHttpServer()) + .get(`/table/rows/${connectionId}?tableName=${referencedByTableName}`) + .set("Content-Type", "application/json") + .set("Cookie", token) + .set("Accept", "application/json"); + const getRowsRO = JSON.parse(getRowsResponse.text); + + t.is(getRowsResponse.status, 200); + + t.is(typeof getRowsRO.rows[0], "object"); + for (const row of getRowsRO.rows) { + t.is(Object.hasOwn(row, referencedByColumnName), true); + t.is(Object.hasOwn(row[referencedByColumnName], "id"), true); + } + }, ); diff --git a/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts index 209d9c5f6..e37754eab 100644 --- a/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts @@ -1,3718 +1,4431 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable security/detect-object-injection */ -import { faker } from '@faker-js/faker'; -import { INestApplication, ValidationPipe } from '@nestjs/common'; -import { Test } from '@nestjs/testing'; -import test from 'ava'; -import cookieParser from 'cookie-parser'; -import request from 'supertest'; -import { ApplicationModule } from '../../../src/app.module.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; -import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; -import { Messages } from '../../../src/exceptions/text/messages.js'; -import { Cacher } from '../../../src/helpers/cache/cacher.js'; -import { Constants } from '../../../src/helpers/constants/constants.js'; -import { DatabaseModule } from '../../../src/shared/database/database.module.js'; -import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { MockFactory } from '../../mock.factory.js'; -import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; -import { TestUtils } from '../../utils/test.utils.js'; -import { createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection } from '../../utils/user-with-different-permissions-utils.js'; -import { inviteUserInCompanyAndAcceptInvitation } from '../../utils/register-user-and-return-user-info.js'; -import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; -import { ValidationError } from 'class-validator'; -import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { faker } from "@faker-js/faker"; +import { INestApplication, ValidationPipe } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import test from "ava"; +import { ValidationError } from "class-validator"; +import cookieParser from "cookie-parser"; +import request from "supertest"; +import { ApplicationModule } from "../../../src/app.module.js"; +import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { + AccessLevelEnum, + QueryOrderingEnum, +} from "../../../src/enums/index.js"; +import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; +import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; +import { Messages } from "../../../src/exceptions/text/messages.js"; +import { Cacher } from "../../../src/helpers/cache/cacher.js"; +import { Constants } from "../../../src/helpers/constants/constants.js"; +import { DatabaseModule } from "../../../src/shared/database/database.module.js"; +import { DatabaseService } from "../../../src/shared/database/database.service.js"; +import { MockFactory } from "../../mock.factory.js"; +import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; +import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; +import { TestUtils } from "../../utils/test.utils.js"; +import { createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection } from "../../utils/user-with-different-permissions-utils.js"; let app: INestApplication; let _testUtils: TestUtils; let currentTest: string; const mockFactory = new MockFactory(); -const newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); +const newConnectionToPostgres = + mockFactory.generateConnectionToTestPostgresDBInDocker(); test.before(async () => { - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error("After tests error " + e); + } }); // Connection controller -currentTest = 'GET /connections/'; - -test.serial(`${currentTest} should return connections, where second user have access`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const findAll = await request(app.getHttpServer()) - .get('/connections') - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - - t.is(findAll.status, 200); - - const result = findAll.body.connections; - t.is(result.length, 5); - t.is(Object.hasOwn(result[0], 'connection'), true); - t.is(Object.hasOwn(result[0], 'accessLevel'), true); - t.is(result[0].accessLevel, AccessLevelEnum.edit); - - t.is(Object.hasOwn(result[0], 'accessLevel'), true); - t.is(Object.hasOwn(result[0].connection, 'host'), true); - t.is(Object.hasOwn(result[0].connection, 'host'), true); - t.is(typeof result[0].connection.port, 'number'); - t.is(Object.hasOwn(result[0].connection, 'port'), true); - t.is(Object.hasOwn(result[0].connection, 'username'), true); - t.is(Object.hasOwn(result[0].connection, 'database'), true); - t.is(Object.hasOwn(result[0].connection, 'sid'), true); - t.is(Object.hasOwn(result[0].connection, 'createdAt'), true); - t.is(Object.hasOwn(result[0].connection, 'updatedAt'), true); - t.is(Object.hasOwn(result[0].connection, 'password'), false); - t.is(Object.hasOwn(result[0].connection, 'groups'), false); - t.is(Object.hasOwn(result[0].connection, 'author'), false); - const testConnectionsCount = result.filter((el: any) => el.connection.isTestConnection).length; - t.is(testConnectionsCount, 4); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /connections/"; -currentTest = 'GET /connection/one/:slug'; +test.serial( + `${currentTest} should return connections, where second user have access`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const findAll = await request(app.getHttpServer()) + .get("/connections") + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + + t.is(findAll.status, 200); + + const result = findAll.body.connections; + t.is(result.length, 5); + t.is(Object.hasOwn(result[0], "connection"), true); + t.is(Object.hasOwn(result[0], "accessLevel"), true); + t.is(result[0].accessLevel, AccessLevelEnum.edit); + + t.is(Object.hasOwn(result[0], "accessLevel"), true); + t.is(Object.hasOwn(result[0].connection, "host"), true); + t.is(Object.hasOwn(result[0].connection, "host"), true); + t.is(typeof result[0].connection.port, "number"); + t.is(Object.hasOwn(result[0].connection, "port"), true); + t.is(Object.hasOwn(result[0].connection, "username"), true); + t.is(Object.hasOwn(result[0].connection, "database"), true); + t.is(Object.hasOwn(result[0].connection, "sid"), true); + t.is(Object.hasOwn(result[0].connection, "createdAt"), true); + t.is(Object.hasOwn(result[0].connection, "updatedAt"), true); + t.is(Object.hasOwn(result[0].connection, "password"), false); + t.is(Object.hasOwn(result[0].connection, "groups"), false); + t.is(Object.hasOwn(result[0].connection, "author"), false); + const testConnectionsCount = result.filter( + (el: any) => el.connection.isTestConnection, + ).length; + t.is(testConnectionsCount, 4); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "GET /connection/one/:slug"; test.serial(`${currentTest} should return a found connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const searchedConnectionId = testData.connections.firstId; - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - - const result = findOneResponce.body.connection; - - t.is(result.title, newConnectionToPostgres.title); - t.is(result.type, 'postgres'); - t.is(result.host, newConnectionToPostgres.host); - t.is(typeof result.port, 'number'); - t.is(result.port, newConnectionToPostgres.port); - t.is(result.username, 'postgres'); - t.is(result.database, newConnectionToPostgres.database); - t.is(result.sid, null); - t.is(Object.hasOwn(result, 'createdAt'), true); - t.is(Object.hasOwn(result, 'updatedAt'), true); - t.is(Object.hasOwn(result, 'password'), false); - t.is(Object.hasOwn(result, 'groups'), false); - t.is(Object.hasOwn(result, 'author'), false); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const searchedConnectionId = testData.connections.firstId; + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + t.is(findOneResponce.status, 200); + + const result = findOneResponce.body.connection; + + t.is(result.title, newConnectionToPostgres.title); + t.is(result.type, "postgres"); + t.is(result.host, newConnectionToPostgres.host); + t.is(typeof result.port, "number"); + t.is(result.port, newConnectionToPostgres.port); + t.is(result.username, "postgres"); + t.is(result.database, newConnectionToPostgres.database); + t.is(result.sid, null); + t.is(Object.hasOwn(result, "createdAt"), true); + t.is(Object.hasOwn(result, "updatedAt"), true); + t.is(Object.hasOwn(result, "password"), false); + t.is(Object.hasOwn(result, "groups"), false); + t.is(Object.hasOwn(result, "author"), false); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} should throw an exception, when you do not have permission in this connection`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const searchedConnectionId = testData.connections.secondId; - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - const findOneRO = JSON.parse(findOneResponce.text); - const connectionKeys: Array = Object.keys(findOneRO.connection); - for (const keyName of connectionKeys) { - t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(keyName), true); - } - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should throw an exception, when you do not have permission in this connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const searchedConnectionId = testData.connections.secondId; + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + t.is(findOneResponce.status, 200); + const findOneRO = JSON.parse(findOneResponce.text); + const connectionKeys: Array = Object.keys(findOneRO.connection); + for (const keyName of connectionKeys) { + t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(keyName), true); + } + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'PUT /connection'; +currentTest = "PUT /connection"; test.serial(`${currentTest} should return updated connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const updateConnection = mockFactory.generateUpdateConnectionDto(); - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${testData.connections.firstId}`) - .send(updateConnection) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 200); - const result = updateConnectionResponse.body.connection; - - t.is(result.title, 'Updated Test Connection'); - t.is(result.type, 'postgres'); - t.is(result.host, 'testing_nestjs'); - t.is(typeof result.port, 'number'); - t.is(result.port, 5432); - t.is(result.username, 'admin'); - t.is(result.database, 'testing_nestjs'); - t.is(result.sid, null); - t.is(Object.hasOwn(result, 'createdAt'), true); - t.is(Object.hasOwn(result, 'updatedAt'), true); - t.is(Object.hasOwn(result, 'password'), false); - t.is(Object.hasOwn(result, 'groups'), false); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const updateConnection = mockFactory.generateUpdateConnectionDto(); + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${testData.connections.firstId}`) + .send(updateConnection) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 200); + const result = updateConnectionResponse.body.connection; + + t.is(result.title, "Updated Test Connection"); + t.is(result.type, "postgres"); + t.is(result.host, "testing_nestjs"); + t.is(typeof result.port, "number"); + t.is(result.port, 5432); + t.is(result.username, "admin"); + t.is(result.database, "testing_nestjs"); + t.is(result.sid, null); + t.is(Object.hasOwn(result, "createdAt"), true); + t.is(Object.hasOwn(result, "updatedAt"), true); + t.is(Object.hasOwn(result, "password"), false); + t.is(Object.hasOwn(result, "groups"), false); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const updateConnection = mockFactory.generateUpdateConnectionDto(); - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${testData.connections.secondId}`) - .send(updateConnection) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const updateConnection = mockFactory.generateUpdateConnectionDto(); + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${testData.connections.secondId}`) + .send(updateConnection) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'DELETE /connection/:slug'; +currentTest = "DELETE /connection/:slug"; test.serial(`${currentTest} should return delete result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const result = response.body; - - //deleted connection not found in database - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 400); - const { message } = JSON.parse(findOneResponce.text); - t.is(message, Messages.CONNECTION_NOT_FOUND); - - t.is(response.status, 200); - - t.is(Object.hasOwn(result, 'id'), false); - t.is(result.title, newConnectionToPostgres.title); - t.is(result.type, 'postgres'); - t.is(result.host, newConnectionToPostgres.host); - t.is(typeof result.port, 'number'); - t.is(result.port, newConnectionToPostgres.port); - t.is(result.username, 'postgres'); - t.is(result.database, newConnectionToPostgres.database); - t.is(result.sid, null); - t.is(Object.hasOwn(result, 'createdAt'), true); - t.is(Object.hasOwn(result, 'updatedAt'), true); - t.is(Object.hasOwn(result, 'password'), false); - t.is(Object.hasOwn(result, 'groups'), false); - t.is(Object.hasOwn(result, 'author'), false); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const result = response.body; + + //deleted connection not found in database + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 400); + const { message } = JSON.parse(findOneResponce.text); + t.is(message, Messages.CONNECTION_NOT_FOUND); + + t.is(response.status, 200); + + t.is(Object.hasOwn(result, "id"), false); + t.is(result.title, newConnectionToPostgres.title); + t.is(result.type, "postgres"); + t.is(result.host, newConnectionToPostgres.host); + t.is(typeof result.port, "number"); + t.is(result.port, newConnectionToPostgres.port); + t.is(result.username, "postgres"); + t.is(result.database, newConnectionToPostgres.database); + t.is(result.sid, null); + t.is(Object.hasOwn(result, "createdAt"), true); + t.is(Object.hasOwn(result, "updatedAt"), true); + t.is(Object.hasOwn(result, "password"), false); + t.is(Object.hasOwn(result, "groups"), false); + t.is(Object.hasOwn(result, "author"), false); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} should throw an exception, when you try to delete connection without permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${testData.connections.secondId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //connection wasn't deleted - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should throw an exception, when you try to delete connection without permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${testData.connections.secondId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //connection wasn't deleted + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'POST /connection/group/:slug'; +currentTest = "POST /connection/group/:slug"; test.serial(`${currentTest} should return a created group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - const result = JSON.parse(createGroupResponse.text); - - t.is(result.title, newGroup1.title); - t.is(Object.hasOwn(result, 'users'), true); - t.is(typeof result.users, 'object'); - t.is(result.users.length, 1); - t.is(result.users[0].email, testData.users.simpleUserEmail.toLowerCase()); - t.is(result.users[0].isActive, true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + const result = JSON.parse(createGroupResponse.text); + + t.is(result.title, newGroup1.title); + t.is(Object.hasOwn(result, "users"), true); + t.is(typeof result.users, "object"); + t.is(result.users.length, 1); + t.is(result.users[0].email, testData.users.simpleUserEmail.toLowerCase()); + t.is(result.users[0].isActive, true); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} should throw an exception when you try add group in connection without permission in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.secondId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should throw an exception when you try add group in connection without permission in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.secondId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'PUT /connection/group/delete/:slug'; - -test.serial(`${currentTest} should return connection without deleted group result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - let result = createGroupResponse.body; - - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - let response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - //after deleting group - result = response.body; - t.is(response.status, 200); - t.is(Object.hasOwn(result, 'title'), true); - t.is(result.title, createGroupRO.title); - t.is(result.isMain, false); - // check that group was deleted - - response = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - result = JSON.parse(response.text); - t.is(result.length, 1); - const _groupId = result[0].group.id; - - t.is(Object.hasOwn(result[0].group, 'title'), true); - t.is(result[0].accessLevel, AccessLevelEnum.edit); - - const index = result.findIndex((el: any) => { - return el.group.title === 'Admin'; - }); - - t.is(index >= 0, true); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "PUT /connection/group/delete/:slug"; test.serial( - `${currentTest} should throw an exception, when you try delete group in connection without permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.secondId}`) - .set('Cookie', testData.users.adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - const result = createGroupResponse.body; - - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${testData.connections.secondId}`) - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return connection without deleted group result`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + let result = createGroupResponse.body; + + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + let response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + //after deleting group + result = response.body; + t.is(response.status, 200); + t.is(Object.hasOwn(result, "title"), true); + t.is(result.title, createGroupRO.title); + t.is(result.isMain, false); + // check that group was deleted + + response = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + result = JSON.parse(response.text); + t.is(result.length, 1); + const _groupId = result[0].group.id; + + t.is(Object.hasOwn(result[0].group, "title"), true); + t.is(result[0].accessLevel, AccessLevelEnum.edit); + + const index = result.findIndex((el: any) => { + return el.group.title === "Admin"; + }); + + t.is(index >= 0, true); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'GET /connection/groups/:slug'; +test.serial( + `${currentTest} should throw an exception, when you try delete group in connection without permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.secondId}`) + .set("Cookie", testData.users.adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + const result = createGroupResponse.body; + + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${testData.connections.secondId}`) + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "GET /connection/groups/:slug"; test.serial(`${currentTest} return should groups in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - const _groupId = result[0].group.id; - - t.is(Object.hasOwn(result[1].group, 'title'), true); - t.is(result[0].accessLevel, AccessLevelEnum.edit); - - const index = result.findIndex((el: any) => el.group.title === 'Admin'); - - t.is(index >= 0, true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + const _groupId = result[0].group.id; + + t.is(Object.hasOwn(result[1].group, "title"), true); + t.is(result[0].accessLevel, AccessLevelEnum.edit); + + const index = result.findIndex((el: any) => el.group.title === "Admin"); + + t.is(index >= 0, true); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.secondId}`) - .set('Cookie', testData.users.adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.secondId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - - const result = JSON.parse(response.text); - t.is(result.length, 0); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.secondId}`) + .set("Cookie", testData.users.adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.secondId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + + const result = JSON.parse(response.text); + t.is(result.length, 0); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'GET /connection/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const result = JSON.parse(response.text); - t.is(response.status, 200); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, testData.connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.edit); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table) => table.tableName === testData.firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[0], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, false); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, false); - t.is(tables[tableIndex].accessLevel.delete, false); - t.is(tables[tableIndex].accessLevel.edit, false); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, false); - t.is(tables[tableIndex].accessLevel.visibility, false); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.edit, false); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /connection/permissions"; -currentTest = 'GET /connection/user/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, testData.connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.edit); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table) => table.tableName === testData.firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[0], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, true); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, true); - t.is(tables[tableIndex].accessLevel.delete, true); - t.is(tables[tableIndex].accessLevel.edit, true); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, true); - t.is(tables[tableIndex].accessLevel.visibility, true); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.edit, true); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const result = JSON.parse(response.text); + t.is(response.status, 200); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, testData.connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.edit); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table) => table.tableName === testData.firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[0], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is(tables[tableIndex].accessLevel.visibility, false); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, false); + t.is(tables[tableIndex].accessLevel.delete, false); + t.is(tables[tableIndex].accessLevel.edit, false); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, false); + t.is(tables[tableIndex].accessLevel.visibility, false); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.edit, false); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "GET /connection/user/permissions"; test.serial( - `${currentTest} should return permissions object for current group in current connection for current user`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.secondId}`) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${testData.connections.secondId}&groupId=${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, testData.connections.secondId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table) => table.tableName === testData.secondTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[0], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, false); - t.is(tables[tableIndex].accessLevel.readonly, false); - t.is(tables[tableIndex].accessLevel.add, false); - t.is(tables[tableIndex].accessLevel.delete, false); - t.is(tables[tableIndex].accessLevel.edit, false); - t.is(tables[tableIndex].accessLevel.edit, false); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${testData.connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, testData.connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.edit); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table) => table.tableName === testData.firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[0], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is(tables[tableIndex].accessLevel.visibility, true); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, true); + t.is(tables[tableIndex].accessLevel.delete, true); + t.is(tables[tableIndex].accessLevel.edit, true); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, true); + t.is(tables[tableIndex].accessLevel.visibility, true); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.edit, true); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +test.serial( + `${currentTest} should return permissions object for current group in current connection for current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.secondId}`) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${testData.connections.secondId}&groupId=${groupId}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, testData.connections.secondId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table) => table.tableName === testData.secondTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[0], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is(tables[tableIndex].accessLevel.visibility, false); + t.is(tables[tableIndex].accessLevel.readonly, false); + t.is(tables[tableIndex].accessLevel.add, false); + t.is(tables[tableIndex].accessLevel.delete, false); + t.is(tables[tableIndex].accessLevel.edit, false); + t.is(tables[tableIndex].accessLevel.edit, false); + } catch (error) { + console.error(error); + throw error; + } + }, ); //****************************** GROUP CONTROLLER -currentTest = 'GET /groups/'; - -test.serial(`${currentTest} should return found groups with current user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/groups/`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const { groups, groupsCount } = getGroupsRO; - t.is(groupsCount, 1); - t.is(groups.length, 1); - t.is(Object.hasOwn(groups[0], 'group'), true); - t.is(Object.hasOwn(groups[0], 'accessLevel'), true); - - t.is(Object.hasOwn(groups[0].group, 'title'), true); - t.is(Object.hasOwn(groups[0].group, 'isMain'), true); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /groups/"; + +test.serial( + `${currentTest} should return found groups with current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/groups/`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const { groups, groupsCount } = getGroupsRO; + t.is(groupsCount, 1); + t.is(groups.length, 1); + t.is(Object.hasOwn(groups[0], "group"), true); + t.is(Object.hasOwn(groups[0], "accessLevel"), true); + + t.is(Object.hasOwn(groups[0].group, "title"), true); + t.is(Object.hasOwn(groups[0].group, "isMain"), true); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'GET /group/users/:slug'; +currentTest = "GET /group/users/:slug"; test.serial(`${currentTest} it should return users in group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.length, 2); - t.is(getUsersRO[0].id === getUsersRO[1].id, false); - t.is(Object.hasOwn(getUsersRO[0], 'createdAt'), true); - t.is(Object.hasOwn(getUsersRO[0], 'password'), false); - t.is(Object.hasOwn(getUsersRO[0], 'isActive'), true); - t.is(Object.hasOwn(getUsersRO[0], 'email'), true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.length, 2); + t.is(getUsersRO[0].id === getUsersRO[1].id, false); + t.is(Object.hasOwn(getUsersRO[0], "createdAt"), true); + t.is(Object.hasOwn(getUsersRO[0], "password"), false); + t.is(Object.hasOwn(getUsersRO[0], "isActive"), true); + t.is(Object.hasOwn(getUsersRO[0], "email"), true); + } catch (error) { + console.error(error); + throw error; + } }); test.serial( - `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.secondId}`) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.secondId}`) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'PUT /group/user'; +currentTest = "PUT /group/user"; test.serial(`${currentTest} should return group with added user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text).group; - - t.is(Object.hasOwn(addUserInGroupRO, 'title'), true); - t.is(Object.hasOwn(addUserInGroupRO, 'isMain'), true); - t.is(Object.hasOwn(addUserInGroupRO, 'users'), true); - const { users } = addUserInGroupRO; - t.is(users.length, 3); - t.is(users[0].id === users[1].id, false); - t.is(users[1].id === users[2].id, false); - t.is(users[2].id === users[0].id, false); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text).group; + + t.is(Object.hasOwn(addUserInGroupRO, "title"), true); + t.is(Object.hasOwn(addUserInGroupRO, "isMain"), true); + t.is(Object.hasOwn(addUserInGroupRO, "users"), true); + const { users } = addUserInGroupRO; + t.is(users.length, 3); + t.is(users[0].id === users[1].id, false); + t.is(users[1].id === users[2].id, false); + t.is(users[2].id === users[0].id, false); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw exception, when user email not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const email = faker.internet.email(); - const groupId = faker.string.uuid(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const email = faker.internet.email(); + const groupId = faker.string.uuid(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'DELETE /group/:slug'; - -test.serial(`${currentTest} should delete result after group deletion`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = JSON.parse(createGroupResponse.text).id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.title, newGroup1.title); - t.is(deleteGroupRO.isMain, false); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "DELETE /group/:slug"; -test.serial(`${currentTest} should throw an exception when you try delete admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should delete result after group deletion`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = JSON.parse(createGroupResponse.text).id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.title, newGroup1.title); + t.is(deleteGroupRO.isMain, false); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteGroupResponse.status, 404); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when you try delete admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = faker.string.uuid(); - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteGroupResponse.status, 404); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'PUT /group/user/delete'; - -test.serial(`${currentTest} should return group without deleted user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addUserInGroupResponse.status, 200); - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - - t.is(Object.hasOwn(deleteUserInGroupRO, 'title'), true); - t.is(Object.hasOwn(deleteUserInGroupRO, 'isMain'), true); - t.is(Object.hasOwn(deleteUserInGroupRO, 'users'), true); - const { users } = deleteUserInGroupRO; - t.is(users.length, 2); - t.is(users[0].id === users[1].id, false); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = faker.string.uuid(); + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const _email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "PUT /group/user/delete"; -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', testData.users.simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should return group without deleted user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addUserInGroupResponse.status, 200); + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + + t.is(Object.hasOwn(deleteUserInGroupRO, "title"), true); + t.is(Object.hasOwn(deleteUserInGroupRO, "isMain"), true); + t.is(Object.hasOwn(deleteUserInGroupRO, "users"), true); + const { users } = deleteUserInGroupRO; + t.is(users.length, 2); + t.is(users[0].id === users[1].id, false); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - let groupId = getGroupsRO[0].group.id; - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - groupId = faker.string.uuid(); - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw exception, when user email not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const _email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", testData.users.simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + let groupId = getGroupsRO[0].group.id; + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + groupId = faker.string.uuid(); + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); //****************************** PERMISSION CONTROLLER -currentTest = 'PUT permissions/:slug'; +currentTest = "PUT permissions/:slug"; test.serial( - `${currentTest} should return created complex permissions object when you create permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - accessLevel: AccessLevelEnum.readonly, - connectionId: testData.connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: newGroupId, - }, - tables: [ - { - accessLevel: { - add: true, - delete: true, - edit: false, - readonly: false, - visibility: true, - }, - tableName: testData.firstTableInfo.testTableName, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 200); - t.is(JSON.stringify(createOrUpdatePermissionRO.connection), JSON.stringify(permissions.connection)); - t.is(JSON.stringify(createOrUpdatePermissionRO.group), JSON.stringify(permissions.group)); - t.is(JSON.stringify(createOrUpdatePermissionRO.tables), JSON.stringify(permissions.tables)); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return created complex permissions object when you create permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + accessLevel: AccessLevelEnum.readonly, + connectionId: testData.connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: newGroupId, + }, + tables: [ + { + accessLevel: { + add: true, + delete: true, + edit: false, + readonly: false, + visibility: true, + }, + tableName: testData.firstTableInfo.testTableName, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 200); + t.is( + JSON.stringify(createOrUpdatePermissionRO.connection), + JSON.stringify(permissions.connection), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.group), + JSON.stringify(permissions.group), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.tables), + JSON.stringify(permissions.tables), + ); + } catch (error) { + console.error(error); + throw error; + } + }, ); test.serial( - `${currentTest} should return updated complex permissions object when you update permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - let permissions = { - connection: { - accessLevel: AccessLevelEnum.readonly, - connectionId: testData.connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: newGroupId, - }, - tables: [ - { - accessLevel: { - add: true, - delete: true, - edit: false, - readonly: false, - visibility: true, - }, - tableName: testData.firstTableInfo.testTableName, - }, - ], - }; - - let createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - let createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - JSON.stringify(createOrUpdatePermissionRO); - t.is(createOrUpdatePermissionResponse.status, 200); - t.is(JSON.stringify(createOrUpdatePermissionRO.connection), JSON.stringify(permissions.connection)); - t.is(JSON.stringify(createOrUpdatePermissionRO.group), JSON.stringify(permissions.group)); - t.is(JSON.stringify(createOrUpdatePermissionRO.tables), JSON.stringify(permissions.tables)); - - //************************ WHEN YOU UPDATE PERMISSIONS - - permissions = { - connection: { - accessLevel: AccessLevelEnum.none, - connectionId: testData.connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: newGroupId, - }, - tables: [ - { - accessLevel: { - add: false, - delete: false, - edit: true, - readonly: false, - visibility: true, - }, - tableName: testData.firstTableInfo.testTableName, - }, - ], - }; - - createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - JSON.stringify(createOrUpdatePermissionRO); - t.is(createOrUpdatePermissionResponse.status, 200); - t.is(JSON.stringify(createOrUpdatePermissionRO.connection), JSON.stringify(permissions.connection)); - t.is(JSON.stringify(createOrUpdatePermissionRO.group), JSON.stringify(permissions.group)); - t.is(JSON.stringify(createOrUpdatePermissionRO.tables), JSON.stringify(permissions.tables)); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return updated complex permissions object when you update permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + let permissions = { + connection: { + accessLevel: AccessLevelEnum.readonly, + connectionId: testData.connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: newGroupId, + }, + tables: [ + { + accessLevel: { + add: true, + delete: true, + edit: false, + readonly: false, + visibility: true, + }, + tableName: testData.firstTableInfo.testTableName, + }, + ], + }; + + let createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + let createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + JSON.stringify(createOrUpdatePermissionRO); + t.is(createOrUpdatePermissionResponse.status, 200); + t.is( + JSON.stringify(createOrUpdatePermissionRO.connection), + JSON.stringify(permissions.connection), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.group), + JSON.stringify(permissions.group), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.tables), + JSON.stringify(permissions.tables), + ); + + //************************ WHEN YOU UPDATE PERMISSIONS + + permissions = { + connection: { + accessLevel: AccessLevelEnum.none, + connectionId: testData.connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: newGroupId, + }, + tables: [ + { + accessLevel: { + add: false, + delete: false, + edit: true, + readonly: false, + visibility: true, + }, + tableName: testData.firstTableInfo.testTableName, + }, + ], + }; + + createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + JSON.stringify(createOrUpdatePermissionRO); + t.is(createOrUpdatePermissionResponse.status, 200); + t.is( + JSON.stringify(createOrUpdatePermissionRO.connection), + JSON.stringify(permissions.connection), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.group), + JSON.stringify(permissions.group), + ); + t.is( + JSON.stringify(createOrUpdatePermissionRO.tables), + JSON.stringify(permissions.tables), + ); + } catch (error) { + console.error(error); + throw error; + } + }, ); -test.serial(`${currentTest} should throw an exception, when you try change admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.edit, - }, - group: { - groupId: testData.groups.firstAdminGroupId, - accessLevel: AccessLevelEnum.none, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${testData.groups.firstAdminGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 400); - t.is(createOrUpdatePermissionRO.message, Messages.CANNOT_CHANGE_ADMIN_GROUP); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception, when you try change admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.edit, + }, + group: { + groupId: testData.groups.firstAdminGroupId, + accessLevel: AccessLevelEnum.none, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${testData.groups.firstAdminGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 400); + t.is( + createOrUpdatePermissionRO.message, + Messages.CANNOT_CHANGE_ADMIN_GROUP, + ); + } catch (error) { + console.error(error); + throw error; + } + }, +); //****************************** TABLE CONTROLLER -currentTest = 'GET /connection/tables/:slug'; - -test.serial(`${currentTest} should return all tables in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - // create group without visibility table permission - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.length > 0, true); - const tableIndex = getTablesInConnectionRO.findIndex( - (tableItem) => tableItem.table === testData.firstTableInfo.testTableName, - ); - t.is(getTablesInConnectionRO[tableIndex].table, testData.firstTableInfo.testTableName); - t.is(typeof getTablesInConnectionRO[tableIndex].permissions, 'object'); - const { visibility, readonly, add, delete: del, edit } = getTablesInConnectionRO[tableIndex].permissions; - t.is(visibility, true); - t.is(readonly, false); - t.is(del, true); - t.is(edit, true); - t.is(add, true); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /connection/tables/:slug"; -test.serial(`${currentTest} should throw an exception, when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 404); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should return all tables in connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + // create group without visibility table permission + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.length > 0, true); + const tableIndex = getTablesInConnectionRO.findIndex( + (tableItem) => + tableItem.table === testData.firstTableInfo.testTableName, + ); + t.is( + getTablesInConnectionRO[tableIndex].table, + testData.firstTableInfo.testTableName, + ); + t.is(typeof getTablesInConnectionRO[tableIndex].permissions, "object"); + const { + visibility, + readonly, + add, + delete: del, + edit, + } = getTablesInConnectionRO[tableIndex].permissions; + t.is(visibility, true); + t.is(readonly, false); + t.is(del, true); + t.is(edit, true); + t.is(add, true); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 404); + } catch (error) { + console.error(error); + throw error; + } + }, +); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - // create group without visibility table permission - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: 'users', - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeConnectionId = faker.string.uuid(); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${fakeConnectionId}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 400); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + // create group without visibility table permission + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: "users", + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeConnectionId = faker.string.uuid(); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 400); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'GET /table/rows/:slug'; +currentTest = "GET /table/rows/:slug"; test.serial(`${currentTest} should return found rows from table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - const { rows, primaryColumns, pagination, sortable_by, structure, foreignKeys } = getTablesInConnectionRO; - t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(sortable_by.length, 0); - t.is(structure.length, 5); - t.is(foreignKeys.length, 0); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesInConnection = await request(app.getHttpServer()) + .get( + `/table/rows/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + const { + rows, + primaryColumns, + pagination, + sortable_by, + structure, + foreignKeys, + } = getTablesInConnectionRO; + t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(sortable_by.length, 0); + t.is(structure.length, 5); + t.is(foreignKeys.length, 0); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/table/rows/?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 404); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/table/rows/?tableName=${testData.firstTableInfo.testTableName}`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 404); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeId = faker.string.uuid(); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 403); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeId = faker.string.uuid(); + const getTablesInConnection = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 403); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/table/rows/${testData.connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 400); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesInConnection = await request(app.getHttpServer()) + .get( + `/table/rows/${testData.connections.firstId}?tableName=${fakeTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 400); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'GET /table/structure/:slug'; +currentTest = "GET /table/structure/:slug"; test.serial(`${currentTest} should return table structure`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 200); - const getTableStructureRO = JSON.parse(getTablesStructure.text); - const { structure, primaryColumns, foreignKeys, readonly_fields, table_widgets } = getTableStructureRO; - t.is(structure.length, 5); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(readonly_fields.length, 0); - t.is(table_widgets.length, 0); - t.is(foreignKeys.length, 0); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 200); + const getTableStructureRO = JSON.parse(getTablesStructure.text); + const { + structure, + primaryColumns, + foreignKeys, + readonly_fields, + table_widgets, + } = getTableStructureRO; + t.is(structure.length, 5); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(readonly_fields.length, 0); + t.is(table_widgets.length, 0); + t.is(foreignKeys.length, 0); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 404); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 404); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeConnectionId = faker.string.uuid(); - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${fakeConnectionId}?tableName=users`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeConnectionId = faker.string.uuid(); + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${fakeConnectionId}?tableName=users`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${testData.connections.firstId}?tableName=`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${testData.connections.firstId}?tableName=`) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${testData.connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${testData.connections.firstId}?tableName=${fakeTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'POST /table/row/:slug'; +currentTest = "POST /table/row/:slug"; test.serial(`${currentTest} should return added row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTable.status, 201); - t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); - t.is(addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], randomName); - t.is(addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], randomEmail); - t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTable.status, 201); + t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); + t.is( + addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], + randomName, + ); + t.is( + addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], + randomEmail, + ); + t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(addRowInTableRO, "structure"), true); + t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'PUT /table/row/:slug'; +currentTest = "PUT /table/row/:slug"; test.serial(`${currentTest} should return updated row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=2`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(updateRowInTable.text); - t.is(updateRowInTable.status, 200); - t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); - t.is(addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], randomName); - t.is(addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], randomEmail); - t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const updateRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=2`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(updateRowInTable.text); + t.is(updateRowInTable.status, 200); + t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); + t.is( + addRowInTableRO.row[testData.firstTableInfo.testTableColumnName], + randomName, + ); + t.is( + addRowInTableRO.row[testData.firstTableInfo.testTableSecondColumnName], + randomEmail, + ); + t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(addRowInTableRO, "structure"), true); + t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'DELETE /table/row/:slug'; +currentTest = "DELETE /table/row/:slug"; test.serial(`${currentTest} should return delete result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - // create group without visibility table permission - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=1`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteRowInTable.status, 200); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + // create group without visibility table permission + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=1`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteRowInTable.status, 200); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeConnectionId = faker.string.uuid(); - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - t.is(deleteRowInTable.status, 403); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeConnectionId = faker.string.uuid(); + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=1`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 403); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTabbleRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTabbleRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); -currentTest = 'GET /table/row/:slug'; +currentTest = "GET /table/row/:slug"; test.serial(`${currentTest} `, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - // create group without visibility table permission - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const getRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=5`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getRowInTable.text); - t.is(getRowInTable.status, 200); - t.is(getRowInTableRO.row.id, 5); - t.is(Object.hasOwn(getRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(getRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(getRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(getRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(getRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getRowInTableRO, 'readonly_fields'), true); - } catch (error) { - console.error(error); - throw error; - } + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + // create group without visibility table permission + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request(app.getHttpServer()) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const getRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}&id=5`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getRowInTable.text); + t.is(getRowInTable.status, 200); + t.is(getRowInTableRO.row.id, 5); + t.is(Object.hasOwn(getRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(getRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(getRowInTableRO, "structure"), true); + t.is(Object.hasOwn(getRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(getRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(getRowInTableRO, "readonly_fields"), true); + } catch (error) { + console.error(error); + throw error; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=5`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${fakeConnectionId}?tableName=${testData.firstTableInfo.testTableName}&id=5`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - // create group without visibility table permission - const newGroup1 = mockFactory.generateCreateGroupDto1(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${testData.connections.firstId}`) - .set('Cookie', testData.users.simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: testData.connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: testData.firstTableInfo.testTableName, - accessLevel: { - visibility: false, - readonly: true, - add: false, - delete: false, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createOrUpdatePermissionResponse.status, 200); - - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=5`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + // create group without visibility table permission + const newGroup1 = mockFactory.generateCreateGroupDto1(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${testData.connections.firstId}`) + .set("Cookie", testData.users.simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: testData.connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: testData.firstTableInfo.testTableName, + accessLevel: { + visibility: false, + readonly: true, + add: false, + delete: false, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createOrUpdatePermissionResponse.status, 200); + + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${testData.connections.firstId}?tableName=${fakeTableName}&id=5`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.TABLE_NOT_FOUND); + } catch (error) { + console.error(error); + throw error; + } + }, +); //****************************** TABLE LOGS CONTROLLER -currentTest = 'GET /logs/:slug'; - -test.serial(`${currentTest} should return all found logs in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - /* eslint-disable */ - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ - [testData.firstTableInfo.testTableColumnName]: randomName, - [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${testData.connections.firstId}`) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 1); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'table_name'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'received_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'old_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'cognitoUserName'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'email'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationType'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationStatusResult'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'createdAt'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'connection_id'), true); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /logs/:slug"; test.serial( - `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - - const updateConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 200); - - const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded(null, false); - - const createConnectionPropertiesResponse = await request(app.getHttpServer()) - .post(`/connection/properties/${connections.firstId}`) - .send(newConnectionProperties) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createConnectionPropertiesResponse.status, 201); - - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found logs in connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + /* eslint-disable */ + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ + [testData.firstTableInfo.testTableColumnName]: randomName, + [testData.firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${testData.connections.firstId}`) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 1); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "table_name"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "received_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "old_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "cognitoUserName"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "email"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "operationType"), true); + t.is( + Object.hasOwn(getRowInTableRO.logs[0], "operationStatusResult"), + true, + ); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "createdAt"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "connection_id"), true); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +test.serial( + `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + + const updateConnection = + mockFactory.generateConnectionToTestPostgresDBInDocker(); + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 200); + + const newConnectionProperties = + mockFactory.generateConnectionPropertiesUserExcluded(null, false); + + const createConnectionPropertiesResponse = await request( + app.getHttpServer(), + ) + .post(`/connection/properties/${connections.firstId}`) + .send(newConnectionProperties) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createConnectionPropertiesResponse.status, 201); + + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE SETTINGS CONTROLLER -currentTest = 'GET /settings/'; - -test.serial(`${currentTest} should return empty table settings when it was not created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${testData.connections.firstId}&tableName=users`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /settings/"; -test.serial(`${currentTest} should return table settings when it was created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(Object.hasOwn(getTableSettingsRO, 'id'), true); - t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); - t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); - t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); - t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is( - JSON.stringify(getTableSettingsRO.list_fields), - JSON.stringify(createTableSettingsDTO.list_fields.concat(['id', 'created_at', 'updated_at'])), - ); - t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); - t.is(getTableSettingsRO.list_per_page, createTableSettingsDTO.list_per_page); - t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering); - t.is(getTableSettingsRO.ordering_field, createTableSettingsDTO.ordering_field); - t.is(JSON.stringify(getTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(getTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); - t.is(JSON.stringify(getTableSettingsRO.autocomplete_columns), JSON.stringify([])); - t.is(getTableSettingsRO.connection_id, testData.connections.firstId); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should return empty table settings when it was not created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${testData.connections.firstId}&tableName=users`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); + } catch (error) { + console.error(error); + throw error; + } + }, +); test.serial( - `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get( - `/settings/?connectionId=${testData.connections.secondId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return table settings when it was created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(Object.hasOwn(getTableSettingsRO, "id"), true); + t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); + t.is( + getTableSettingsRO.display_name, + createTableSettingsDTO.display_name, + ); + t.is( + JSON.stringify(getTableSettingsRO.search_fields), + JSON.stringify(createTableSettingsDTO.search_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.excluded_fields), + JSON.stringify(createTableSettingsDTO.excluded_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.list_fields), + JSON.stringify( + createTableSettingsDTO.list_fields.concat([ + "id", + "created_at", + "updated_at", + ]), + ), + ); + t.is( + JSON.stringify(getTableSettingsRO.identification_fields), + JSON.stringify([]), + ); + t.is( + getTableSettingsRO.list_per_page, + createTableSettingsDTO.list_per_page, + ); + t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering); + t.is( + getTableSettingsRO.ordering_field, + createTableSettingsDTO.ordering_field, + ); + t.is( + JSON.stringify(getTableSettingsRO.readonly_fields), + JSON.stringify(createTableSettingsDTO.readonly_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.sortable_by), + JSON.stringify(createTableSettingsDTO.sortable_by), + ); + t.is( + JSON.stringify(getTableSettingsRO.autocomplete_columns), + JSON.stringify([]), + ); + t.is(getTableSettingsRO.connection_id, testData.connections.firstId); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'POST /settings/'; - -test.serial(`${currentTest} should return created table settings`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - t.is(Object.hasOwn(createTableSettingsRO, 'id'), true); - t.is(createTableSettingsRO.table_name, createTableSettingsDTO.table_name); - t.is(createTableSettingsRO.display_name, createTableSettingsDTO.display_name); - t.is(JSON.stringify(createTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); - t.is(JSON.stringify(createTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(createTableSettingsRO.list_fields), JSON.stringify(createTableSettingsDTO.list_fields)); - t.is(JSON.stringify(createTableSettingsRO.identification_fields), JSON.stringify([])); - t.is(createTableSettingsRO.list_per_page, createTableSettingsDTO.list_per_page); - t.is(createTableSettingsRO.ordering, createTableSettingsDTO.ordering); - t.is(createTableSettingsRO.ordering_field, createTableSettingsDTO.ordering_field); - t.is(JSON.stringify(createTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(createTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); - t.is(JSON.stringify(createTableSettingsRO.autocomplete_columns), JSON.stringify([])); - t.is(createTableSettingsRO.connection_id, testData.connections.firstId); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${testData.connections.secondId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "POST /settings/"; test.serial( - `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - - const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return created table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const createTableSettingsRO = JSON.parse( + createTableSettingsResponse.text, + ); + t.is(Object.hasOwn(createTableSettingsRO, "id"), true); + t.is(createTableSettingsRO.table_name, createTableSettingsDTO.table_name); + t.is( + createTableSettingsRO.display_name, + createTableSettingsDTO.display_name, + ); + t.is( + JSON.stringify(createTableSettingsRO.search_fields), + JSON.stringify(createTableSettingsDTO.search_fields), + ); + t.is( + JSON.stringify(createTableSettingsRO.excluded_fields), + JSON.stringify(createTableSettingsDTO.excluded_fields), + ); + t.is( + JSON.stringify(createTableSettingsRO.list_fields), + JSON.stringify(createTableSettingsDTO.list_fields), + ); + t.is( + JSON.stringify(createTableSettingsRO.identification_fields), + JSON.stringify([]), + ); + t.is( + createTableSettingsRO.list_per_page, + createTableSettingsDTO.list_per_page, + ); + t.is(createTableSettingsRO.ordering, createTableSettingsDTO.ordering); + t.is( + createTableSettingsRO.ordering_field, + createTableSettingsDTO.ordering_field, + ); + t.is( + JSON.stringify(createTableSettingsRO.readonly_fields), + JSON.stringify(createTableSettingsDTO.readonly_fields), + ); + t.is( + JSON.stringify(createTableSettingsRO.sortable_by), + JSON.stringify(createTableSettingsDTO.sortable_by), + ); + t.is( + JSON.stringify(createTableSettingsRO.autocomplete_columns), + JSON.stringify([]), + ); + t.is(createTableSettingsRO.connection_id, testData.connections.firstId); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'PUT /settings/'; - -test.serial(`${currentTest} should return updated table settings`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.ASC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .send(updateTableSettingsDTO) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const updateTableSettingsRO = JSON.parse(updateTableSettingsResponse.text); - t.is(updateTableSettingsResponse.status, 200); - - t.is(Object.hasOwn(updateTableSettingsRO, 'id'), true); - t.is(updateTableSettingsRO.table_name, updateTableSettingsDTO.table_name); - t.is(updateTableSettingsRO.display_name, updateTableSettingsDTO.display_name); - t.is(JSON.stringify(updateTableSettingsRO.search_fields), JSON.stringify(updateTableSettingsDTO.search_fields)); - t.is(JSON.stringify(updateTableSettingsRO.excluded_fields), JSON.stringify(updateTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(updateTableSettingsRO.list_fields), JSON.stringify(updateTableSettingsDTO.list_fields)); - // t.is(JSON.stringify(updateTableSettingsRO.identification_fields)).toBe(JSON.stringify([])); - t.is(updateTableSettingsRO.list_per_page, updateTableSettingsDTO.list_per_page); - t.is(updateTableSettingsRO.ordering, updateTableSettingsDTO.ordering); - t.is(updateTableSettingsRO.ordering_field, updateTableSettingsDTO.ordering_field); - t.is(JSON.stringify(updateTableSettingsRO.readonly_fields), JSON.stringify(updateTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(updateTableSettingsRO.sortable_by), JSON.stringify(updateTableSettingsDTO.sortable_by)); - // t.is(JSON.stringify(updateTableSettingsRO.autocomplete_columns)).toBe(JSON.stringify([])); - t.is(updateTableSettingsRO.connection_id, testData.connections.firstId); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + + const createTableSettingsRO = JSON.parse( + createTableSettingsResponse.text, + ); + t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "PUT /settings/"; test.serial( - `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.secondId, - testData.secondTableInfo.testTableName, - ['id'], - [testData.secondTableInfo.testTableSecondColumnName], - [testData.secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.secondTableInfo.testTableName, - ['id'], - [testData.secondTableInfo.testTableSecondColumnName], - [testData.secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.ASC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put( - `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, - ) - .send(updateTableSettingsDTO) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return updated table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.ASC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const updateTableSettingsRO = JSON.parse( + updateTableSettingsResponse.text, + ); + t.is(updateTableSettingsResponse.status, 200); + + t.is(Object.hasOwn(updateTableSettingsRO, "id"), true); + t.is(updateTableSettingsRO.table_name, updateTableSettingsDTO.table_name); + t.is( + updateTableSettingsRO.display_name, + updateTableSettingsDTO.display_name, + ); + t.is( + JSON.stringify(updateTableSettingsRO.search_fields), + JSON.stringify(updateTableSettingsDTO.search_fields), + ); + t.is( + JSON.stringify(updateTableSettingsRO.excluded_fields), + JSON.stringify(updateTableSettingsDTO.excluded_fields), + ); + t.is( + JSON.stringify(updateTableSettingsRO.list_fields), + JSON.stringify(updateTableSettingsDTO.list_fields), + ); + // t.is(JSON.stringify(updateTableSettingsRO.identification_fields)).toBe(JSON.stringify([])); + t.is( + updateTableSettingsRO.list_per_page, + updateTableSettingsDTO.list_per_page, + ); + t.is(updateTableSettingsRO.ordering, updateTableSettingsDTO.ordering); + t.is( + updateTableSettingsRO.ordering_field, + updateTableSettingsDTO.ordering_field, + ); + t.is( + JSON.stringify(updateTableSettingsRO.readonly_fields), + JSON.stringify(updateTableSettingsDTO.readonly_fields), + ); + t.is( + JSON.stringify(updateTableSettingsRO.sortable_by), + JSON.stringify(updateTableSettingsDTO.sortable_by), + ); + // t.is(JSON.stringify(updateTableSettingsRO.autocomplete_columns)).toBe(JSON.stringify([])); + t.is(updateTableSettingsRO.connection_id, testData.connections.firstId); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'DELETE /settings/'; - -test.serial(`${currentTest} should return array without deleted table settings`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.firstId, - testData.firstTableInfo.testTableName, - ['id'], - [testData.firstTableInfo.testTableSecondColumnName], - [testData.firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete( - `/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, - ) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteTableSettingsResponse.status, 200); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.secondId, + testData.secondTableInfo.testTableName, + ["id"], + [testData.secondTableInfo.testTableSecondColumnName], + [testData.secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.secondTableInfo.testTableName, + ["id"], + [testData.secondTableInfo.testTableSecondColumnName], + [testData.secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.ASC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "DELETE /settings/"; test.serial( - `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const createTableSettingsDTO = mockFactory.generateTableSettings( - testData.connections.secondId, - testData.secondTableInfo.testTableName, - ['id'], - [testData.secondTableInfo.testTableSecondColumnName], - [testData.secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post( - `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, - ) - .send(createTableSettingsDTO) - .set('Cookie', testData.users.adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete( - `/settings/?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, - ) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteTableSettingsRO = JSON.parse(deleteTableSettingsResponse.text); - t.is(deleteTableSettingsResponse.status, 403); - t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return array without deleted table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.firstId, + testData.firstTableInfo.testTableName, + ["id"], + [testData.firstTableInfo.testTableSecondColumnName], + [testData.firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteTableSettingsResponse.status, 200); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${testData.connections.firstId}&tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const createTableSettingsDTO = mockFactory.generateTableSettings( + testData.connections.secondId, + testData.secondTableInfo.testTableName, + ["id"], + [testData.secondTableInfo.testTableSecondColumnName], + [testData.secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", testData.users.adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${testData.connections.secondId}&tableName=${testData.secondTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteTableSettingsRO = JSON.parse( + deleteTableSettingsResponse.text, + ); + t.is(deleteTableSettingsResponse.status, 403); + t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, ); //****************************** TABLE WIDGETS CONTROLLER -currentTest = 'GET /widgets/:slug'; - -test.serial(`${currentTest} should return empty widgets array when widgets not created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', testData.users.simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 200); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 0); - } catch (error) { - console.error(error); - throw error; - } -}); +currentTest = "GET /widgets/:slug"; -test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.firstTableInfo.testTableSecondColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); - t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); - - t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 2); - t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); - t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should return empty widgets array when widgets not created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", testData.users.simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 200); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 0); + } catch (error) { + console.error(error); + throw error; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.secondTableInfo.testTableSecondColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 403); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should return array of table widgets for table`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.firstTableInfo.testTableSecondColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); + t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); + + t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 2); + t.is( + getTableStructureRO.table_widgets[0].field_name, + newTableWidgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[1].widget_type, + newTableWidgets[1].widget_type, + ); + t.is( + compareTableWidgetsArrays( + getTableStructureRO.table_widgets, + newTableWidgets, + ), + true, + ); + } catch (error) { + console.error(error); + throw error; + } + }, ); -currentTest = 'POST /widget/:slug'; - -test.serial(`${currentTest} should return table settings with created table widget field`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.firstTableInfo.testTableSecondColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); - } catch (error) { - console.error(error); - throw error; - } -}); +test.serial( + `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.secondTableInfo.testTableSecondColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${testData.connections.secondId}?tableName=${testData.secondTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 403); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, +); + +currentTest = "POST /widget/:slug"; + +test.serial( + `${currentTest} should return table settings with created table widget field`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.firstTableInfo.testTableSecondColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${testData.connections.firstId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + } catch (error) { + console.error(error); + throw error; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection(app); - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - undefined, - testData.firstTableInfo.testTableSecondColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${testData.connections.secondId}?tableName=${testData.firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', testData.users.simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (error) { - console.error(error); - throw error; - } - }, + `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInAdminGroupOfFirstConnection( + app, + ); + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + undefined, + testData.firstTableInfo.testTableSecondColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${testData.connections.secondId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", testData.users.simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (error) { + console.error(error); + throw error; + } + }, ); diff --git a/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts index 3056b5ee4..d68cd7953 100644 --- a/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts @@ -1,2977 +1,3575 @@ /* eslint-disable security/detect-object-injection */ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { faker } from '@faker-js/faker'; -import { INestApplication, ValidationPipe } from '@nestjs/common'; -import { Test } from '@nestjs/testing'; -import test from 'ava'; -import cookieParser from 'cookie-parser'; -import request from 'supertest'; -import { ApplicationModule } from '../../../src/app.module.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; -import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; -import { Messages } from '../../../src/exceptions/text/messages.js'; -import { Cacher } from '../../../src/helpers/cache/cacher.js'; -import { Constants } from '../../../src/helpers/constants/constants.js'; -import { DatabaseModule } from '../../../src/shared/database/database.module.js'; -import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { MockFactory } from '../../mock.factory.js'; -import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; -import { TestUtils } from '../../utils/test.utils.js'; -import { createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions } from '../../utils/user-with-different-permissions-utils.js'; -import { inviteUserInCompanyAndAcceptInvitation } from '../../utils/register-user-and-return-user-info.js'; -import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; -import { ValidationError } from 'class-validator'; -import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { faker } from "@faker-js/faker"; +import { INestApplication, ValidationPipe } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import test from "ava"; +import { ValidationError } from "class-validator"; +import cookieParser from "cookie-parser"; +import request from "supertest"; +import { ApplicationModule } from "../../../src/app.module.js"; +import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { + AccessLevelEnum, + QueryOrderingEnum, +} from "../../../src/enums/index.js"; +import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; +import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; +import { Messages } from "../../../src/exceptions/text/messages.js"; +import { Cacher } from "../../../src/helpers/cache/cacher.js"; +import { Constants } from "../../../src/helpers/constants/constants.js"; +import { DatabaseModule } from "../../../src/shared/database/database.module.js"; +import { DatabaseService } from "../../../src/shared/database/database.service.js"; +import { MockFactory } from "../../mock.factory.js"; +import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; +import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; +import { TestUtils } from "../../utils/test.utils.js"; +import { createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions } from "../../utils/user-with-different-permissions-utils.js"; let app: INestApplication; let _testUtils: TestUtils; let currentTest: string; const mockFactory = new MockFactory(); -const newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); +const newConnectionToPostgres = + mockFactory.generateConnectionToTestPostgresDBInDocker(); const updateConnection = mockFactory.generateUpdateConnectionDto(); const newGroup1 = mockFactory.generateCreateGroupDto1(); const tablePermissions = { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, }; test.before(async () => { - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error("After tests error " + e); + } }); //***************************************** USER NOT ADDED INTO ADMIN GROUP //****************************** CONNECTION CONTROLLER -currentTest = 'GET /connections/'; - -test.serial(`${currentTest} should return connections, where second user have access`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const findAll = await request(app.getHttpServer()) - .get('/connections') - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - t.is(findAll.status, 200); - - const result = findAll.body.connections; - t.is(result.length, 5); - t.is(Object.hasOwn(result[0], 'connection'), true); - t.is(Object.hasOwn(result[0], 'accessLevel'), true); - - t.is(Object.hasOwn(result[0], 'accessLevel'), true); - t.is(Object.hasOwn(result[0].connection, 'host'), true); - t.is(Object.hasOwn(result[0].connection, 'host'), true); - t.is(typeof result[0].connection.port, 'number'); - t.is(Object.hasOwn(result[0].connection, 'port'), true); - t.is(Object.hasOwn(result[0].connection, 'username'), true); - t.is(Object.hasOwn(result[0].connection, 'database'), true); - t.is(Object.hasOwn(result[0].connection, 'sid'), true); - t.is(Object.hasOwn(result[0].connection, 'createdAt'), true); - t.is(Object.hasOwn(result[0].connection, 'updatedAt'), true); - t.is(Object.hasOwn(result[0].connection, 'password'), false); - t.is(Object.hasOwn(result[0].connection, 'groups'), false); - t.is(Object.hasOwn(result[0].connection, 'author'), false); - const testConnectionsCount = result.filter((el: any) => el.connection.isTestConnection).length; - t.is(testConnectionsCount, 4); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /connections/"; + +test.serial( + `${currentTest} should return connections, where second user have access`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const findAll = await request(app.getHttpServer()) + .get("/connections") + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + t.is(findAll.status, 200); + + const result = findAll.body.connections; + t.is(result.length, 5); + t.is(Object.hasOwn(result[0], "connection"), true); + t.is(Object.hasOwn(result[0], "accessLevel"), true); + + t.is(Object.hasOwn(result[0], "accessLevel"), true); + t.is(Object.hasOwn(result[0].connection, "host"), true); + t.is(Object.hasOwn(result[0].connection, "host"), true); + t.is(typeof result[0].connection.port, "number"); + t.is(Object.hasOwn(result[0].connection, "port"), true); + t.is(Object.hasOwn(result[0].connection, "username"), true); + t.is(Object.hasOwn(result[0].connection, "database"), true); + t.is(Object.hasOwn(result[0].connection, "sid"), true); + t.is(Object.hasOwn(result[0].connection, "createdAt"), true); + t.is(Object.hasOwn(result[0].connection, "updatedAt"), true); + t.is(Object.hasOwn(result[0].connection, "password"), false); + t.is(Object.hasOwn(result[0].connection, "groups"), false); + t.is(Object.hasOwn(result[0].connection, "author"), false); + const testConnectionsCount = result.filter( + (el: any) => el.connection.isTestConnection, + ).length; + t.is(testConnectionsCount, 4); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'GET /connection/one/:slug'; +currentTest = "GET /connection/one/:slug"; test.serial(`${currentTest} should return a found connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.firstId; - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - - const result = findOneResponce.body.connection; - - t.is(result.title, newConnectionToPostgres.title); - t.is(result.type, 'postgres'); - t.is(result.host, newConnectionToPostgres.host); - t.is(typeof result.port, 'number'); - t.is(result.port, newConnectionToPostgres.port); - t.is(result.username, 'postgres'); - t.is(result.database, newConnectionToPostgres.database); - t.is(result.sid, null); - t.is(Object.hasOwn(result, 'createdAt'), true); - t.is(Object.hasOwn(result, 'updatedAt'), true); - t.is(Object.hasOwn(result, 'password'), false); - t.is(Object.hasOwn(result, 'groups'), false); - t.is(Object.hasOwn(result, 'author'), false); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.firstId; + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(findOneResponce.status, 200); + + const result = findOneResponce.body.connection; + + t.is(result.title, newConnectionToPostgres.title); + t.is(result.type, "postgres"); + t.is(result.host, newConnectionToPostgres.host); + t.is(typeof result.port, "number"); + t.is(result.port, newConnectionToPostgres.port); + t.is(result.username, "postgres"); + t.is(result.database, newConnectionToPostgres.database); + t.is(result.sid, null); + t.is(Object.hasOwn(result, "createdAt"), true); + t.is(Object.hasOwn(result, "updatedAt"), true); + t.is(Object.hasOwn(result, "password"), false); + t.is(Object.hasOwn(result, "groups"), false); + t.is(Object.hasOwn(result, "author"), false); + } catch (e) { + console.error(e); + } }); test.serial( - `${currentTest} should throw an exception, when you do not have permission in this connection`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.secondId; - - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - // todo add checking connection object properties - t.is(findOneResponce.status, 200); - const findOneRO = JSON.parse(findOneResponce.text); - t.is(Object.hasOwn(findOneRO, 'host'), false); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'PUT /connection'; - -test.serial(`${currentTest} should throw exception you do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception, when you do not have permission in this connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.secondId; + + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + // todo add checking connection object properties + t.is(findOneResponce.status, 200); + const findOneRO = JSON.parse(findOneResponce.text); + t.is(Object.hasOwn(findOneRO, "host"), false); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "PUT /connection"; test.serial( - `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.secondId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'DELETE /connection/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //deleted connection found in database - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw exception you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to delete connection without permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //connection wasn't deleted - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'POST /connection/group/:slug'; - -test.serial(`${currentTest} should throw an exception don not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.secondId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "DELETE /connection/:slug"; test.serial( - `${currentTest} should throw an exception when you try add group in connection without permission in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'PUT /connection/group/:slug'; - -test.serial(`${currentTest} should return connection without deleted group result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - let result = createGroupResponse.body; - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - //after deleting group - result = response.body; - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //deleted connection found in database + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try to delete connection without permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //connection wasn't deleted + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "POST /connection/group/:slug"; test.serial( - `${currentTest} should throw an exception, when you try delete group in connection without permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - const result = createGroupResponse.body; - - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'GET /connection/groups/:slug'; + `${currentTest} should throw an exception don not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try add group in connection without permission in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "PUT /connection/group/:slug"; + +test.serial( + `${currentTest} should return connection without deleted group result`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + let result = createGroupResponse.body; + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + //after deleting group + result = response.body; + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try delete group in connection without permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + const result = createGroupResponse.body; + + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "GET /connection/groups/:slug"; test.serial(`${currentTest} should groups in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newRandomGroup2) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - const _groupId = result[0].group.id; - - t.is(Object.hasOwn(result[0].group, 'title'), true); - t.is(result[0].accessLevel, AccessLevelEnum.edit); - - const index = result.findIndex((el: any) => { - return el.group.title === 'Admin'; - }); - - t.is(index >= 0, false); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newRandomGroup2) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + const _groupId = result[0].group.id; + + t.is(Object.hasOwn(result[0].group, "title"), true); + t.is(result[0].accessLevel, AccessLevelEnum.edit); + + const index = result.findIndex((el: any) => { + return el.group.title === "Admin"; + }); + + t.is(index >= 0, false); + } catch (e) { + console.error(e); + } }); test.serial( - `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - - const result = JSON.parse(response.text); - t.is(result.length, 0); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'GET /connection/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const result = JSON.parse(response.text); - t.is(response.status, 200); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.readonly); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table: any) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[tableIndex], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - } -}); + `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + + const result = JSON.parse(response.text); + t.is(result.length, 0); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'GET /connection/user/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.readonly); - t.is(result.group.accessLevel, AccessLevelEnum.edit); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const foundTableIndex = tables.findIndex((table) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[foundTableIndex], 'object'); - t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); - t.is(tables[foundTableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[foundTableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /connection/permissions"; test.serial( - `${currentTest} should return permissions object for current group in current connection for current user`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.secondId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const foundTableIndex = tables.findIndex((table) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[0], 'object'); - t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); - t.is(tables[foundTableIndex].accessLevel.visibility, false); - t.is(tables[foundTableIndex].accessLevel.readonly, false); - t.is(tables[foundTableIndex].accessLevel.add, false); - t.is(tables[foundTableIndex].accessLevel.delete, false); - t.is(tables[foundTableIndex].accessLevel.edit, false); - t.is(tables[foundTableIndex].accessLevel.edit, false); - } catch (e) { - console.error(e); - } - }, + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const result = JSON.parse(response.text); + t.is(response.status, 200); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.readonly); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table: any) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[tableIndex], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is( + tables[tableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); + t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "GET /connection/user/permissions"; + +test.serial( + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.readonly); + t.is(result.group.accessLevel, AccessLevelEnum.edit); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const foundTableIndex = tables.findIndex( + (table) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[foundTableIndex], "object"); + t.is(Object.hasOwn(tables[foundTableIndex], "accessLevel"), true); + t.is( + tables[foundTableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is( + tables[foundTableIndex].accessLevel.readonly, + tablePermissions.readonly, + ); + t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should return permissions object for current group in current connection for current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.secondId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const foundTableIndex = tables.findIndex( + (table) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[0], "object"); + t.is(Object.hasOwn(tables[foundTableIndex], "accessLevel"), true); + t.is(tables[foundTableIndex].accessLevel.visibility, false); + t.is(tables[foundTableIndex].accessLevel.readonly, false); + t.is(tables[foundTableIndex].accessLevel.add, false); + t.is(tables[foundTableIndex].accessLevel.delete, false); + t.is(tables[foundTableIndex].accessLevel.edit, false); + t.is(tables[foundTableIndex].accessLevel.edit, false); + } catch (e) { + console.error(e); + } + }, ); //****************************** GROUP CONTROLLER ******************************// -currentTest = 'GET /groups/'; - -test.serial(`${currentTest} should return found groups with current user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - users: { simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/groups/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const { groups, groupsCount } = getGroupsRO; - t.is(groupsCount, 1); - t.is(groups.length, 1); - t.is(Object.hasOwn(groups[0], 'group'), true); - t.is(Object.hasOwn(groups[0], 'accessLevel'), true); - - t.is(Object.hasOwn(groups[0].group, 'title'), true); - t.is(Object.hasOwn(groups[0].group, 'isMain'), true); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /groups/"; -currentTest = 'GET /group/users/:slug'; +test.serial( + `${currentTest} should return found groups with current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + users: { simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/groups/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const { groups, groupsCount } = getGroupsRO; + t.is(groupsCount, 1); + t.is(groups.length, 1); + t.is(Object.hasOwn(groups[0], "group"), true); + t.is(Object.hasOwn(groups[0], "accessLevel"), true); + + t.is(Object.hasOwn(groups[0].group, "title"), true); + t.is(Object.hasOwn(groups[0].group, "isMain"), true); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "GET /group/users/:slug"; test.serial(`${currentTest} it should return users in group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { - return !element.group.isMain; - }); - const groupId = getGroupsRO[nonAdminGroupIndex].group.id; - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.length, 2); - t.is(getUsersRO[0].id === getUsersRO[1].id, false); - t.is(Object.hasOwn(getUsersRO[0], 'createdAt'), true); - t.is(Object.hasOwn(getUsersRO[0], 'password'), false); - t.is(Object.hasOwn(getUsersRO[0], 'isActive'), true); - t.is(Object.hasOwn(getUsersRO[0], 'email'), true); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { + return !element.group.isMain; + }); + const groupId = getGroupsRO[nonAdminGroupIndex].group.id; + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.length, 2); + t.is(getUsersRO[0].id === getUsersRO[1].id, false); + t.is(Object.hasOwn(getUsersRO[0], "createdAt"), true); + t.is(Object.hasOwn(getUsersRO[0], "password"), false); + t.is(Object.hasOwn(getUsersRO[0], "isActive"), true); + t.is(Object.hasOwn(getUsersRO[0], "email"), true); + } catch (e) { + console.error(e); + } }); test.serial( - `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'PUT /group/user'; + `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "PUT /group/user"; test.serial(`${currentTest} should return group with added user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text).group; - - t.is(Object.hasOwn(addUserInGroupRO, 'title'), true); - t.is(Object.hasOwn(addUserInGroupRO, 'isMain'), true); - t.is(Object.hasOwn(addUserInGroupRO, 'users'), true); - const { users } = addUserInGroupRO; - t.is(users.length, 3); - t.is(users[0].id === users[1].id, false); - t.is(users[1].id === users[2].id, false); - t.is(users[2].id === users[0].id, false); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text).group; + + t.is(Object.hasOwn(addUserInGroupRO, "title"), true); + t.is(Object.hasOwn(addUserInGroupRO, "isMain"), true); + t.is(Object.hasOwn(addUserInGroupRO, "users"), true); + const { users } = addUserInGroupRO; + t.is(users.length, 3); + t.is(users[0].id === users[1].id, false); + t.is(users[1].id === users[2].id, false); + t.is(users[2].id === users[0].id, false); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw exception, when user email not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + // t.is(addUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const email = faker.internet.email(); - const groupId = faker.string.uuid(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const email = faker.internet.email(); + const groupId = faker.string.uuid(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'DELETE /group/:slug'; - -test.serial(`${currentTest} should delete result after group deletion`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.isMain, false); - } catch (e) { - console.error(e); - } -}); +currentTest = "DELETE /group/:slug"; -test.serial(`${currentTest} should throw an exception when you try delete admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const adminGroupIndex = getGroupsRO.findIndex((group) => group.group.isMain); - - const groupId = getGroupsRO[adminGroupIndex].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should delete result after group deletion`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.isMain, false); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteGroupResponse.status, 404); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when you try delete admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const adminGroupIndex = getGroupsRO.findIndex( + (group) => group.group.isMain, + ); + + const groupId = getGroupsRO[adminGroupIndex].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CANT_DELETE_ADMIN_GROUP); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = faker.string.uuid(); - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteGroupResponse.status, 404); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'PUT /group/user/delete'; - -test.serial(`${currentTest} should return group without deleted user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', testData.users.simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addUserInGroupResponse.status, 200); - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - - t.is(Object.hasOwn(deleteUserInGroupRO, 'title'), true); - t.is(Object.hasOwn(deleteUserInGroupRO, 'isMain'), true); - t.is(Object.hasOwn(deleteUserInGroupRO, 'users'), true); - const { users } = deleteUserInGroupRO; - t.is(users.length, 2); - t.is(users[0].id === users[1].id, false); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = faker.string.uuid(); + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw exception, when user email not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const _email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ groupId }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); - } catch (e) { - console.error(e); - } -}); +currentTest = "PUT /group/user/delete"; -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should return group without deleted user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", testData.users.simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addUserInGroupResponse.status, 200); + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + + t.is(Object.hasOwn(deleteUserInGroupRO, "title"), true); + t.is(Object.hasOwn(deleteUserInGroupRO, "isMain"), true); + t.is(Object.hasOwn(deleteUserInGroupRO, "users"), true); + const { users } = deleteUserInGroupRO; + t.is(users.length, 2); + t.is(users[0].id === users[1].id, false); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - let groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - groupId = faker.string.uuid(); - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw exception, when user email not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const _email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ groupId }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + // t.is(deleteUserInGroupRO.message, ErrorsMessages.VALIDATION_FAILED); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + let groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + groupId = faker.string.uuid(); + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + } + }, +); //****************************** PERMISSION CONTROLLER TESTS ******************************// -currentTest = 'PUT permissions/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - t.is(createGroupResponse.status, 201); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +currentTest = "PUT permissions/:slug"; test.serial( - `${currentTest} should return updated complex permissions object when you update permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const permissions = { - connection: { - accessLevel: AccessLevelEnum.none, - connectionId: connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: groupId, - }, - tables: [ - { - accessLevel: { - add: false, - delete: false, - edit: true, - readonly: false, - visibility: true, - }, - tableName: firstTableInfo.testTableName, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - } catch (e) { - console.error(e); - } - }, -); - -test.serial(`${currentTest} should throw an exception, when you try change admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups: { firstAdminGroupId }, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.edit, - }, - group: { - groupId: firstAdminGroupId, - accessLevel: AccessLevelEnum.none, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${firstAdminGroupId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + t.is(createGroupResponse.status, 201); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should return updated complex permissions object when you update permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const permissions = { + connection: { + accessLevel: AccessLevelEnum.none, + connectionId: connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: groupId, + }, + tables: [ + { + accessLevel: { + add: false, + delete: false, + edit: true, + readonly: false, + visibility: true, + }, + tableName: firstTableInfo.testTableName, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try change admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups: { firstAdminGroupId }, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.edit, + }, + group: { + groupId: firstAdminGroupId, + accessLevel: AccessLevelEnum.none, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${firstAdminGroupId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); //****************************** TABLE CONTROLLER TESTS ******************************// -currentTest = 'GET /connection/tables/:slug'; - -test.serial(`${currentTest} should return all tables in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.length > 0, true); - const tableIndex = getTablesInConnectionRO.findIndex( - (table: any) => table.tableName === testData.firstTableInfo.testTableName, - ); - t.is(getTablesInConnectionRO[tableIndex].table, testData.firstTableInfo.testTableName); - t.is(typeof getTablesInConnectionRO[tableIndex].permissions, 'object'); - const { visibility, readonly, add, delete: del, edit } = getTablesInConnectionRO[0].permissions; - t.is(visibility, tablePermissions.visibility); - t.is(readonly, tablePermissions.readonly); - t.is(del, tablePermissions.delete); - t.is(edit, tablePermissions.edit); - t.is(add, tablePermissions.add); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /connection/tables/:slug"; -test.serial(`${currentTest} should throw an exception, when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 404); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should return all tables in connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.length > 0, true); + const tableIndex = getTablesInConnectionRO.findIndex( + (table: any) => + table.tableName === testData.firstTableInfo.testTableName, + ); + t.is( + getTablesInConnectionRO[tableIndex].table, + testData.firstTableInfo.testTableName, + ); + t.is(typeof getTablesInConnectionRO[tableIndex].permissions, "object"); + const { + visibility, + readonly, + add, + delete: del, + edit, + } = getTablesInConnectionRO[0].permissions; + t.is(visibility, tablePermissions.visibility); + t.is(readonly, tablePermissions.readonly); + t.is(del, tablePermissions.delete); + t.is(edit, tablePermissions.edit); + t.is(add, tablePermissions.add); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 404); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${fakeConnectionId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 400); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'GET /table/rows/:slug'; + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 400); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "GET /table/rows/:slug"; test.serial(`${currentTest} should return found rows from table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 200); - const getTableRowsRO = JSON.parse(getTableRows.text); - const { rows, primaryColumns, pagination, sortable_by, structure, foreignKeys } = getTableRowsRO; - t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(sortable_by.length, 0); - t.is(structure.length, 5); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 200); + const getTableRowsRO = JSON.parse(getTableRows.text); + const { + rows, + primaryColumns, + pagination, + sortable_by, + structure, + foreignKeys, + } = getTableRowsRO; + t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(sortable_by.length, 0); + t.is(structure.length, 5); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 404); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 404); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrec`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeId = faker.string.uuid(); - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTableRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrec`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeId = faker.string.uuid(); + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTableRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTablesRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTablesRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'GET /table/structure/:slug'; +currentTest = "GET /table/structure/:slug"; test.serial(`${currentTest} should return table structure`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTablesStructure.text); - - t.is(getTablesStructure.status, 200); - const { structure, primaryColumns, foreignKeys, readonly_fields, table_widgets } = getTableStructureRO; - t.is(structure.length, 5); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(readonly_fields.length, 0); - t.is(table_widgets.length, 0); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTablesStructure.text); + + t.is(getTablesStructure.status, 200); + const { + structure, + primaryColumns, + foreignKeys, + readonly_fields, + table_widgets, + } = getTableStructureRO; + t.is(structure.length, 5); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(readonly_fields.length, 0); + t.is(table_widgets.length, 0); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 404); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 404); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const fakeConnectionId = faker.string.uuid(); - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const fakeConnectionId = faker.string.uuid(); + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${connections.firstId}?tableName=`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${fakeTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'POST /table/row/:slug'; +currentTest = "POST /table/row/:slug"; test.serial(`${currentTest} should return added row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTable.status, 201); - t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); - t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); - t.is(addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], randomEmail); - t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTable.status, 201); + t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); + t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); + t.is( + addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], + randomEmail, + ); + t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(addRowInTableRO, "structure"), true); + t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.number.int({ min: 1, max: 10000 })}`; + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'PUT /table/row/:slug'; - -test.serial( - `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(updateRowInTable.text); - t.is(updateRowInTable.status, 403); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +currentTest = "PUT /table/row/:slug"; -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const updateRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(updateRowInTable.text); + t.is(updateRowInTable.status, 403); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'DELETE /table/row/:slug'; +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "DELETE /table/row/:slug"; test.serial(`${currentTest} should return delete result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTable.status, 200); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteRowInTable.status, 200); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - t.is(deleteRowInTable.status, 403); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 403); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -currentTest = 'GET /table/row/:slug'; +currentTest = "GET /table/row/:slug"; test.serial(`${currentTest} should return row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getRowInTable.text); - t.is(getRowInTable.status, 200); - t.is(getRowInTableRO.row.id, 7); - t.is(Object.hasOwn(getRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(getRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(getRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(getRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(getRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getRowInTable.text); + t.is(getRowInTable.status, 200); + t.is(getRowInTableRO.row.id, 7); + t.is(Object.hasOwn(getRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(getRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(getRowInTableRO, "structure"), true); + t.is(Object.hasOwn(getRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(getRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(getRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); //****************************** TABLE LOGS CONTROLLER TESTS ******************************// -currentTest = 'GET /logs/:slug'; - -test.serial(`${currentTest} should return all found logs in connection'`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 1); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'table_name'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'received_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'old_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'cognitoUserName'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'email'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationType'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationStatusResult'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'createdAt'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'connection_id'), true); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /logs/:slug"; + +test.serial( + `${currentTest} should return all found logs in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 1); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "table_name"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "received_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "old_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "cognitoUserName"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "email"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "operationType"), true); + t.is( + Object.hasOwn(getRowInTableRO.logs[0], "operationStatusResult"), + true, + ); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "createdAt"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "connection_id"), true); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - - const updateConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 200); - - const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded(null, false); - - const createConnectionPropertiesResponse = await request(app.getHttpServer()) - .post(`/connection/properties/${connections.firstId}`) - .send(newConnectionProperties) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createConnectionPropertiesResponse.status, 201); - - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + + const updateConnection = + mockFactory.generateConnectionToTestPostgresDBInDocker(); + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 200); + + const newConnectionProperties = + mockFactory.generateConnectionPropertiesUserExcluded(null, false); + + const createConnectionPropertiesResponse = await request( + app.getHttpServer(), + ) + .post(`/connection/properties/${connections.firstId}`) + .send(newConnectionProperties) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createConnectionPropertiesResponse.status, 201); + + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE SETTINGS CONTROLLER TESTS ******************************// -currentTest = 'GET /settings/'; +currentTest = "GET /settings/"; test.skip(`${currentTest} should return empty table settings when it was not created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); - } catch (e) { - console.error(e); - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(JSON.stringify(getTableSettingsRO), JSON.stringify({})); + } catch (e) { + console.error(e); + } }); -test.serial(`${currentTest} 'should return table settings when it was created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.is(Object.hasOwn(getTableSettingsRO, 'id'), true); - t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); - t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); - t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); - t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(getTableSettingsRO.list_fields), JSON.stringify(createTableSettingsDTO.list_fields.concat(['id', 'created_at', 'updated_at']))); - t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); - t.is(getTableSettingsRO.list_per_page, createTableSettingsDTO.list_per_page); - t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering); - t.is(getTableSettingsRO.ordering_field, createTableSettingsDTO.ordering_field); - t.is(JSON.stringify(getTableSettingsRO.readonly_fields), JSON.stringify(createTableSettingsDTO.readonly_fields)); - t.is(JSON.stringify(getTableSettingsRO.sortable_by), JSON.stringify(createTableSettingsDTO.sortable_by)); - t.is(JSON.stringify(getTableSettingsRO.autocomplete_columns), JSON.stringify([])); - t.is(getTableSettingsRO.connection_id, connections.firstId); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} 'should return table settings when it was created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.is(Object.hasOwn(getTableSettingsRO, "id"), true); + t.is(getTableSettingsRO.table_name, createTableSettingsDTO.table_name); + t.is( + getTableSettingsRO.display_name, + createTableSettingsDTO.display_name, + ); + t.is( + JSON.stringify(getTableSettingsRO.search_fields), + JSON.stringify(createTableSettingsDTO.search_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.excluded_fields), + JSON.stringify(createTableSettingsDTO.excluded_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.list_fields), + JSON.stringify( + createTableSettingsDTO.list_fields.concat([ + "id", + "created_at", + "updated_at", + ]), + ), + ); + t.is( + JSON.stringify(getTableSettingsRO.identification_fields), + JSON.stringify([]), + ); + t.is( + getTableSettingsRO.list_per_page, + createTableSettingsDTO.list_per_page, + ); + t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering); + t.is( + getTableSettingsRO.ordering_field, + createTableSettingsDTO.ordering_field, + ); + t.is( + JSON.stringify(getTableSettingsRO.readonly_fields), + JSON.stringify(createTableSettingsDTO.readonly_fields), + ); + t.is( + JSON.stringify(getTableSettingsRO.sortable_by), + JSON.stringify(createTableSettingsDTO.sortable_by), + ); + t.is( + JSON.stringify(getTableSettingsRO.autocomplete_columns), + JSON.stringify([]), + ); + t.is(getTableSettingsRO.connection_id, connections.firstId); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'POST /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - 'users', - ['id'], - ['email'], - ['name'], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - t.is(JSON.parse(createTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "POST /settings/"; test.serial( - `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - - const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'PUT /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + "users", + ["id"], + ["email"], + ["name"], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + t.is( + JSON.parse(createTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'DELETE /settings/'; - -test.serial(`${currentTest} should return array without deleted table settings`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteTableSettingsResponse.status, 403); - t.is(JSON.parse(deleteTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + + const createTableSettingsRO = JSON.parse( + createTableSettingsResponse.text, + ); + t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "PUT /settings/"; test.serial( - `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteTableSettingsRO = JSON.parse(deleteTableSettingsResponse.text); - t.is(deleteTableSettingsResponse.status, 403); - t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "DELETE /settings/"; + +test.serial( + `${currentTest} should return array without deleted table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteTableSettingsResponse.status, 403); + t.is( + JSON.parse(deleteTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteTableSettingsRO = JSON.parse( + deleteTableSettingsResponse.text, + ); + t.is(deleteTableSettingsResponse.status, 403); + t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, ); //****************************** TABLE WIDGETS CONTROLLER TESTS ******************************// -currentTest = 'GET /widgets/:slug'; - -test.serial(`${currentTest} should return empty widgets array when widgets not created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 200); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 0); - } catch (e) { - console.error(e); - } -}); +currentTest = "GET /widgets/:slug"; -test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(typeof getTableWidgetsRO, 'object'); - t.is(getTableWidgetsRO.length, 2); - - t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); - t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 2); - t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); - t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); - } catch (e) { - console.error(e); - } -}); +test.serial( + `${currentTest} should return empty widgets array when widgets not created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 200); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 0); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 403); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, -); - -currentTest = 'POST /widget/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } -}); + `${currentTest} should return array of table widgets for table`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(typeof getTableWidgetsRO, "object"); + t.is(getTableWidgetsRO.length, 2); + + t.is(getTableWidgetsRO[0].field_name, newTableWidgets[0].field_name); + t.is(getTableWidgetsRO[1].widget_type, newTableWidgets[1].widget_type); + t.is(compareTableWidgetsArrays(getTableWidgetsRO, newTableWidgets), true); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 2); + t.is( + getTableStructureRO.table_widgets[0].field_name, + newTableWidgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[1].widget_type, + newTableWidgets[1].widget_type, + ); + t.is( + compareTableWidgetsArrays( + getTableStructureRO.table_widgets, + newTableWidgets, + ), + true, + ); + } catch (e) { + console.error(e); + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 403); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); + +currentTest = "POST /widget/:slug"; + +test.serial( + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - } - }, + `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithGroupPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + } + }, ); diff --git a/backend/test/ava-tests/saas-tests/user-table-different-group-connection-readonly-permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/user-table-different-group-connection-readonly-permissions-e2e.test.ts index 48a9c3836..99435ca16 100644 --- a/backend/test/ava-tests/saas-tests/user-table-different-group-connection-readonly-permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/user-table-different-group-connection-readonly-permissions-e2e.test.ts @@ -1,2992 +1,3477 @@ /* eslint-disable security/detect-object-injection */ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { faker } from '@faker-js/faker'; -import { INestApplication, ValidationPipe } from '@nestjs/common'; -import { Test } from '@nestjs/testing'; -import test from 'ava'; -import cookieParser from 'cookie-parser'; -import request from 'supertest'; -import { ApplicationModule } from '../../../src/app.module.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; -import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; -import { Messages } from '../../../src/exceptions/text/messages.js'; -import { Cacher } from '../../../src/helpers/cache/cacher.js'; -import { Constants } from '../../../src/helpers/constants/constants.js'; -import { DatabaseModule } from '../../../src/shared/database/database.module.js'; -import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { MockFactory } from '../../mock.factory.js'; -import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; -import { TestUtils } from '../../utils/test.utils.js'; -import { createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions } from '../../utils/user-with-different-permissions-utils.js'; -import { inviteUserInCompanyAndAcceptInvitation } from '../../utils/register-user-and-return-user-info.js'; -import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; -import { ValidationError } from 'class-validator'; -import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { faker } from "@faker-js/faker"; +import { INestApplication, ValidationPipe } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import test from "ava"; +import { ValidationError } from "class-validator"; +import cookieParser from "cookie-parser"; +import request from "supertest"; +import { ApplicationModule } from "../../../src/app.module.js"; +import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { + AccessLevelEnum, + QueryOrderingEnum, +} from "../../../src/enums/index.js"; +import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; +import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; +import { Messages } from "../../../src/exceptions/text/messages.js"; +import { Cacher } from "../../../src/helpers/cache/cacher.js"; +import { Constants } from "../../../src/helpers/constants/constants.js"; +import { DatabaseModule } from "../../../src/shared/database/database.module.js"; +import { DatabaseService } from "../../../src/shared/database/database.service.js"; +import { MockFactory } from "../../mock.factory.js"; +import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; +import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; +import { TestUtils } from "../../utils/test.utils.js"; +import { createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions } from "../../utils/user-with-different-permissions-utils.js"; let app: INestApplication; let _testUtils: TestUtils; let currentTest: string; const mockFactory = new MockFactory(); -const newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); +const newConnectionToPostgres = + mockFactory.generateConnectionToTestPostgresDBInDocker(); const updateConnection = mockFactory.generateUpdateConnectionDto(); const newGroup1 = mockFactory.generateCreateGroupDto1(); const tablePermissions = { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, }; test.before(async () => { - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error("After tests error " + e); + } }); //***************************************** USER NOT ADDED INTO ADMIN GROUP //****************************** CONNECTION CONTROLLER -currentTest = 'GET /connections/'; - -test.serial(`${currentTest} should return connections, where second user have access`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const findAll = await request(app.getHttpServer()) - .get('/connections') - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - t.is(findAll.status, 200); - - t.is(findAll.status, 200); - - const result = findAll.body.connections; - const nonTestConnection = result.find(({ connection }) => connection.id === connections.firstId); - t.is(result.length, 5); - t.is(Object.hasOwn(nonTestConnection, 'connection'), true); - t.is(Object.hasOwn(nonTestConnection, 'accessLevel'), true); - t.is(nonTestConnection.accessLevel, AccessLevelEnum.readonly); - - t.is(Object.hasOwn(nonTestConnection.connection, 'host'), true); - t.is(Object.hasOwn(result[0].connection, 'host'), true); - t.is(typeof result[0].connection.port, 'number'); - t.is(Object.hasOwn(result[0].connection, 'port'), true); - t.is(Object.hasOwn(result[0].connection, 'username'), true); - t.is(Object.hasOwn(result[0].connection, 'database'), true); - t.is(Object.hasOwn(result[0].connection, 'sid'), true); - t.is(Object.hasOwn(result[0].connection, 'createdAt'), true); - t.is(Object.hasOwn(result[0].connection, 'updatedAt'), true); - t.is(Object.hasOwn(result[0].connection, 'password'), false); - t.is(Object.hasOwn(result[0].connection, 'groups'), false); - t.is(Object.hasOwn(result[0].connection, 'author'), false); - const testConnectionsCount = result.filter((el: any) => el.connection.isTestConnection).length; - t.is(testConnectionsCount, 4); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connections/"; -currentTest = 'GET /connection/one/:slug'; +test.serial( + `${currentTest} should return connections, where second user have access`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const findAll = await request(app.getHttpServer()) + .get("/connections") + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + t.is(findAll.status, 200); + + t.is(findAll.status, 200); + + const result = findAll.body.connections; + const nonTestConnection = result.find( + ({ connection }) => connection.id === connections.firstId, + ); + t.is(result.length, 5); + t.is(Object.hasOwn(nonTestConnection, "connection"), true); + t.is(Object.hasOwn(nonTestConnection, "accessLevel"), true); + t.is(nonTestConnection.accessLevel, AccessLevelEnum.readonly); + + t.is(Object.hasOwn(nonTestConnection.connection, "host"), true); + t.is(Object.hasOwn(result[0].connection, "host"), true); + t.is(typeof result[0].connection.port, "number"); + t.is(Object.hasOwn(result[0].connection, "port"), true); + t.is(Object.hasOwn(result[0].connection, "username"), true); + t.is(Object.hasOwn(result[0].connection, "database"), true); + t.is(Object.hasOwn(result[0].connection, "sid"), true); + t.is(Object.hasOwn(result[0].connection, "createdAt"), true); + t.is(Object.hasOwn(result[0].connection, "updatedAt"), true); + t.is(Object.hasOwn(result[0].connection, "password"), false); + t.is(Object.hasOwn(result[0].connection, "groups"), false); + t.is(Object.hasOwn(result[0].connection, "author"), false); + const testConnectionsCount = result.filter( + (el: any) => el.connection.isTestConnection, + ).length; + t.is(testConnectionsCount, 4); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /connection/one/:slug"; test.serial(`${currentTest} should return a found connection`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.firstId; - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - - const result = findOneResponce.body.connection; - - t.is(result.title, newConnectionToPostgres.title); - t.is(result.type, 'postgres'); - t.is(result.host, newConnectionToPostgres.host); - t.is(typeof result.port, 'number'); - t.is(result.port, newConnectionToPostgres.port); - t.is(result.username, 'postgres'); - t.is(result.database, newConnectionToPostgres.database); - t.is(result.sid, null); - t.is(Object.hasOwn(result, 'createdAt'), true); - t.is(Object.hasOwn(result, 'updatedAt'), true); - t.is(Object.hasOwn(result, 'password'), false); - t.is(Object.hasOwn(result, 'groups'), false); - t.is(Object.hasOwn(result, 'author'), false); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.firstId; + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(findOneResponce.status, 200); + + const result = findOneResponce.body.connection; + + t.is(result.title, newConnectionToPostgres.title); + t.is(result.type, "postgres"); + t.is(result.host, newConnectionToPostgres.host); + t.is(typeof result.port, "number"); + t.is(result.port, newConnectionToPostgres.port); + t.is(result.username, "postgres"); + t.is(result.database, newConnectionToPostgres.database); + t.is(result.sid, null); + t.is(Object.hasOwn(result, "createdAt"), true); + t.is(Object.hasOwn(result, "updatedAt"), true); + t.is(Object.hasOwn(result, "password"), false); + t.is(Object.hasOwn(result, "groups"), false); + t.is(Object.hasOwn(result, "author"), false); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} should throw an exception, when you do not have permission in this connection`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.secondId; - - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - // todo add checking connection object properties - t.is(findOneResponce.status, 200); - const findOneRO = JSON.parse(findOneResponce.text); - t.is(Object.hasOwn(findOneRO, 'host'), false); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception, when you do not have permission in this connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.secondId; + + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + // todo add checking connection object properties + t.is(findOneResponce.status, 200); + const findOneRO = JSON.parse(findOneResponce.text); + t.is(Object.hasOwn(findOneRO, "host"), false); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'PUT /connection'; - -test.serial(`${currentTest} should throw exception you do not have permission`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT /connection"; test.serial( - `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.secondId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw exception you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'DELETE /connection/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //deleted connection found in database - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.secondId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "DELETE /connection/:slug"; test.serial( - `${currentTest} should throw an exception, when you try to delete connection without permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //connection wasn't deleted - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //deleted connection found in database + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'POST /connection/group/:slug'; - -test.serial(`${currentTest} should throw an exception don not have permission`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception, when you try to delete connection without permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //connection wasn't deleted + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "POST /connection/group/:slug"; test.serial( - `${currentTest} should throw an exception when you try add group in connection without permission in it`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception don not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'PUT /connection/group/:slug'; - -test.serial(`${currentTest} should return connection without deleted group result`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - let result = createGroupResponse.body; - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - //after deleting group - result = response.body; - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when you try add group in connection without permission in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /connection/group/:slug"; + +test.serial( + `${currentTest} should return connection without deleted group result`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + let result = createGroupResponse.body; + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + //after deleting group + result = response.body; + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try delete group in connection without permissions`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - const result = createGroupResponse.body; - - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception, when you try delete group in connection without permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + const result = createGroupResponse.body; + + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'GET /connection/groups/:slug'; +currentTest = "GET /connection/groups/:slug"; test.serial(`${currentTest} should groups in connection`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newRandomGroup2) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - const _groupId = result[0].group.id; - - t.is(Object.hasOwn(result[0].group, 'title'), true); - t.is(result[0].accessLevel, AccessLevelEnum.readonly); - - const index = result.findIndex((el: any) => { - return el.group.title === 'Admin'; - }); - - t.is(index >= 0, false); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newRandomGroup2) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + const _groupId = result[0].group.id; + + t.is(Object.hasOwn(result[0].group, "title"), true); + t.is(result[0].accessLevel, AccessLevelEnum.readonly); + + const index = result.findIndex((el: any) => { + return el.group.title === "Admin"; + }); + + t.is(index >= 0, false); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - - const result = JSON.parse(response.text); - t.is(result.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + + const result = JSON.parse(response.text); + t.is(result.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'GET /connection/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const result = JSON.parse(response.text); - t.is(response.status, 200); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.readonly); - t.is(result.group.accessLevel, AccessLevelEnum.readonly); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table: any) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[tableIndex], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connection/permissions"; -currentTest = 'GET /connection/user/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.readonly); - t.is(result.group.accessLevel, AccessLevelEnum.readonly); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const foundTableIndex = tables.findIndex((table) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[foundTableIndex], 'object'); - t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); - t.is(tables[foundTableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[foundTableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const result = JSON.parse(response.text); + t.is(response.status, 200); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.readonly); + t.is(result.group.accessLevel, AccessLevelEnum.readonly); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table: any) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[tableIndex], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is( + tables[tableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); + t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /connection/user/permissions"; test.serial( - `${currentTest} should return permissions object for current group in current connection for current user`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.secondId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.readonly); + t.is(result.group.accessLevel, AccessLevelEnum.readonly); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const foundTableIndex = tables.findIndex( + (table) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[foundTableIndex], "object"); + t.is(Object.hasOwn(tables[foundTableIndex], "accessLevel"), true); + t.is( + tables[foundTableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is( + tables[foundTableIndex].accessLevel.readonly, + tablePermissions.readonly, + ); + t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return permissions object for current group in current connection for current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.secondId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** GROUP CONTROLLER ******************************// -currentTest = 'GET /groups/'; - -test.serial(`${currentTest} should return found groups with current user`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - users: { simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/groups/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const { groups, groupsCount } = getGroupsRO; - t.is(groupsCount, 1); - t.is(groups.length, 1); - t.is(Object.hasOwn(groups[0], 'group'), true); - t.is(Object.hasOwn(groups[0], 'accessLevel'), true); - - t.is(Object.hasOwn(groups[0].group, 'title'), true); - t.is(Object.hasOwn(groups[0].group, 'isMain'), true); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /groups/"; -currentTest = 'GET /group/users/:slug'; +test.serial( + `${currentTest} should return found groups with current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + users: { simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/groups/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const { groups, groupsCount } = getGroupsRO; + t.is(groupsCount, 1); + t.is(groups.length, 1); + t.is(Object.hasOwn(groups[0], "group"), true); + t.is(Object.hasOwn(groups[0], "accessLevel"), true); + + t.is(Object.hasOwn(groups[0].group, "title"), true); + t.is(Object.hasOwn(groups[0].group, "isMain"), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /group/users/:slug"; test.serial(`${currentTest} it should return users in groups`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { - return !element.group.isMain; - }); - const groupId = getGroupsRO[nonAdminGroupIndex].group.id; - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - const _getUsersRO = JSON.parse(response.text); - t.is(getGroupsRO.length, 2); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { + return !element.group.isMain; + }); + const groupId = getGroupsRO[nonAdminGroupIndex].group.id; + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + const _getUsersRO = JSON.parse(response.text); + t.is(getGroupsRO.length, 2); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'PUT /group/user'; - -test.serial(`${currentTest} should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 403); - t.is(Object.hasOwn(addUserInGroupRO, 'message'), true); - t.is(addUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT /group/user"; -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 403); + t.is(Object.hasOwn(addUserInGroupRO, "message"), true); + t.is(addUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const email = faker.internet.email(); - const groupId = faker.string.uuid(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'DELETE /group/:slug'; - -test.serial(`${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupResponse.status, 403); - t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const email = faker.internet.email(); + const groupId = faker.string.uuid(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when you try delete admin group`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const adminGroupIndex = getGroupsRO.findIndex((group) => group.group.isMain); - - const groupId = getGroupsRO[adminGroupIndex].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "DELETE /group/:slug"; -test.serial(`${currentTest} should throw an exception when group id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteGroupResponse.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupResponse.status, 403); + t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when group id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = faker.string.uuid(); - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when you try delete admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const adminGroupIndex = getGroupsRO.findIndex( + (group) => group.group.isMain, + ); + + const groupId = getGroupsRO[adminGroupIndex].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'PUT /group/user/delete'; - -test.serial(`${currentTest} should throw an exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteUserInGroupResponse.status, 403); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteGroupResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteUserInGroupResponse.status, 400); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = faker.string.uuid(); + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /group/user/delete"; + +test.serial( + `${currentTest} should throw an exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteUserInGroupResponse.status, 403); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteUserInGroupResponse.status, 400); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** PERMISSION CONTROLLER TESTS ******************************// -currentTest = 'PUT permissions/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - t.is(createGroupResponse.status, 201); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT permissions/:slug"; test.serial( - `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception object when you update permissions`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const permissions = { - connection: { - accessLevel: AccessLevelEnum.none, - connectionId: connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: groupId, - }, - tables: [ - { - accessLevel: { - add: false, - delete: false, - edit: true, - readonly: false, - visibility: true, - }, - tableName: firstTableInfo.testTableName, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + t.is(createGroupResponse.status, 201); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); -test.serial(`${currentTest} should throw an exception, when you try change admin group`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups: { firstAdminGroupId }, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.edit, - }, - group: { - groupId: firstAdminGroupId, - accessLevel: AccessLevelEnum.none, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${firstAdminGroupId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception object when you update permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const permissions = { + connection: { + accessLevel: AccessLevelEnum.none, + connectionId: connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: groupId, + }, + tables: [ + { + accessLevel: { + add: false, + delete: false, + edit: true, + readonly: false, + visibility: true, + }, + tableName: firstTableInfo.testTableName, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try change admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups: { firstAdminGroupId }, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.edit, + }, + group: { + groupId: firstAdminGroupId, + accessLevel: AccessLevelEnum.none, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${firstAdminGroupId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** TABLE CONTROLLER TESTS ******************************// -currentTest = 'GET /connection/tables/:slug'; - -test.serial(`${currentTest} should return all tables in connection`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.length > 0, true); - const tableIndex = getTablesInConnectionRO.findIndex( - (table: any) => table.table === testData.firstTableInfo.testTableName, - ); - t.is(getTablesInConnectionRO[tableIndex].table, testData.firstTableInfo.testTableName); - t.is(typeof getTablesInConnectionRO[tableIndex].permissions, 'object'); - const { visibility, readonly, add, delete: del, edit } = getTablesInConnectionRO[0].permissions; - t.is(visibility, tablePermissions.visibility); - t.is(readonly, tablePermissions.readonly); - t.is(del, tablePermissions.delete); - t.is(edit, tablePermissions.edit); - t.is(add, tablePermissions.add); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connection/tables/:slug"; -test.serial(`${currentTest} should throw an exception, when connection id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return all tables in connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.length > 0, true); + const tableIndex = getTablesInConnectionRO.findIndex( + (table: any) => table.table === testData.firstTableInfo.testTableName, + ); + t.is( + getTablesInConnectionRO[tableIndex].table, + testData.firstTableInfo.testTableName, + ); + t.is(typeof getTablesInConnectionRO[tableIndex].permissions, "object"); + const { + visibility, + readonly, + add, + delete: del, + edit, + } = getTablesInConnectionRO[0].permissions; + t.is(visibility, tablePermissions.visibility); + t.is(readonly, tablePermissions.readonly); + t.is(del, tablePermissions.delete); + t.is(edit, tablePermissions.edit); + t.is(add, tablePermissions.add); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${fakeConnectionId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 400); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception, when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'GET /table/rows/:slug'; +test.serial( + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 400); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /table/rows/:slug"; test.serial(`${currentTest} should return found rows from table`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 200); - const getTableRowsRO = JSON.parse(getTableRows.text); - const { rows, primaryColumns, pagination, sortable_by, structure, foreignKeys } = getTableRowsRO; - t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(sortable_by.length, 0); - t.is(structure.length, 5); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 200); + const getTableRowsRO = JSON.parse(getTableRows.text); + const { + rows, + primaryColumns, + pagination, + sortable_by, + structure, + foreignKeys, + } = getTableRowsRO; + t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(sortable_by.length, 0); + t.is(structure.length, 5); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrec`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeId = faker.string.uuid(); - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTableRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrec`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeId = faker.string.uuid(); + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTableRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTablesRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTablesRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /table/structure/:slug'; +currentTest = "GET /table/structure/:slug"; test.serial(`${currentTest} should return table structure`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTablesStructure.text); - - t.is(getTablesStructure.status, 200); - const { structure, primaryColumns, foreignKeys, readonly_fields, table_widgets } = getTableStructureRO; - t.is(structure.length, 5); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(readonly_fields.length, 0); - t.is(table_widgets.length, 0); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTablesStructure.text); + + t.is(getTablesStructure.status, 200); + const { + structure, + primaryColumns, + foreignKeys, + readonly_fields, + table_widgets, + } = getTableStructureRO; + t.is(structure.length, 5); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(readonly_fields.length, 0); + t.is(table_widgets.length, 0); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const fakeConnectionId = faker.string.uuid(); - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const fakeConnectionId = faker.string.uuid(); + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name not passed in request`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${connections.firstId}?tableName=`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${fakeTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'POST /table/row/:slug'; +currentTest = "POST /table/row/:slug"; test.serial(`${currentTest} should return added row`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTable.status, 201); - t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); - t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); - t.is(addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], randomEmail); - t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTable.status, 201); + t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); + t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); + t.is( + addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], + randomEmail, + ); + t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(addRowInTableRO, "structure"), true); + t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception, when user does not have add permission`, async (t) => { - try { - const permissionToAdd = { - visibility: true, - readonly: false, - add: false, - delete: false, - edit: false, - }; - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( - app, - permissionToAdd, - ); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTable.status, 403); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception, when user does not have add permission`, + async (t) => { + try { + const permissionToAdd = { + visibility: true, + readonly: false, + add: false, + delete: false, + edit: false, + }; + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + permissionToAdd, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTable.status, 403); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'PUT /table/row/:slug'; +currentTest = "PUT /table/row/:slug"; test.serial( - `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(updateRowInTable.text); - t.is(updateRowInTable.status, 403); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const updateRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(updateRowInTable.text); + t.is(updateRowInTable.status, 403); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'DELETE /table/row/:slug'; +currentTest = "DELETE /table/row/:slug"; test.serial(`${currentTest} should return delete result`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTable.status, 200); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteRowInTable.status, 200); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - t.is(deleteRowInTable.status, 403); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 403); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /table/row/:slug'; +currentTest = "GET /table/row/:slug"; test.serial(`${currentTest} should return row`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getRowInTable.text); - t.is(getRowInTable.status, 200); - t.is(getRowInTableRO.row.id, 7); - t.is(Object.hasOwn(getRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(getRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(getRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(getRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(getRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getRowInTable.text); + t.is(getRowInTable.status, 200); + t.is(getRowInTableRO.row.id, 7); + t.is(Object.hasOwn(getRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(getRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(getRowInTableRO, "structure"), true); + t.is(Object.hasOwn(getRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(getRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(getRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** TABLE LOGS CONTROLLER TESTS ******************************// -currentTest = 'GET /logs/:slug'; - -test.serial(`${currentTest} should return all found logs in connection'`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 1); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'table_name'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'received_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'old_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'cognitoUserName'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'email'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationType'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationStatusResult'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'createdAt'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'connection_id'), true); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /logs/:slug"; test.serial( - `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - - const updateConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 200); - - const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded(null, false); - - const createConnectionPropertiesResponse = await request(app.getHttpServer()) - .post(`/connection/properties/${connections.firstId}`) - .send(newConnectionProperties) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const createConnectionPropertiesRO = JSON.parse(createConnectionPropertiesResponse.text); - console.log('🚀 ~ createConnectionPropertiesRO:', createConnectionPropertiesRO); - t.is(createConnectionPropertiesResponse.status, 201); - - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found logs in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 1); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "table_name"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "received_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "old_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "cognitoUserName"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "email"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "operationType"), true); + t.is( + Object.hasOwn(getRowInTableRO.logs[0], "operationStatusResult"), + true, + ); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "createdAt"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "connection_id"), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + + const updateConnection = + mockFactory.generateConnectionToTestPostgresDBInDocker(); + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 200); + + const newConnectionProperties = + mockFactory.generateConnectionPropertiesUserExcluded(null, false); + + const createConnectionPropertiesResponse = await request( + app.getHttpServer(), + ) + .post(`/connection/properties/${connections.firstId}`) + .send(newConnectionProperties) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const createConnectionPropertiesRO = JSON.parse( + createConnectionPropertiesResponse.text, + ); + console.log( + "🚀 ~ createConnectionPropertiesRO:", + createConnectionPropertiesRO, + ); + t.is(createConnectionPropertiesResponse.status, 201); + + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE SETTINGS CONTROLLER TESTS ******************************// -currentTest = 'GET /settings/'; +currentTest = "GET /settings/"; test.skip(`${currentTest} should return empty object when table settings was not created`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - t.deepEqual(getTableSettingsRO, {}); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + t.deepEqual(getTableSettingsRO, {}); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} 'should should return created table settings`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const _getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 200); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} 'should should return created table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const _getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 200); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'POST /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - 'users', - ['id'], - ['email'], - ['name'], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - t.is(JSON.parse(createTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "POST /settings/"; test.serial( - `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - - const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + "users", + ["id"], + ["email"], + ["name"], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + t.is( + JSON.parse(createTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'PUT /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + + const createTableSettingsRO = JSON.parse( + createTableSettingsResponse.text, + ); + t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /settings/"; test.serial( - `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'DELETE /settings/'; - -test.serial(`${currentTest} should return array without deleted table settings`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteTableSettingsResponse.status, 403); - t.is(JSON.parse(deleteTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "DELETE /settings/"; test.serial( - `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteTableSettingsRO = JSON.parse(deleteTableSettingsResponse.text); - t.is(deleteTableSettingsResponse.status, 403); - t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return array without deleted table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteTableSettingsResponse.status, 403); + t.is( + JSON.parse(deleteTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteTableSettingsRO = JSON.parse( + deleteTableSettingsResponse.text, + ); + t.is(deleteTableSettingsResponse.status, 403); + t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE WIDGETS CONTROLLER TESTS ******************************// -currentTest = 'GET /widgets/:slug'; - -test.serial(`${currentTest} should return empty widgets array when widgets not created`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 200); - t.is(getTableWidgetsRO.length, 0); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /widgets/:slug"; -test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 200); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgetsRO.length, 2); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 2); - t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); - t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return empty widgets array when widgets not created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 200); + t.is(getTableWidgetsRO.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 403); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return array of table widgets for table`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 200); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgetsRO.length, 2); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 2); + t.is( + getTableStructureRO.table_widgets[0].field_name, + newTableWidgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[1].widget_type, + newTableWidgets[1].widget_type, + ); + t.is( + compareTableWidgetsArrays( + getTableStructureRO.table_widgets, + newTableWidgets, + ), + true, + ); + } catch (e) { + console.error(e); + throw e; + } + }, ); -currentTest = 'POST /widget/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 403); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "POST /widget/:slug"; + +test.serial( + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, - async (t) => { - try { - const testData = - await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithTableDifferentConnectionGroupReadOnlyPermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); diff --git a/backend/test/ava-tests/saas-tests/user-with-table-only-permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/user-with-table-only-permissions-e2e.test.ts index a25752a10..6b05559f2 100644 --- a/backend/test/ava-tests/saas-tests/user-with-table-only-permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/user-with-table-only-permissions-e2e.test.ts @@ -1,2848 +1,3395 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable security/detect-object-injection */ -import { faker } from '@faker-js/faker'; -import { INestApplication, ValidationPipe } from '@nestjs/common'; -import { Test } from '@nestjs/testing'; -import test from 'ava'; -import cookieParser from 'cookie-parser'; -import request from 'supertest'; -import { ApplicationModule } from '../../../src/app.module.js'; -import { AccessLevelEnum, QueryOrderingEnum } from '../../../src/enums/index.js'; -import { AllExceptionsFilter } from '../../../src/exceptions/all-exceptions.filter.js'; -import { Messages } from '../../../src/exceptions/text/messages.js'; -import { Cacher } from '../../../src/helpers/cache/cacher.js'; -import { Constants } from '../../../src/helpers/constants/constants.js'; -import { DatabaseModule } from '../../../src/shared/database/database.module.js'; -import { DatabaseService } from '../../../src/shared/database/database.service.js'; -import { MockFactory } from '../../mock.factory.js'; -import { compareTableWidgetsArrays } from '../../utils/compare-table-widgets-arrays.js'; -import { TestUtils } from '../../utils/test.utils.js'; -import { createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions } from '../../utils/user-with-different-permissions-utils.js'; -import { inviteUserInCompanyAndAcceptInvitation } from '../../utils/register-user-and-return-user-info.js'; -import { ValidationException } from '../../../src/exceptions/custom-exceptions/validation-exception.js'; -import { ValidationError } from 'class-validator'; -import { WinstonLogger } from '../../../src/entities/logging/winston-logger.js'; +import { faker } from "@faker-js/faker"; +import { INestApplication, ValidationPipe } from "@nestjs/common"; +import { Test } from "@nestjs/testing"; +import test from "ava"; +import { ValidationError } from "class-validator"; +import cookieParser from "cookie-parser"; +import request from "supertest"; +import { ApplicationModule } from "../../../src/app.module.js"; +import { WinstonLogger } from "../../../src/entities/logging/winston-logger.js"; +import { + AccessLevelEnum, + QueryOrderingEnum, +} from "../../../src/enums/index.js"; +import { AllExceptionsFilter } from "../../../src/exceptions/all-exceptions.filter.js"; +import { ValidationException } from "../../../src/exceptions/custom-exceptions/validation-exception.js"; +import { Messages } from "../../../src/exceptions/text/messages.js"; +import { Cacher } from "../../../src/helpers/cache/cacher.js"; +import { Constants } from "../../../src/helpers/constants/constants.js"; +import { DatabaseModule } from "../../../src/shared/database/database.module.js"; +import { DatabaseService } from "../../../src/shared/database/database.service.js"; +import { MockFactory } from "../../mock.factory.js"; +import { compareTableWidgetsArrays } from "../../utils/compare-table-widgets-arrays.js"; +import { inviteUserInCompanyAndAcceptInvitation } from "../../utils/register-user-and-return-user-info.js"; +import { TestUtils } from "../../utils/test.utils.js"; +import { createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions } from "../../utils/user-with-different-permissions-utils.js"; let app: INestApplication; let _testUtils: TestUtils; let currentTest: string; const mockFactory = new MockFactory(); -const _newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); +const _newConnectionToPostgres = + mockFactory.generateConnectionToTestPostgresDBInDocker(); const updateConnection = mockFactory.generateUpdateConnectionDto(); const newGroup1 = mockFactory.generateCreateGroupDto1(); const tablePermissions = { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, }; test.before(async () => { - const moduleFixture = await Test.createTestingModule({ - imports: [ApplicationModule, DatabaseModule], - providers: [DatabaseService, TestUtils], - }).compile(); - app = moduleFixture.createNestApplication(); - _testUtils = moduleFixture.get(TestUtils); - - app.use(cookieParser()); - app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); - app.useGlobalPipes( - new ValidationPipe({ - exceptionFactory(validationErrors: ValidationError[] = []) { - return new ValidationException(validationErrors); - }, - }), - ); - await app.init(); - app.getHttpServer().listen(0); + const moduleFixture = await Test.createTestingModule({ + imports: [ApplicationModule, DatabaseModule], + providers: [DatabaseService, TestUtils], + }).compile(); + app = moduleFixture.createNestApplication(); + _testUtils = moduleFixture.get(TestUtils); + + app.use(cookieParser()); + app.useGlobalFilters(new AllExceptionsFilter(app.get(WinstonLogger))); + app.useGlobalPipes( + new ValidationPipe({ + exceptionFactory(validationErrors: ValidationError[] = []) { + return new ValidationException(validationErrors); + }, + }), + ); + await app.init(); + app.getHttpServer().listen(0); }); test.after(async () => { - try { - await Cacher.clearAllCache(); - await app.close(); - } catch (e) { - console.error('After tests error ' + e); - } + try { + await Cacher.clearAllCache(); + await app.close(); + } catch (e) { + console.error("After tests error " + e); + } }); //***************************************** USER NOT ADDED INTO ADMIN GROUP //****************************** CONNECTION CONTROLLER -currentTest = 'GET /connections/'; - -test.serial(`${currentTest} should return connections, where second user have access`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const findAll = await request(app.getHttpServer()) - .get('/connections') - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - t.is(findAll.status, 200); - - const result = findAll.body.connections; - t.is(result.length, 5); - const nonTestConnection = result.find(({ connection }) => connection.id === connections.firstId); - for (const key in nonTestConnection.connection) { - t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(key), true); - } - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connections/"; + +test.serial( + `${currentTest} should return connections, where second user have access`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const findAll = await request(app.getHttpServer()) + .get("/connections") + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + t.is(findAll.status, 200); + + const result = findAll.body.connections; + t.is(result.length, 5); + const nonTestConnection = result.find( + ({ connection }) => connection.id === connections.firstId, + ); + for (const key in nonTestConnection.connection) { + t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(key), true); + } + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /connection/one/:slug'; +currentTest = "GET /connection/one/:slug"; test.serial(`${currentTest} should return a found connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.firstId; - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(findOneResponce.status, 200); - - const result = findOneResponce.body.connection; - for (const key in result) { - t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(key), true); - } - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.firstId; + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(findOneResponce.status, 200); + + const result = findOneResponce.body.connection; + for (const key in result) { + t.is(Constants.CONNECTION_KEYS_NONE_PERMISSION.includes(key), true); + } + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} should throw an exception, when you do not have permission in this connection`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const searchedConnectionId = connections.secondId; - - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${searchedConnectionId}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - - // todo add checking connection object properties - t.is(findOneResponce.status, 200); - const findOneRO = JSON.parse(findOneResponce.text); - t.is(Object.hasOwn(findOneRO, 'host'), false); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'PUT /connection'; - -test.serial(`${currentTest} should throw exception you do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should throw an exception, when you do not have permission in this connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const searchedConnectionId = connections.secondId; + + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${searchedConnectionId}`) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + + // todo add checking connection object properties + t.is(findOneResponce.status, 200); + const findOneRO = JSON.parse(findOneResponce.text); + t.is(Object.hasOwn(findOneRO, "host"), false); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /connection"; test.serial( - `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.secondId}`) - .send(updateConnection) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 403); - t.is(JSON.parse(updateConnectionResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'DELETE /connection/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //deleted connection found in database - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should throw exception you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to delete connection without permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const response = await request(app.getHttpServer()) - .put(`/connection/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - - //connection wasn't deleted - const findOneResponce = await request(app.getHttpServer()) - .get(`/connection/one/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(findOneResponce.status, 200); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'POST /connection/group/:slug'; - -test.serial(`${currentTest} should throw an exception don not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should return throw an exception, when you try update a connection without permissions in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.secondId}`) + .send(updateConnection) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 403); + t.is( + JSON.parse(updateConnectionResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "DELETE /connection/:slug"; test.serial( - `${currentTest} should throw an exception when you try add group in connection without permission in it`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 403); - t.is(JSON.parse(createGroupResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'PUT /connection/group/:slug'; - -test.serial(`${currentTest} should return connection without deleted group result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - let result = createGroupResponse.body; - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - //after deleting group - result = response.body; - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //deleted connection found in database + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + t.is(JSON.parse(findOneResponce.text).connection.id, connections.firstId); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try to delete connection without permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const response = await request(app.getHttpServer()) + .put(`/connection/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + + //connection wasn't deleted + const findOneResponce = await request(app.getHttpServer()) + .get(`/connection/one/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(findOneResponce.status, 200); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "POST /connection/group/:slug"; test.serial( - `${currentTest} should throw an exception, when you try delete group in connection without permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - // create group in connection - const result = createGroupResponse.body; - - t.is(createGroupResponse.status, 201); - - t.is(Object.hasOwn(result, 'id'), true); - t.is(result.title, newGroup1.title); - - const createGroupRO = JSON.parse(createGroupResponse.text); - - const response = await request(app.getHttpServer()) - .put(`/connection/group/delete/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .send({ groupId: createGroupRO.id }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 403); - t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'GET /connection/groups/:slug'; + `${currentTest} should throw an exception don not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try add group in connection without permission in it`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 403); + t.is( + JSON.parse(createGroupResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /connection/group/:slug"; + +test.serial( + `${currentTest} should return connection without deleted group result`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + let result = createGroupResponse.body; + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + //after deleting group + result = response.body; + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try delete group in connection without permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + // create group in connection + const result = createGroupResponse.body; + + t.is(createGroupResponse.status, 201); + + t.is(Object.hasOwn(result, "id"), true); + t.is(result.title, newGroup1.title); + + const createGroupRO = JSON.parse(createGroupResponse.text); + + const response = await request(app.getHttpServer()) + .put(`/connection/group/delete/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .send({ groupId: createGroupRO.id }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 403); + t.is(JSON.parse(response.text).message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /connection/groups/:slug"; test.serial(`${currentTest} should groups in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newRandomGroup2) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - const _groupId = result[0].group.id; - - t.is(Object.hasOwn(result[0].group, 'title'), true); - t.is(result[0].accessLevel, AccessLevelEnum.none); - - const index = result.findIndex((el: any) => { - return el.group.title === 'Admin'; - }); - - t.is(index >= 0, false); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newRandomGroup2 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newRandomGroup2) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + const _groupId = result[0].group.id; + + t.is(Object.hasOwn(result[0].group, "title"), true); + t.is(result[0].accessLevel, AccessLevelEnum.none); + + const index = result.findIndex((el: any) => { + return el.group.title === "Admin"; + }); + + t.is(index >= 0, false); + } catch (e) { + console.error(e); + throw e; + } }); test.serial( - `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.secondId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createGroupResponse.status, 201); - - const response = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - - const result = JSON.parse(response.text); - t.is(result.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'GET /connection/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const result = JSON.parse(response.text); - t.is(response.status, 200); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const tableIndex = tables.findIndex((table: any) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[tableIndex], 'object'); - t.is(Object.hasOwn(tables[tableIndex], 'accessLevel'), true); - t.is(tables[tableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} it should throw an exception, when you try get groups in connection, where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.secondId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createGroupResponse.status, 201); + + const response = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + + const result = JSON.parse(response.text); + t.is(result.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /connection/user/permissions'; - -test.serial(`${currentTest} should return permissions object for current group in current connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.firstId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - - const { tables } = result; - const foundTableIndex = tables.findIndex((table) => table.tableName === firstTableInfo.testTableName); - t.is(tables.length > 0, true); - t.is(typeof tables[foundTableIndex], 'object'); - t.is(Object.hasOwn(tables[foundTableIndex], 'accessLevel'), true); - t.is(tables[foundTableIndex].accessLevel.visibility, tablePermissions.visibility); - t.is(tables[foundTableIndex].accessLevel.readonly, tablePermissions.readonly); - t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); - t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); - t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connection/permissions"; test.serial( - `${currentTest} should return permissions object for current group in current connection for current user`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(response.status, 200); - const result = JSON.parse(response.text); - - t.is(Object.hasOwn(result, 'connection'), true); - t.is(Object.hasOwn(result, 'group'), true); - t.is(Object.hasOwn(result, 'tables'), true); - t.is(typeof result.connection, 'object'); - t.is(typeof result.group, 'object'); - t.is(result.connection.connectionId, connections.secondId); - t.is(result.group.groupId, groupId); - t.is(result.connection.accessLevel, AccessLevelEnum.none); - t.is(result.group.accessLevel, AccessLevelEnum.none); - t.is(typeof result.tables, 'object'); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const result = JSON.parse(response.text); + t.is(response.status, 200); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const tableIndex = tables.findIndex( + (table: any) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[tableIndex], "object"); + t.is(Object.hasOwn(tables[tableIndex], "accessLevel"), true); + t.is( + tables[tableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is(tables[tableIndex].accessLevel.readonly, tablePermissions.readonly); + t.is(tables[tableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[tableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[tableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /connection/user/permissions"; + +test.serial( + `${currentTest} should return permissions object for current group in current connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.firstId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.firstId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + + const { tables } = result; + const foundTableIndex = tables.findIndex( + (table) => table.tableName === firstTableInfo.testTableName, + ); + t.is(tables.length > 0, true); + t.is(typeof tables[foundTableIndex], "object"); + t.is(Object.hasOwn(tables[foundTableIndex], "accessLevel"), true); + t.is( + tables[foundTableIndex].accessLevel.visibility, + tablePermissions.visibility, + ); + t.is( + tables[foundTableIndex].accessLevel.readonly, + tablePermissions.readonly, + ); + t.is(tables[foundTableIndex].accessLevel.add, tablePermissions.add); + t.is(tables[foundTableIndex].accessLevel.delete, tablePermissions.delete); + t.is(tables[foundTableIndex].accessLevel.edit, tablePermissions.edit); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should return permissions object for current group in current connection for current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get( + `/connection/user/permissions?connectionId=${connections.secondId}&groupId=${groupId}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(response.status, 200); + const result = JSON.parse(response.text); + + t.is(Object.hasOwn(result, "connection"), true); + t.is(Object.hasOwn(result, "group"), true); + t.is(Object.hasOwn(result, "tables"), true); + t.is(typeof result.connection, "object"); + t.is(typeof result.group, "object"); + t.is(result.connection.connectionId, connections.secondId); + t.is(result.group.groupId, groupId); + t.is(result.connection.accessLevel, AccessLevelEnum.none); + t.is(result.group.accessLevel, AccessLevelEnum.none); + t.is(typeof result.tables, "object"); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** GROUP CONTROLLER ******************************// -currentTest = 'GET /groups/'; - -test.serial(`${currentTest} should return found groups with current user`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - users: { simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/groups/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const { groups, groupsCount } = getGroupsRO; - t.is(groupsCount, 1); - t.is(groups.length, 1); - t.is(Object.hasOwn(groups[0], 'group'), true); - t.is(Object.hasOwn(groups[0], 'accessLevel'), true); - - t.is(Object.hasOwn(groups[0].group, 'title'), true); - t.is(Object.hasOwn(groups[0].group, 'isMain'), true); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /groups/"; -currentTest = 'GET /group/users/:slug'; -test.serial(`${currentTest} it should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { - return !element.group.isMain; - }); - const groupId = getGroupsRO[nonAdminGroupIndex].group.id; - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(response.status, 403); - const getUsersRO = JSON.parse(response.text); - t.is(Object.hasOwn(getUsersRO, 'message'), true); - t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return found groups with current user`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + users: { simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/groups/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const { groups, groupsCount } = getGroupsRO; + t.is(groupsCount, 1); + t.is(groups.length, 1); + t.is(Object.hasOwn(groups[0], "group"), true); + t.is(Object.hasOwn(groups[0], "accessLevel"), true); + + t.is(Object.hasOwn(groups[0].group, "title"), true); + t.is(Object.hasOwn(groups[0].group, "isMain"), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); +currentTest = "GET /group/users/:slug"; test.serial( - `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.secondId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const response = await request(app.getHttpServer()) - .get(`/group/users/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getUsersRO = JSON.parse(response.text); - t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'PUT /group/user'; - -test.serial(`${currentTest} should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 403); - t.is(Object.hasOwn(addUserInGroupRO, 'message'), true); - t.is(addUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} it should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + const nonAdminGroupIndex = getGroupsRO.findIndex((element) => { + return !element.group.isMain; + }); + const groupId = getGroupsRO[nonAdminGroupIndex].group.id; + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(response.status, 403); + const getUsersRO = JSON.parse(response.text); + t.is(Object.hasOwn(getUsersRO, "message"), true); + t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const email = faker.internet.email(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} it should throw an exception when you try to receive user in group where you dont have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.secondId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const response = await request(app.getHttpServer()) + .get(`/group/users/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getUsersRO = JSON.parse(response.text); + t.is(getUsersRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const email = faker.internet.email(); - const groupId = faker.string.uuid(); - const addUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); - t.is(addUserInGroupResponse.status, 400); - t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT /group/user"; -currentTest = 'DELETE /group/:slug'; - -test.serial(`${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupResponse.status, 403); - t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 403); + t.is(Object.hasOwn(addUserInGroupRO, "message"), true); + t.is(addUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when you try delete admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const adminGroupIndex = getGroupsRO.findIndex((group) => group.group.isMain); - - const groupId = getGroupsRO[adminGroupIndex].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const email = faker.internet.email(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const _groupId = getGroupsRO[0].group.id; - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteGroupResponse.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw exception, when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const email = faker.internet.email(); + const groupId = faker.string.uuid(); + const addUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addUserInGroupRO = JSON.parse(addUserInGroupResponse.text); + t.is(addUserInGroupResponse.status, 400); + t.is(addUserInGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when group id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - - const groupId = faker.string.uuid(); - const deleteGroupResponse = await request(app.getHttpServer()) - .delete(`/group/${groupId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteGroupRO = JSON.parse(deleteGroupResponse.text); - t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "DELETE /group/:slug"; -currentTest = 'PUT /group/user/delete'; - -test.serial(`${currentTest} should throw an exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ groupId, email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteUserInGroupResponse.status, 403); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const groupId = JSON.parse(getGroupsResponse.text)[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupResponse.status, 403); + t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw exception, when group id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const _getGroupsRO = JSON.parse(getGroupsResponse.text); - - const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( - testData.users.adminUserToken, - undefined, - app, - undefined, - ); - - const email = thirdTestUser.email; - - const deleteUserInGroupResponse = await request(app.getHttpServer()) - .put('/group/user/delete') - .set('Cookie', simpleUserToken) - .send({ email }) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(deleteUserInGroupResponse.status, 400); - const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); - t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when you try delete admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const adminGroupIndex = getGroupsRO.findIndex( + (group) => group.group.isMain, + ); + + const groupId = getGroupsRO[adminGroupIndex].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const _groupId = getGroupsRO[0].group.id; + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteGroupResponse.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when group id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + + const groupId = faker.string.uuid(); + const deleteGroupResponse = await request(app.getHttpServer()) + .delete(`/group/${groupId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteGroupRO = JSON.parse(deleteGroupResponse.text); + t.is(deleteGroupRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /group/user/delete"; + +test.serial( + `${currentTest} should throw an exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ groupId, email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteUserInGroupResponse.status, 403); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw exception, when group id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const _getGroupsRO = JSON.parse(getGroupsResponse.text); + + const thirdTestUser = await inviteUserInCompanyAndAcceptInvitation( + testData.users.adminUserToken, + undefined, + app, + undefined, + ); + + const email = thirdTestUser.email; + + const deleteUserInGroupResponse = await request(app.getHttpServer()) + .put("/group/user/delete") + .set("Cookie", simpleUserToken) + .send({ email }) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(deleteUserInGroupResponse.status, 400); + const deleteUserInGroupRO = JSON.parse(deleteUserInGroupResponse.text); + t.is(deleteUserInGroupRO.message, Messages.GROUP_ID_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** PERMISSION CONTROLLER TESTS ******************************// -currentTest = 'PUT permissions/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); - const createGroupResponse = await request(app.getHttpServer()) - .post(`/connection/group/${connections.firstId}`) - .set('Cookie', adminUserToken) - .send(newGroup1) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createGroupRO = JSON.parse(createGroupResponse.text); - t.is(createGroupResponse.status, 201); - const newGroupId = createGroupRO.id; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.readonly, - }, - group: { - groupId: newGroupId, - accessLevel: AccessLevelEnum.readonly, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT permissions/:slug"; test.serial( - `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception object when you update permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getGroupsResponse = await request(app.getHttpServer()) - .get(`/connection/groups/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(getGroupsResponse.status, 200); - const getGroupsRO = JSON.parse(getGroupsResponse.text); - - const groupId = getGroupsRO[0].group.id; - - const permissions = { - connection: { - accessLevel: AccessLevelEnum.none, - connectionId: connections.firstId, - }, - group: { - accessLevel: AccessLevelEnum.readonly, - groupId: groupId, - }, - tables: [ - { - accessLevel: { - add: false, - delete: false, - edit: true, - readonly: false, - visibility: true, - }, - tableName: firstTableInfo.testTableName, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -test.serial(`${currentTest} should throw an exception, when you try change admin group`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups: { firstAdminGroupId }, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const permissions = { - connection: { - connectionId: connections.firstId, - accessLevel: AccessLevelEnum.edit, - }, - group: { - groupId: firstAdminGroupId, - accessLevel: AccessLevelEnum.none, - }, - tables: [ - { - tableName: firstTableInfo.testTableName, - accessLevel: { - visibility: true, - readonly: false, - add: true, - delete: true, - edit: false, - }, - }, - ], - }; - - const createOrUpdatePermissionResponse = await request(app.getHttpServer()) - .put(`/permissions/${firstAdminGroupId}`) - .send({ permissions }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const createOrUpdatePermissionRO = JSON.parse(createOrUpdatePermissionResponse.text); - t.is(createOrUpdatePermissionResponse.status, 403); - t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newGroup1 = MockFactory.generateCreateGroupDtoWithRandomTitle(); + const createGroupResponse = await request(app.getHttpServer()) + .post(`/connection/group/${connections.firstId}`) + .set("Cookie", adminUserToken) + .send(newGroup1) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createGroupRO = JSON.parse(createGroupResponse.text); + t.is(createGroupResponse.status, 201); + const newGroupId = createGroupRO.id; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.readonly, + }, + group: { + groupId: newGroupId, + accessLevel: AccessLevelEnum.readonly, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put( + `/permissions/${newGroupId}?connectionId=${testData.connections.firstId}`, + ) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw ${Messages.DONT_HAVE_PERMISSIONS} exception object when you update permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getGroupsResponse = await request(app.getHttpServer()) + .get(`/connection/groups/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(getGroupsResponse.status, 200); + const getGroupsRO = JSON.parse(getGroupsResponse.text); + + const groupId = getGroupsRO[0].group.id; + + const permissions = { + connection: { + accessLevel: AccessLevelEnum.none, + connectionId: connections.firstId, + }, + group: { + accessLevel: AccessLevelEnum.readonly, + groupId: groupId, + }, + tables: [ + { + accessLevel: { + add: false, + delete: false, + edit: true, + readonly: false, + visibility: true, + }, + tableName: firstTableInfo.testTableName, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${groupId}?connectionId=${connections.firstId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try change admin group`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups: { firstAdminGroupId }, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const permissions = { + connection: { + connectionId: connections.firstId, + accessLevel: AccessLevelEnum.edit, + }, + group: { + groupId: firstAdminGroupId, + accessLevel: AccessLevelEnum.none, + }, + tables: [ + { + tableName: firstTableInfo.testTableName, + accessLevel: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: false, + }, + }, + ], + }; + + const createOrUpdatePermissionResponse = await request( + app.getHttpServer(), + ) + .put(`/permissions/${firstAdminGroupId}`) + .send({ permissions }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const createOrUpdatePermissionRO = JSON.parse( + createOrUpdatePermissionResponse.text, + ); + t.is(createOrUpdatePermissionResponse.status, 403); + t.is(createOrUpdatePermissionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** TABLE CONTROLLER TESTS ******************************// -currentTest = 'GET /connection/tables/:slug'; - -test.serial(`${currentTest} should return all tables in connection`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 200); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.length > 0, true); - const tableIndex = getTablesInConnectionRO.findIndex( - (table: any) => table.table === testData.firstTableInfo.testTableName, - ); - t.is(getTablesInConnectionRO[tableIndex].table, testData.firstTableInfo.testTableName); - t.is(typeof getTablesInConnectionRO[tableIndex].permissions, 'object'); - const { visibility, readonly, add, delete: del, edit } = getTablesInConnectionRO[0].permissions; - t.is(visibility, tablePermissions.visibility); - t.is(readonly, tablePermissions.readonly); - t.is(del, tablePermissions.delete); - t.is(edit, tablePermissions.edit); - t.is(add, tablePermissions.add); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /connection/tables/:slug"; -test.serial(`${currentTest} should throw an exception, when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return all tables in connection`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 200); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.length > 0, true); + const tableIndex = getTablesInConnectionRO.findIndex( + (table: any) => table.table === testData.firstTableInfo.testTableName, + ); + t.is( + getTablesInConnectionRO[tableIndex].table, + testData.firstTableInfo.testTableName, + ); + t.is(typeof getTablesInConnectionRO[tableIndex].permissions, "object"); + const { + visibility, + readonly, + add, + delete: del, + edit, + } = getTablesInConnectionRO[0].permissions; + t.is(visibility, tablePermissions.visibility); + t.is(readonly, tablePermissions.readonly); + t.is(del, tablePermissions.delete); + t.is(edit, tablePermissions.edit); + t.is(add, tablePermissions.add); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when connection id passed in request is incorrect`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const getTablesInConnection = await request(app.getHttpServer()) - .get(`/connection/tables/${fakeConnectionId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesInConnection.status, 400); - const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); - t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'GET /table/rows/:slug'; + `${currentTest} should throw an exception, when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const getTablesInConnection = await request(app.getHttpServer()) + .get(`/connection/tables/${fakeConnectionId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesInConnection.status, 400); + const getTablesInConnectionRO = JSON.parse(getTablesInConnection.text); + t.is(getTablesInConnectionRO.message, Messages.CONNECTION_NOT_FOUND); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "GET /table/rows/:slug"; test.serial(`${currentTest} should return found rows from table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 200); - const getTableRowsRO = JSON.parse(getTableRows.text); - const { rows, primaryColumns, pagination, sortable_by, structure, foreignKeys } = getTableRowsRO; - t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(sortable_by.length, 0); - t.is(structure.length, 5); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 200); + const getTableRowsRO = JSON.parse(getTableRows.text); + const { + rows, + primaryColumns, + pagination, + sortable_by, + structure, + foreignKeys, + } = getTableRowsRO; + t.is(rows.length, Constants.DEFAULT_PAGINATION.perPage); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(sortable_by.length, 0); + t.is(structure.length, 5); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrec`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeId = faker.string.uuid(); - const getTableRows = await request(app.getHttpServer()) - .get(`/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTableRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTableRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrec`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeId = faker.string.uuid(); + const getTableRows = await request(app.getHttpServer()) + .get( + `/table/rows/${fakeId}?tableName=${testData.firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTableRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTableRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesRows = await request(app.getHttpServer()) - .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesRows.status, 403); - const getTablesInConnectionRO = JSON.parse(getTablesRows.text); - t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesRows = await request(app.getHttpServer()) + .get(`/table/rows/${connections.firstId}?tableName=${fakeTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesRows.status, 403); + const getTablesInConnectionRO = JSON.parse(getTablesRows.text); + t.is(getTablesInConnectionRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /table/structure/:slug'; +currentTest = "GET /table/structure/:slug"; test.serial(`${currentTest} should return table structure`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - const getTableStructureRO = JSON.parse(getTablesStructure.text); - - t.is(getTablesStructure.status, 200); - const { structure, primaryColumns, foreignKeys, readonly_fields, table_widgets } = getTableStructureRO; - t.is(structure.length, 5); - t.is(primaryColumns.length, 1); - t.is(primaryColumns[0].column_name, 'id'); - t.is(primaryColumns[0].data_type, 'integer'); - t.is(readonly_fields.length, 0); - t.is(table_widgets.length, 0); - t.is(foreignKeys.length, 0); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + const getTableStructureRO = JSON.parse(getTablesStructure.text); + + t.is(getTablesStructure.status, 200); + const { + structure, + primaryColumns, + foreignKeys, + readonly_fields, + table_widgets, + } = getTableStructureRO; + t.is(structure.length, 5); + t.is(primaryColumns.length, 1); + t.is(primaryColumns[0].column_name, "id"); + t.is(primaryColumns[0].data_type, "integer"); + t.is(readonly_fields.length, 0); + t.is(table_widgets.length, 0); + t.is(foreignKeys.length, 0); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 404); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/?tableName=${firstTableInfo.testTableName}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 404); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const fakeConnectionId = faker.string.uuid(); - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const fakeConnectionId = faker.string.uuid(); + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name not passed in request`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 400); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name not passed in request`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTablesStructure = await request(app.getHttpServer()) + .get(`/table/structure/${connections.firstId}?tableName=`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 400); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.TABLE_NAME_MISSING); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const getTablesStructure = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${fakeTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(getTablesStructure.status, 403); - const getTablesStructureRO = JSON.parse(getTablesStructure.text); - t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const getTablesStructure = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${fakeTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(getTablesStructure.status, 403); + const getTablesStructureRO = JSON.parse(getTablesStructure.text); + t.is(getTablesStructureRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'POST /table/row/:slug'; +currentTest = "POST /table/row/:slug"; test.serial(`${currentTest} should return added row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTable.status, 201); - t.is(Object.hasOwn(addRowInTableRO.row, 'id'), true); - t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); - t.is(addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], randomEmail); - t.is(Object.hasOwn(addRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(addRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(addRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(addRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(addRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(addRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTable.status, 201); + t.is(Object.hasOwn(addRowInTableRO.row, "id"), true); + t.is(addRowInTableRO.row[firstTableInfo.testTableColumnName], randomName); + t.is( + addRowInTableRO.row[firstTableInfo.testTableSecondColumnName], + randomEmail, + ); + t.is(Object.hasOwn(addRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(addRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(addRowInTableRO, "structure"), true); + t.is(Object.hasOwn(addRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(addRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(addRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .post(`/table/row/${connections.firstId}?tableName=${fakeTableName}`) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'PUT /table/row/:slug'; - -test.serial( - `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const updateRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(updateRowInTable.text); - t.is(updateRowInTable.status, 403); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "PUT /table/row/:slug"; -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .put(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .send({ - name: randomName, - email: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception do not have permission, when you do not have edit permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const updateRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=2`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(updateRowInTable.text); + t.is(updateRowInTable.status, 403); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'DELETE /table/row/:slug'; +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .put( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .send({ + name: randomName, + email: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "DELETE /table/row/:slug"; test.serial(`${currentTest} should return delete result`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteRowInTable.status, 200); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=19`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteRowInTable.status, 200); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - t.is(deleteRowInTable.status, 403); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTableRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + t.is(deleteRowInTable.status, 403); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const deleteRowInTable = await request(app.getHttpServer()) - .delete(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); - t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const deleteRowInTable = await request(app.getHttpServer()) + .delete( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=1`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteRowInTabbleRO = JSON.parse(deleteRowInTable.text); + t.is(deleteRowInTabbleRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -currentTest = 'GET /table/row/:slug'; +currentTest = "GET /table/row/:slug"; test.serial(`${currentTest} should return row`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getRowInTable.text); - t.is(getRowInTable.status, 200); - t.is(getRowInTableRO.row.id, 7); - t.is(Object.hasOwn(getRowInTableRO.row, 'created_at'), true); - t.is(Object.hasOwn(getRowInTableRO.row, 'updated_at'), true); - t.is(Object.hasOwn(getRowInTableRO, 'structure'), true); - t.is(Object.hasOwn(getRowInTableRO, 'foreignKeys'), true); - t.is(Object.hasOwn(getRowInTableRO, 'primaryColumns'), true); - t.is(Object.hasOwn(getRowInTableRO, 'readonly_fields'), true); - } catch (e) { - console.error(e); - throw e; - } + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}&id=7`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getRowInTable.text); + t.is(getRowInTable.status, 200); + t.is(getRowInTableRO.row.id, 7); + t.is(Object.hasOwn(getRowInTableRO.row, "created_at"), true); + t.is(Object.hasOwn(getRowInTableRO.row, "updated_at"), true); + t.is(Object.hasOwn(getRowInTableRO, "structure"), true); + t.is(Object.hasOwn(getRowInTableRO, "foreignKeys"), true); + t.is(Object.hasOwn(getRowInTableRO, "primaryColumns"), true); + t.is(Object.hasOwn(getRowInTableRO, "readonly_fields"), true); + } catch (e) { + console.error(e); + throw e; + } }); -test.serial(`${currentTest} should throw an exception when connection id passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeConnectionId = faker.string.uuid(); - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when connection id passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeConnectionId = faker.string.uuid(); + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${fakeConnectionId}?tableName=${firstTableInfo.testTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); -test.serial(`${currentTest} should throw an exception when table name passed in request is incorrect`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; - const addRowInTable = await request(app.getHttpServer()) - .get(`/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const addRowInTableRO = JSON.parse(addRowInTable.text); - t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should throw an exception when table name passed in request is incorrect`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const fakeTableName = `${faker.lorem.words(1)}_${faker.string.uuid()}`; + const addRowInTable = await request(app.getHttpServer()) + .get( + `/table/row/${connections.firstId}?tableName=${fakeTableName}&id=5`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const addRowInTableRO = JSON.parse(addRowInTable.text); + t.is(addRowInTableRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); //****************************** TABLE LOGS CONTROLLER TESTS ******************************// -currentTest = 'GET /logs/:slug'; - -test.serial(`${currentTest} should return all found logs in connection'`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 1); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'table_name'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'received_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'old_data'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'cognitoUserName'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'email'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationType'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'operationStatusResult'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'createdAt'), true); - t.is(Object.hasOwn(getRowInTableRO.logs[0], 'connection_id'), true); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /logs/:slug"; test.serial( - `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const randomName = faker.person.firstName(); - const randomEmail = faker.internet.email(); - const created_at = new Date(); - const updated_at = new Date(); - - const updateConnection = mockFactory.generateConnectionToTestPostgresDBInDocker(); - - const updateConnectionResponse = await request(app.getHttpServer()) - .put(`/connection/${connections.firstId}`) - .send(updateConnection) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(updateConnectionResponse.status, 200); - - const newConnectionProperties = mockFactory.generateConnectionPropertiesUserExcluded(null, false); - - const createConnectionPropertiesResponse = await request(app.getHttpServer()) - .post(`/connection/properties/${connections.firstId}`) - .send(newConnectionProperties) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createConnectionPropertiesResponse.status, 201); - - const addRowInTable = await request(app.getHttpServer()) - .post(`/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ - [firstTableInfo.testTableColumnName]: randomName, - [firstTableInfo.testTableSecondColumnName]: randomEmail, - created_at: created_at, - updated_at: updated_at, - }) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(addRowInTable.status, 201); - - const getTableLogs = await request(app.getHttpServer()) - .get(`/logs/${connections.firstId}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getRowInTableRO = JSON.parse(getTableLogs.text); - - t.is(getRowInTableRO.logs.length, 0); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should return all found logs in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 1); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "table_name"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "received_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "old_data"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "cognitoUserName"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "email"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "operationType"), true); + t.is( + Object.hasOwn(getRowInTableRO.logs[0], "operationStatusResult"), + true, + ); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "createdAt"), true); + t.is(Object.hasOwn(getRowInTableRO.logs[0], "connection_id"), true); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should not return all found logs in connection, when table audit is disabled in connection'`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const randomName = faker.person.firstName(); + const randomEmail = faker.internet.email(); + const created_at = new Date(); + const updated_at = new Date(); + + const updateConnection = + mockFactory.generateConnectionToTestPostgresDBInDocker(); + + const updateConnectionResponse = await request(app.getHttpServer()) + .put(`/connection/${connections.firstId}`) + .send(updateConnection) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(updateConnectionResponse.status, 200); + + const newConnectionProperties = + mockFactory.generateConnectionPropertiesUserExcluded(null, false); + + const createConnectionPropertiesResponse = await request( + app.getHttpServer(), + ) + .post(`/connection/properties/${connections.firstId}`) + .send(newConnectionProperties) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createConnectionPropertiesResponse.status, 201); + + const addRowInTable = await request(app.getHttpServer()) + .post( + `/table/row/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ + [firstTableInfo.testTableColumnName]: randomName, + [firstTableInfo.testTableSecondColumnName]: randomEmail, + created_at: created_at, + updated_at: updated_at, + }) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(addRowInTable.status, 201); + + const getTableLogs = await request(app.getHttpServer()) + .get(`/logs/${connections.firstId}`) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getRowInTableRO = JSON.parse(getTableLogs.text); + + t.is(getRowInTableRO.logs.length, 0); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE SETTINGS CONTROLLER TESTS ******************************// -currentTest = 'GET /settings/'; - -test.serial( - `${currentTest} should exception ${Messages.DONT_HAVE_PERMISSIONS} when table settings was not created`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -test.serial(`${currentTest} 'should should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /settings/"; test.serial( - `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(createTableSettingsResponse.status, 201); - - const getTableSettings = await request(app.getHttpServer()) - .get(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableSettingsRO = JSON.parse(getTableSettings.text); - t.is(getTableSettings.status, 403); - t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'POST /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - 'users', - ['id'], - ['email'], - ['name'], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - t.is(JSON.parse(createTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should exception ${Messages.DONT_HAVE_PERMISSIONS} when table settings was not created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`) - .send(createTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 403); - - const createTableSettingsRO = JSON.parse(createTableSettingsResponse.text); - t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'PUT /settings/'; - -test.serial(`${currentTest} should throw an exception do not have permission`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} 'should should throw exception ${Messages.DONT_HAVE_PERMISSIONS}`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const updateTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - [firstTableInfo.testTableSecondColumnName], - ['id'], - [firstTableInfo.testTableColumnName], - 50, - QueryOrderingEnum.ASC, - 'created_at', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const updateTableSettingsResponse = await request(app.getHttpServer()) - .put(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`) - .send(updateTableSettingsDTO) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(updateTableSettingsResponse.status, 403); - t.is(JSON.parse(updateTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'DELETE /settings/'; - -test.serial(`${currentTest} should return array without deleted table settings`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.firstId, - firstTableInfo.testTableName, - ['id'], - [firstTableInfo.testTableSecondColumnName], - [firstTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - - t.is(deleteTableSettingsResponse.status, 403); - t.is(JSON.parse(deleteTableSettingsResponse.text).message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should throw an exception when you try get settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(createTableSettingsResponse.status, 201); + + const getTableSettings = await request(app.getHttpServer()) + .get( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableSettingsRO = JSON.parse(getTableSettings.text); + t.is(getTableSettings.status, 403); + t.is(getTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "POST /settings/"; + +test.serial( + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + "users", + ["id"], + ["email"], + ["name"], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + t.is( + JSON.parse(createTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try create settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 403); + + const createTableSettingsRO = JSON.parse( + createTableSettingsResponse.text, + ); + t.is(createTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "PUT /settings/"; test.serial( - `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const createTableSettingsDTO = mockFactory.generateTableSettings( - connections.secondId, - secondTableInfo.testTableName, - ['id'], - [secondTableInfo.testTableSecondColumnName], - [secondTableInfo.testTableColumnName], - 3, - QueryOrderingEnum.DESC, - 'id', - ['updated_at'], - ['created_at'], - undefined, - undefined, - undefined, - ); - - const createTableSettingsResponse = await request(app.getHttpServer()) - .post(`/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .send(createTableSettingsDTO) - .set('Cookie', adminUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - t.is(createTableSettingsResponse.status, 201); - - const deleteTableSettingsResponse = await request(app.getHttpServer()) - .delete(`/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const deleteTableSettingsRO = JSON.parse(deleteTableSettingsResponse.text); - t.is(deleteTableSettingsResponse.status, 403); - t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try update settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const updateTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + [firstTableInfo.testTableSecondColumnName], + ["id"], + [firstTableInfo.testTableColumnName], + 50, + QueryOrderingEnum.ASC, + "created_at", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const updateTableSettingsResponse = await request(app.getHttpServer()) + .put( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}}}`, + ) + .send(updateTableSettingsDTO) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(updateTableSettingsResponse.status, 403); + t.is( + JSON.parse(updateTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "DELETE /settings/"; + +test.serial( + `${currentTest} should return array without deleted table settings`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.firstId, + firstTableInfo.testTableName, + ["id"], + [firstTableInfo.testTableSecondColumnName], + [firstTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.firstId}&tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + + t.is(deleteTableSettingsResponse.status, 403); + t.is( + JSON.parse(deleteTableSettingsResponse.text).message, + Messages.DONT_HAVE_PERMISSIONS, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception when you try delete settings in connection where you do not have permission`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const createTableSettingsDTO = mockFactory.generateTableSettings( + connections.secondId, + secondTableInfo.testTableName, + ["id"], + [secondTableInfo.testTableSecondColumnName], + [secondTableInfo.testTableColumnName], + 3, + QueryOrderingEnum.DESC, + "id", + ["updated_at"], + ["created_at"], + undefined, + undefined, + undefined, + ); + + const createTableSettingsResponse = await request(app.getHttpServer()) + .post( + `/settings?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .send(createTableSettingsDTO) + .set("Cookie", adminUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + t.is(createTableSettingsResponse.status, 201); + + const deleteTableSettingsResponse = await request(app.getHttpServer()) + .delete( + `/settings/?connectionId=${connections.secondId}&tableName=${secondTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const deleteTableSettingsRO = JSON.parse( + deleteTableSettingsResponse.text, + ); + t.is(deleteTableSettingsResponse.status, 403); + t.is(deleteTableSettingsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); //****************************** TABLE WIDGETS CONTROLLER TESTS ******************************// -currentTest = 'GET /widgets/:slug'; - -test.serial(`${currentTest} should return empty widgets array when widgets not created`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Cookie', simpleUserToken) - .set('Content-Type', 'application/json') - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 403); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); +currentTest = "GET /widgets/:slug"; -test.serial(`${currentTest} should return array of table widgets for table`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); - t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); - t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableWidgets.status, 403); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - - const getTableStructureResponse = await request(app.getHttpServer()) - .get(`/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - t.is(getTableStructureResponse.status, 200); - const getTableStructureRO = JSON.parse(getTableStructureResponse.text); - t.is(Object.hasOwn(getTableStructureRO, 'table_widgets'), true); - t.is(getTableStructureRO.table_widgets.length, 2); - t.is(getTableStructureRO.table_widgets[0].field_name, newTableWidgets[0].field_name); - t.is(getTableStructureRO.table_widgets[1].widget_type, newTableWidgets[1].widget_type); - t.is(compareTableWidgetsArrays(getTableStructureRO.table_widgets, newTableWidgets), true); - } catch (e) { - console.error(e); - throw e; - } -}); +test.serial( + `${currentTest} should return empty widgets array when widgets not created`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Cookie", simpleUserToken) + .set("Content-Type", "application/json") + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 403); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', adminUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 201); - t.is(typeof createTableWidgetRO, 'object'); - t.is(createTableWidgetRO.length, 2); - - const getTableWidgets = await request(app.getHttpServer()) - .get(`/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const getTableWidgetsRO = JSON.parse(getTableWidgets.text); - t.is(getTableWidgets.status, 403); - t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, -); - -currentTest = 'POST /widget/:slug'; - -test.serial(`${currentTest} should throw an exception do not have permissions`, async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } -}); + `${currentTest} should return array of table widgets for table`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + t.is(createTableWidgetRO[0].widget_type, newTableWidgets[0].widget_type); + t.is(createTableWidgetRO[1].field_name, newTableWidgets[1].field_name); + t.is(createTableWidgetRO[0].name, newTableWidgets[0].name); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableWidgets.status, 403); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + + const getTableStructureResponse = await request(app.getHttpServer()) + .get( + `/table/structure/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + t.is(getTableStructureResponse.status, 200); + const getTableStructureRO = JSON.parse(getTableStructureResponse.text); + t.is(Object.hasOwn(getTableStructureRO, "table_widgets"), true); + t.is(getTableStructureRO.table_widgets.length, 2); + t.is( + getTableStructureRO.table_widgets[0].field_name, + newTableWidgets[0].field_name, + ); + t.is( + getTableStructureRO.table_widgets[1].widget_type, + newTableWidgets[1].widget_type, + ); + t.is( + compareTableWidgetsArrays( + getTableStructureRO.table_widgets, + newTableWidgets, + ), + true, + ); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +test.serial( + `${currentTest} should throw an exception, when you try to get widgets from connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", adminUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 201); + t.is(typeof createTableWidgetRO, "object"); + t.is(createTableWidgetRO.length, 2); + + const getTableWidgets = await request(app.getHttpServer()) + .get( + `/widgets/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const getTableWidgetsRO = JSON.parse(getTableWidgets.text); + t.is(getTableWidgets.status, 403); + t.is(getTableWidgetsRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); + +currentTest = "POST /widget/:slug"; + +test.serial( + `${currentTest} should throw an exception do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.firstId}?tableName=${firstTableInfo.testTableName}}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, +); test.serial( - `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, - async (t) => { - try { - const testData = await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions(app); - const { - connections, - firstTableInfo, - groups, - permissions, - secondTableInfo, - users: { adminUserToken, simpleUserToken }, - } = testData; - const newTableWidgets = mockFactory.generateCreateWidgetDTOsArrayForUsersTable( - 'id', - firstTableInfo.testTableColumnName, - ); - - const createTableWidgetResponse = await request(app.getHttpServer()) - .post(`/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`) - .send({ widgets: newTableWidgets }) - .set('Content-Type', 'application/json') - .set('Cookie', simpleUserToken) - .set('Accept', 'application/json'); - const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); - t.is(createTableWidgetResponse.status, 403); - t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); - } catch (e) { - console.error(e); - throw e; - } - }, + `${currentTest} should throw an exception, when you try add widget in connection, when you do not have permissions`, + async (t) => { + try { + const testData = + await createConnectionsAndInviteNewUserInNewGroupWithOnlyTablePermissions( + app, + ); + const { + connections, + firstTableInfo, + groups, + permissions, + secondTableInfo, + users: { adminUserToken, simpleUserToken }, + } = testData; + const newTableWidgets = + mockFactory.generateCreateWidgetDTOsArrayForUsersTable( + "id", + firstTableInfo.testTableColumnName, + ); + + const createTableWidgetResponse = await request(app.getHttpServer()) + .post( + `/widget/${connections.secondId}?tableName=${secondTableInfo.testTableName}`, + ) + .send({ widgets: newTableWidgets }) + .set("Content-Type", "application/json") + .set("Cookie", simpleUserToken) + .set("Accept", "application/json"); + const createTableWidgetRO = JSON.parse(createTableWidgetResponse.text); + t.is(createTableWidgetResponse.status, 403); + t.is(createTableWidgetRO.message, Messages.DONT_HAVE_PERMISSIONS); + } catch (e) { + console.error(e); + throw e; + } + }, ); diff --git a/biome.json b/biome.json index 591deb971..dd192f297 100644 --- a/biome.json +++ b/biome.json @@ -18,7 +18,7 @@ "rules": { "recommended": false, "a11y": { - "noAccessKey": "error", + "noAccessKey": "error", "noAriaHiddenOnFocusable": "error", "noAriaUnsupportedElements": "error", "noAutofocus": "error", @@ -45,17 +45,17 @@ "useIframeTitle": "error", "useKeyWithClickEvents": "error", "useKeyWithMouseEvents": "error", - "useMediaCaption": "error", - "useSemanticElements": "error", - "useValidAnchor": "error", - "useValidAriaProps": "error", - "useValidAriaRole": "error", - "useValidAriaValues": "error", - "useValidAutocomplete": "error", - "useValidLang": "error" + "useMediaCaption": "error", + "useSemanticElements": "error", + "useValidAnchor": "error", + "useValidAriaProps": "error", + "useValidAriaRole": "error", + "useValidAriaValues": "error", + "useValidAutocomplete": "error", + "useValidLang": "error" }, "complexity": { - "noAdjacentSpacesInRegex": "error", + "noAdjacentSpacesInRegex": "error", "noArguments": "error", "noBannedTypes": "on", "noCommaOperator": "on", @@ -91,7 +91,7 @@ "useSimpleNumberKeys": "error" }, "correctness": { - "noConstAssign": "error", + "noConstAssign": "error", "noConstantCondition": "error", "noConstantMathMinMaxClamp": "error", "noConstructorReturn": "error", @@ -126,7 +126,7 @@ "useYield": "error" }, "performance": { - "noAccumulatingSpread": "error", + "noAccumulatingSpread": "error", "noDynamicNamespaceImportAccess": "error" }, "security": { @@ -134,7 +134,7 @@ "noGlobalEval": "error" }, "suspicious": { - "noApproximativeNumericConstant": "error", + "noApproximativeNumericConstant": "error", "noAssignInExpressions": "off", "noAsyncPromiseExecutor": "off", "noCatchAssign": "error", @@ -161,41 +161,40 @@ "noFunctionAssign": "error", "noGlobalAssign": "error", "noGlobalIsFinite": "error", - "noGlobalIsNan": "on", - "noHeadImportInDocument": "error", - "noImplicitAnyLet": "off", - "noImportAssign": "error", - "noIrregularWhitespace": "error", - "noLabelVar": "error", - "noMisleadingCharacterClass": "error", - "noMisleadingInstantiator": "error", - "noMisrefactoredShorthandAssign": "error", - "noNonNullAssertedOptionalChain": "error", - "noOctalEscape": "error", - "noPrototypeBuiltins": "on", - "noRedeclare": "error", - "noRedundantUseStrict": "error", - "noSelfCompare": "error", - "noShadowRestrictedNames": "error", - "noSparseArray": "error", - "noSuspiciousSemicolonInJsx": "error", - "noTemplateCurlyInString": "error", - "noThenProperty": "error", - "noTsIgnore": "on", - "noUnsafeDeclarationMerging": "error", - "noUnsafeNegation": "error", - "noUselessEscapeInString": "error", - "noUselessRegexBackrefs": "error", - "noWith": "error", - "useAdjacentOverloadSignatures": "error", - "useAwait": "on", - "useDefaultSwitchClauseLast": "error", - "useGetterReturn": "error", - "useGoogleFontDisplay": "error", - "useIsArray": "error", - "useIterableCallbackReturn": "off", - "useNamespaceKeyword": "error" - + "noGlobalIsNan": "on", + "noHeadImportInDocument": "error", + "noImplicitAnyLet": "off", + "noImportAssign": "error", + "noIrregularWhitespace": "error", + "noLabelVar": "error", + "noMisleadingCharacterClass": "error", + "noMisleadingInstantiator": "error", + "noMisrefactoredShorthandAssign": "error", + "noNonNullAssertedOptionalChain": "error", + "noOctalEscape": "error", + "noPrototypeBuiltins": "on", + "noRedeclare": "error", + "noRedundantUseStrict": "error", + "noSelfCompare": "error", + "noShadowRestrictedNames": "error", + "noSparseArray": "error", + "noSuspiciousSemicolonInJsx": "error", + "noTemplateCurlyInString": "error", + "noThenProperty": "error", + "noTsIgnore": "on", + "noUnsafeDeclarationMerging": "error", + "noUnsafeNegation": "error", + "noUselessEscapeInString": "error", + "noUselessRegexBackrefs": "error", + "noWith": "error", + "useAdjacentOverloadSignatures": "error", + "useAwait": "on", + "useDefaultSwitchClauseLast": "error", + "useGetterReturn": "error", + "useGoogleFontDisplay": "error", + "useIsArray": "error", + "useIterableCallbackReturn": "off", + "useNamespaceKeyword": "error" } } }, @@ -208,9 +207,9 @@ } }, "html": { - "parser": { - "interpolation": true - } + "parser": { + "interpolation": true + } }, "assist": { "enabled": true, diff --git a/docker-compose.tst.yml b/docker-compose.tst.yml index 661df4791..92753e203 100644 --- a/docker-compose.tst.yml +++ b/docker-compose.tst.yml @@ -1,38 +1,5 @@ services: backend: - build: - context: . - ports: - - 3000:3000 - env_file: ./backend/.development.env - environment: - DATABASE_URL: "postgres://postgres:abc123@postgres:5432/postgres" - volumes: - - ./backend/src/migrations:/app/src/migrations - depends_on: - - postgres - - testMySQL-e2e-testing - - testPg-e2e-testing - - mssql-e2e-testing - - test-oracle-e2e-testing - - test-ibm-db2-e2e-testing - - test-dynamodb-e2e-testing - - test-redis-e2e-testing - - test-cassandra-e2e-testing - - test-clickhouse-e2e-testing - links: - - postgres - - testMySQL-e2e-testing - - testPg-e2e-testing - - mssql-e2e-testing - - test-oracle-e2e-testing - - test-ibm-db2-e2e-testing - - test-dynamodb-e2e-testing - - test-redis-e2e-testing - - test-cassandra-e2e-testing - - test-clickhouse-e2e-testing - command: ["yarn", "start"] - backend_test: build: context: . env_file: ./backend/.development.env diff --git a/frontend/src/app/components/dashboard/dashboard.component.spec.ts b/frontend/src/app/components/dashboard/dashboard.component.spec.ts index eeb620509..576363bad 100644 --- a/frontend/src/app/components/dashboard/dashboard.component.spec.ts +++ b/frontend/src/app/components/dashboard/dashboard.component.spec.ts @@ -1,128 +1,125 @@ -import { ActivatedRoute, Router, convertToParamMap, provideRouter } from '@angular/router'; -import { Angulartics2, Angulartics2Module } from 'angulartics2'; +import { provideHttpClient } from '@angular/common/http'; import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AccessLevel } from 'src/app/models/user'; -import { ConnectionsService } from 'src/app/services/connections.service'; -import { DashboardComponent } from './dashboard.component'; import { MatDialogModule } from '@angular/material/dialog'; import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { TablesService } from 'src/app/services/tables.service'; +import { ActivatedRoute, convertToParamMap, provideRouter, Router } from '@angular/router'; +import { Angulartics2, Angulartics2Module } from 'angulartics2'; import { of } from 'rxjs'; -import { provideHttpClient } from '@angular/common/http'; +import { AccessLevel } from 'src/app/models/user'; +import { ConnectionsService } from 'src/app/services/connections.service'; +import { TablesService } from 'src/app/services/tables.service'; +import { DashboardComponent } from './dashboard.component'; describe('DashboardComponent', () => { - let component: DashboardComponent; - let fixture: ComponentFixture; - let fakeTablesService; - - const fakeConnectionsSevice = { - get currentConnectionID(): string { - return '' - }, - get currentConnectionAccessLevel(): AccessLevel { - return AccessLevel.None; - }, - getTablesFolders: () => of([]) - }; - const fakeRouter = jasmine.createSpyObj('Router', {navigate: Promise.resolve('')}); + let component: DashboardComponent; + let fixture: ComponentFixture; + let fakeTablesService; - const fakeTables = [ - { - "table": "actor", - "permissions": { - "visibility": true, - "readonly": false, - "add": true, - "delete": true, - "edit": true - } - }, - { - "table": "city", - "permissions": { - "visibility": true, - "readonly": false, - "add": true, - "delete": true, - "edit": true - } - }, - { - "table": "film", - "permissions": { - "visibility": true, - "readonly": false, - "add": true, - "delete": true, - "edit": true - } - } - ] + const fakeConnectionsSevice = { + get currentConnectionID(): string { + return ''; + }, + get currentConnectionAccessLevel(): AccessLevel { + return AccessLevel.None; + }, + getTablesFolders: () => of([]), + }; + const fakeRouter = jasmine.createSpyObj('Router', { navigate: Promise.resolve('') }); - beforeEach(async () => { + const fakeTables = [ + { + table: 'actor', + permissions: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: true, + }, + }, + { + table: 'city', + permissions: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: true, + }, + }, + { + table: 'film', + permissions: { + visibility: true, + readonly: false, + add: true, + delete: true, + edit: true, + }, + }, + ]; - // const paramMapSubject = new BehaviorSubject(convertToParamMap({ - // 'table-name': undefined - // })); + beforeEach(async () => { + // const paramMapSubject = new BehaviorSubject(convertToParamMap({ + // 'table-name': undefined + // })); - const angulartics2Mock = { - eventTrack: { - next: () => {} // Mocking the next method - }, - trackLocation: () => {} // Mocking the trackLocation method - }; + const angulartics2Mock = { + eventTrack: { + next: () => {}, // Mocking the next method + }, + trackLocation: () => {}, // Mocking the trackLocation method + }; - fakeTablesService = jasmine.createSpyObj('tablesService', {fetchTables: of(fakeTables)}); + fakeTablesService = jasmine.createSpyObj('tablesService', { fetchTables: of(fakeTables) }); - await TestBed.configureTestingModule({ - imports: [ - MatSnackBarModule, - MatDialogModule, - Angulartics2Module.forRoot(), - DashboardComponent - ], - providers: [ - provideHttpClient(), - provideRouter([]), - { - provide: ConnectionsService, - useValue: fakeConnectionsSevice - }, - { - provide: TablesService, - useValue: fakeTablesService - }, - { provide: ActivatedRoute, - useValue: { paramMap: of(convertToParamMap({ - 'table-name': undefined - })), - } - }, - { provide: Router, useValue: fakeRouter }, - { provide: Angulartics2, useValue: angulartics2Mock } - ] - }) - }); + await TestBed.configureTestingModule({ + imports: [MatSnackBarModule, MatDialogModule, Angulartics2Module.forRoot(), DashboardComponent], + providers: [ + provideHttpClient(), + provideRouter([]), + { + provide: ConnectionsService, + useValue: fakeConnectionsSevice, + }, + { + provide: TablesService, + useValue: fakeTablesService, + }, + { + provide: ActivatedRoute, + useValue: { + paramMap: of( + convertToParamMap({ + 'table-name': undefined, + }), + ), + }, + }, + { provide: Router, useValue: fakeRouter }, + { provide: Angulartics2, useValue: angulartics2Mock }, + ], + }); + }); - beforeEach(() => { - fixture = TestBed.createComponent(DashboardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(DashboardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); - it('should get access level of current connection', () => { - spyOnProperty(fakeConnectionsSevice, 'currentConnectionAccessLevel', 'get').and.returnValue(AccessLevel.Readonly); - expect(component.currentConnectionAccessLevel).toEqual('readonly'); - }); + it('should get access level of current connection', () => { + spyOnProperty(fakeConnectionsSevice, 'currentConnectionAccessLevel', 'get').and.returnValue(AccessLevel.Readonly); + expect(component.currentConnectionAccessLevel).toEqual('readonly'); + }); - it('should call getTables', async () => { - fakeTablesService.fetchTables.and.returnValue(of(fakeTables)); - const tables = await component.getTables(); - expect(tables).toEqual(fakeTables); - }); + it('should call getTables', async () => { + fakeTablesService.fetchTables.and.returnValue(of(fakeTables)); + const tables = await component.getTables(); + expect(tables).toEqual(fakeTables); + }); }); diff --git a/frontend/src/app/components/dashboard/dashboard.component.ts b/frontend/src/app/components/dashboard/dashboard.component.ts index 376717b06..d6b7551c6 100644 --- a/frontend/src/app/components/dashboard/dashboard.component.ts +++ b/frontend/src/app/components/dashboard/dashboard.component.ts @@ -1,457 +1,463 @@ -import { ActivatedRoute, ParamMap, Router } from '@angular/router'; -import { Angulartics2, Angulartics2Module } from 'angulartics2'; -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ConnectionSettingsUI, UiSettings } from 'src/app/models/ui-settings'; -import { CustomEvent, TableProperties } from 'src/app/models/table'; -import { TableCategory } from 'src/app/models/connection'; -import { Folder } from './db-table-view/db-table-view.component'; -import { first, map } from 'rxjs/operators'; - -import { AlertComponent } from '../ui-components/alert/alert.component'; -import { BannerComponent } from '../ui-components/banner/banner.component'; -import { BbBulkActionConfirmationDialogComponent } from './db-table-view/db-bulk-action-confirmation-dialog/db-bulk-action-confirmation-dialog.component'; +import { SelectionModel } from '@angular/cdk/collections'; import { CommonModule } from '@angular/common'; -import { CompanyService } from 'src/app/services/company.service'; -import { ConnectionsService } from 'src/app/services/connections.service'; -import { ContentLoaderComponent } from '../ui-components/content-loader/content-loader.component'; -import { DbActionLinkDialogComponent } from './db-table-view/db-action-link-dialog/db-action-link-dialog.component'; -import { DbTableAiPanelComponent } from './db-table-view/db-table-ai-panel/db-table-ai-panel.component'; -import { DbTableFiltersDialogComponent } from './db-table-view/db-table-filters-dialog/db-table-filters-dialog.component'; -import { DbTableRowViewComponent } from './db-table-view/db-table-row-view/db-table-row-view.component'; -import { DbTableViewComponent } from './db-table-view/db-table-view.component'; -import { DbTablesListComponent } from './db-tables-list/db-tables-list.component'; import { HttpErrorResponse } from '@angular/common/http'; -import JsonURL from "@jsonurl/jsonurl"; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; -import { MatDialog } from '@angular/material/dialog'; -import { MatDialogModule } from '@angular/material/dialog'; +import { MatDialog, MatDialogModule } from '@angular/material/dialog'; import { MatIconModule } from '@angular/material/icon'; import { MatSidenavModule } from '@angular/material/sidenav'; -import { PlaceholderTableViewComponent } from '../skeletons/placeholder-table-view/placeholder-table-view.component'; -import { RouterModule } from '@angular/router'; -import { SelectionModel } from '@angular/cdk/collections'; +import { Title } from '@angular/platform-browser'; +import { ActivatedRoute, ParamMap, Router, RouterModule } from '@angular/router'; +import JsonURL from '@jsonurl/jsonurl'; +import { Angulartics2, Angulartics2Module } from 'angulartics2'; +import { omitBy } from 'lodash'; +import { first, map } from 'rxjs/operators'; +import { getComparatorsFromUrl } from 'src/app/lib/parse-filter-params'; import { ServerError } from 'src/app/models/alert'; +import { TableCategory } from 'src/app/models/connection'; +import { CustomEvent, TableProperties } from 'src/app/models/table'; +import { ConnectionSettingsUI, UiSettings } from 'src/app/models/ui-settings'; +import { User } from 'src/app/models/user'; +import { CompanyService } from 'src/app/services/company.service'; +import { ConnectionsService } from 'src/app/services/connections.service'; import { TableRowService } from 'src/app/services/table-row.service'; import { TableStateService } from 'src/app/services/table-state.service'; -import { TablesDataSource } from './db-tables-data-source'; import { TablesService } from 'src/app/services/tables.service'; -import { Title } from '@angular/platform-browser'; import { UiSettingsService } from 'src/app/services/ui-settings.service'; -import { User } from 'src/app/models/user'; import { environment } from 'src/environments/environment'; -import { getComparatorsFromUrl } from 'src/app/lib/parse-filter-params'; -import { normalizeTableName } from '../../lib/normalize' -import { omitBy } from "lodash"; +import { normalizeTableName } from '../../lib/normalize'; +import { PlaceholderTableViewComponent } from '../skeletons/placeholder-table-view/placeholder-table-view.component'; +import { AlertComponent } from '../ui-components/alert/alert.component'; +import { BannerComponent } from '../ui-components/banner/banner.component'; +import { ContentLoaderComponent } from '../ui-components/content-loader/content-loader.component'; +import { DbActionLinkDialogComponent } from './db-table-view/db-action-link-dialog/db-action-link-dialog.component'; +import { BbBulkActionConfirmationDialogComponent } from './db-table-view/db-bulk-action-confirmation-dialog/db-bulk-action-confirmation-dialog.component'; +import { DbTableAiPanelComponent } from './db-table-view/db-table-ai-panel/db-table-ai-panel.component'; +import { DbTableFiltersDialogComponent } from './db-table-view/db-table-filters-dialog/db-table-filters-dialog.component'; +import { DbTableRowViewComponent } from './db-table-view/db-table-row-view/db-table-row-view.component'; +import { DbTableViewComponent, Folder } from './db-table-view/db-table-view.component'; +import { TablesDataSource } from './db-tables-data-source'; +import { DbTablesListComponent } from './db-tables-list/db-tables-list.component'; interface DataToActivateActions { - action: CustomEvent, - primaryKeys: object[], - identityFieldValues: string[] + action: CustomEvent; + primaryKeys: object[]; + identityFieldValues: string[]; } @Component({ - selector: 'app-dashboard', - templateUrl: './dashboard.component.html', - styleUrls: ['./dashboard.component.css'], - imports: [ - CommonModule, - MatButtonModule, - MatIconModule, - MatDialogModule, - MatSidenavModule, - DbTablesListComponent, - DbTableViewComponent, - DbTableAiPanelComponent, - DbTableRowViewComponent, - AlertComponent, - ContentLoaderComponent, - PlaceholderTableViewComponent, - BannerComponent, - RouterModule, - Angulartics2Module - ] + selector: 'app-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.css'], + imports: [ + CommonModule, + MatButtonModule, + MatIconModule, + MatDialogModule, + MatSidenavModule, + DbTablesListComponent, + DbTableViewComponent, + DbTableAiPanelComponent, + DbTableRowViewComponent, + AlertComponent, + ContentLoaderComponent, + PlaceholderTableViewComponent, + BannerComponent, + RouterModule, + Angulartics2Module, + ], }) export class DashboardComponent implements OnInit, OnDestroy { - - public isSaas = (environment as any).saas; - public user: User = null; - public tablesList: TableProperties[] = null; - public selectedTableName: string; - public selectedTableDisplayName: string; - public currentPage: number = 1; - public shownTableTitles: boolean = true; - public connectionID: string; - // public isTestConnection: boolean = false; - public filters: object = {}; - public comparators: object; - public pageIndex: number; - public pageSize: number; - public sortColumn: string; - public sortOrder: 'ASC' | 'DESC'; - - public loading: boolean = true; - public isServerError: boolean = false; - public serverError: ServerError; - - public noTablesError: boolean = false; - - public dataSource: TablesDataSource = null; - - public selection = new SelectionModel(true, []); - - public selectedRow = null; - public isAIpanelOpened: boolean = false; - - public uiSettings: ConnectionSettingsUI; - public tableFolders: Folder[] = []; - - constructor( - private _connections: ConnectionsService, - private _tables: TablesService, - private _tableRow: TableRowService, - private _uiSettings: UiSettingsService, - private _tableState: TableStateService, - private _company: CompanyService, - public router: Router, - private route: ActivatedRoute, - public dialog: MatDialog, - private title: Title, - private angulartics2: Angulartics2, - ) {} - - get currentConnectionAccessLevel () { - return this._connections.currentConnectionAccessLevel - } - - get currentConnectionIsTest () { - return this._connections.currentConnection.isTestConnection - } - - get connectionTitle() { - return this._connections.currentConnection?.title || 'Database'; - } - - get defaultTableToOpen () { - return this._connections.defaultTableToOpen; - } - - ngOnInit() { - this.connectionID = this._connections.currentConnectionID; - // this.isTestConnection = this._connections.currentConnection.isTestConnection; - this.dataSource = new TablesDataSource(this._tables, this._connections, this._uiSettings, this._tableRow); - - this._tableState.cast.subscribe(row => { - this.selectedRow = row; - }); - - this._tableState.aiPanelCast.subscribe(isAIpanelOpened => { - this.isAIpanelOpened = isAIpanelOpened; - }); - - this._uiSettings.getUiSettings() - .subscribe ((settings: UiSettings) => { - this.uiSettings = settings?.connections[this.connectionID]; - this.shownTableTitles = settings?.connections[this.connectionID]?.shownTableTitles ?? true; - - this.getData(); - console.log('getData from ngOnInit'); - }); - - this.loadTableFolders(); - } - - ngOnDestroy() { - this._tableState.clearSelection(); - } - - async getData() { - console.log('getData'); - let tables; - try { - tables = await this.getTables(); - } catch(err) { - this.loading = false; - this.isServerError = true; - this.title.setTitle(`Dashboard | ${this._company.companyTabTitle || 'Rocketadmin'}`); - - if (err instanceof HttpErrorResponse) { - this.serverError = {abstract: err.error.message || err.message, details: err.error.originalMessage}; - } else { throw err }; - } - - if (tables && tables.length === 0) { - this.noTablesError = true; - this.loading = false; - this.title.setTitle(`No tables | ${this._company.companyTabTitle || 'Rocketadmin'}`); - } else if (tables) { - this.formatTableNames(tables); - this.route.paramMap - .pipe( - map((params: ParamMap) => { - let tableName = params.get('table-name'); - if (tableName) { - this.selectedTableName = tableName; - this.setTable(tableName); - console.log('setTable from getData paramMap'); - this.title.setTitle(`${this.selectedTableDisplayName} table | ${this._company.companyTabTitle || 'Rocketadmin'}`); - this.selection.clear(); - } else { - if (this.defaultTableToOpen) { - tableName = this.defaultTableToOpen - } else { - tableName = this.tablesList[0].table; - }; - this.router.navigate([`/dashboard/${this.connectionID}/${tableName}`], {replaceUrl: true}); - this.selectedTableName = tableName; - }; - }) - ).subscribe(); - this._tableRow.cast.subscribe((arg) => { - if (arg === 'delete row' && this.selectedTableName) { - this.setTable(this.selectedTableName); - console.log('setTable from getData _tableRow cast'); - this.selection.clear(); - }; - }); - this._tables.cast.subscribe((arg) => { - if ((arg === 'delete rows' || arg === 'import') && this.selectedTableName) { - this.setTable(this.selectedTableName); - console.log('setTable from getData _tables cast'); - this.selection.clear(); - }; - if (arg === 'activate actions') { - this.selection.clear(); - } - }); - } - } - - getTables() { - console.log('getTables'); - return this._tables.fetchTables(this.connectionID).toPromise(); - } - - formatTableNames(tables: TableProperties[]) { - this.tablesList = tables.map((tableItem: TableProperties) => { - let normalizedTableName; - if (tableItem.display_name) { - normalizedTableName = tableItem.display_name; - } else { - normalizedTableName = normalizeTableName(tableItem.table); - }; - const words = normalizedTableName.split(' '); - const initials = words.reduce((result, word) => { - if (word.length > 0) { - return result + word[0].toUpperCase(); - } - return result; - }, ''); - - return {...tableItem, normalizedTableName, initials: initials.slice(0, 2)} - }) - } - - setTable(tableName: string) { - this.selectedTableName = tableName; - const queryParams = this.route.snapshot.queryParams; - this.filters = JsonURL.parse(queryParams.filters); - this.comparators = getComparatorsFromUrl(this.filters); - this.pageIndex = parseInt(queryParams.page_index, 10) || 0; - this.pageSize = parseInt(queryParams.page_size, 10) || 30; - this.sortColumn = queryParams.sort_active; - this.sortOrder = queryParams.sort_direction; - - const search = queryParams.search; - this.getRows(search); - console.log('getRows from setTable'); - - const selectedTableProperties = this.tablesList.find( (table: any) => table.table === this.selectedTableName); - if (selectedTableProperties) { - this.selectedTableDisplayName = selectedTableProperties.display_name || normalizeTableName(selectedTableProperties.table); - } else { - return; - } - this.loading = false; - } - - openTableFilters(structure) { - let filterDialodRef = this.dialog.open(DbTableFiltersDialogComponent, { - width: '56em', - data: { - connectionID: this.connectionID, - tableName: this.selectedTableName, - displayTableName: this.selectedTableDisplayName, - structure - } - }); - - filterDialodRef.afterClosed().subscribe(action => { - if (action === 'filter') { - const filtersFromDialog = {...filterDialodRef.componentInstance.tableRowFieldsShown}; - - console.log('Filters from dialog:', filtersFromDialog); - - const nonEmptyFilters = omitBy(filtersFromDialog, (value) => value === undefined); - this.comparators = filterDialodRef.componentInstance.tableRowFieldsComparator; - - if (Object.keys(nonEmptyFilters).length) { - this.filters = {}; - for (const key in nonEmptyFilters) { - if (this.comparators[key] !== undefined) { - this.filters[key] = { - [this.comparators[key]]: nonEmptyFilters[key] - }; - } - } - - console.log('Filters to apply:', this.filters); - - const filters = JsonURL.stringify( this.filters ); - - console.log('Filters to navigate:', filters); - - this.router.navigate([`/dashboard/${this.connectionID}/${this.selectedTableName}`], { - queryParams: { - filters, - page_index: 0, - page_size: this.pageSize - } - }); - this.getRows(); - console.log('getRows from afterClosed'); - - - this.angulartics2.eventTrack.next({ - action: 'Dashboard: filter is applied', - }); - } - } else if (action === 'reset') { - this.filters = {}; - this.getRows(); - console.log('getRows from reset filters afterClosed'); - this.router.navigate([`/dashboard/${this.connectionID}/${this.selectedTableName}`]); - } - }) - } - - removeFilter(columnName: string) { - this.filters[columnName] = undefined; - this.filters = omitBy(this.filters, (value) => value === undefined); - - const filters = JsonURL.stringify( this.filters ); - - this.selection.clear(); - - this.getRows(); - console.log('getRows from removeFilter'); - this.router.navigate([`/dashboard/${this.connectionID}/${this.selectedTableName}`], { - queryParams: { - filters, - page_index: 0, - page_size: this.pageSize - } - }); - } - - clearAllFilters() { - this.filters = {}; - this.comparators = {}; - this.getRows(); - console.log('getRows from clearAllFilters'); - this.router.navigate([`/dashboard/${this.connectionID}/${this.selectedTableName}`], { - queryParams: { - page_index: 0, - page_size: this.pageSize - } - }); - } - - search(value: string) { - this.getRows(value); - console.log('getRows from search'); - this.filters = {}; - this.router.navigate([`/dashboard/${this.connectionID}/${this.selectedTableName}`], { - queryParams: { - page_index: 0, - page_size: this.pageSize, - search: value - } - }); - } - - getRows(search?: string) { - console.log('getRows, filters:', this.filters); - this._uiSettings.getUiSettings() - .subscribe ((settings: UiSettings) => { - this.uiSettings = settings?.connections[this.connectionID]; - this.shownTableTitles = settings?.connections[this.connectionID]?.shownTableTitles ?? true; - - const shownColumns = this.uiSettings?.tables[this.selectedTableName]?.shownColumns; - this.dataSource.fetchRows({ - connectionID: this.connectionID, - tableName: this.selectedTableName, - requstedPage: this.pageIndex, - pageSize: this.pageSize, - sortColumn: this.sortColumn, - sortOrder: this.sortOrder, - filters: this.filters, - search, - shownColumns - }); - }); - } - - applyFilter(filters: any) { - console.log('applyFilter with filters:', filters); - this.filters = filters?.filters; - this.getRows(); - console.log('getRows from applyFilter'); - } - - openIntercome() { - // @ts-expect-error - Intercom('show'); - } - - activateActions({action, primaryKeys, identityFieldValues}: DataToActivateActions) { - if (action.require_confirmation) { - this.dialog.open(BbBulkActionConfirmationDialogComponent, { - width: '25em', - data: {id: action.id, title: action.title, primaryKeys, identityFieldValues, tableDisplayName: this.selectedTableDisplayName} - }); - } else { - this._tables.activateActions(this.connectionID, this.selectedTableName, action.id, action.title, primaryKeys) - .subscribe((res) => { - if (res?.location) this.dialog.open(DbActionLinkDialogComponent, { - width: '25em', - data: {href: res.location, actionName: action.title, primaryKeys: primaryKeys[0]} - }) - }) - } - } - - toggleSideBar() { - this.shownTableTitles = !this.shownTableTitles; - this._uiSettings.updateConnectionSetting(this.connectionID, 'shownTableTitles', this.shownTableTitles); - } - - private loadTableFolders() { - this._connections.getTablesFolders(this.connectionID).subscribe({ - next: (categories: TableCategory[]) => { - if (categories && categories.length > 0) { - this.tableFolders = categories.map(cat => ({ - id: cat.category_id, - name: cat.category_name, - tableIds: cat.tables - })); - } else { - this.tableFolders = []; - } - }, - error: (error) => { - console.error('Error fetching table folders:', error); - this.tableFolders = []; - } - }); - } + public isSaas = (environment as any).saas; + public user: User = null; + public tablesList: TableProperties[] = null; + public selectedTableName: string; + public selectedTableDisplayName: string; + public currentPage: number = 1; + public shownTableTitles: boolean = true; + public connectionID: string; + // public isTestConnection: boolean = false; + public filters: object = {}; + public comparators: object; + public pageIndex: number; + public pageSize: number; + public sortColumn: string; + public sortOrder: 'ASC' | 'DESC'; + + public loading: boolean = true; + public isServerError: boolean = false; + public serverError: ServerError; + + public noTablesError: boolean = false; + + public dataSource: TablesDataSource = null; + + public selection = new SelectionModel(true, []); + + public selectedRow = null; + public isAIpanelOpened: boolean = false; + + public uiSettings: ConnectionSettingsUI; + public tableFolders: Folder[] = []; + + constructor( + private _connections: ConnectionsService, + private _tables: TablesService, + private _tableRow: TableRowService, + private _uiSettings: UiSettingsService, + private _tableState: TableStateService, + private _company: CompanyService, + public router: Router, + private route: ActivatedRoute, + public dialog: MatDialog, + private title: Title, + private angulartics2: Angulartics2, + ) {} + + get currentConnectionAccessLevel() { + return this._connections.currentConnectionAccessLevel; + } + + get currentConnectionIsTest() { + return this._connections.currentConnection.isTestConnection; + } + + get connectionTitle() { + return this._connections.currentConnection?.title || 'Database'; + } + + get defaultTableToOpen() { + return this._connections.defaultTableToOpen; + } + + ngOnInit() { + this.connectionID = this._connections.currentConnectionID; + // this.isTestConnection = this._connections.currentConnection.isTestConnection; + this.dataSource = new TablesDataSource(this._tables, this._connections, this._uiSettings, this._tableRow); + + this._tableState.cast.subscribe((row) => { + this.selectedRow = row; + }); + + this._tableState.aiPanelCast.subscribe((isAIpanelOpened) => { + this.isAIpanelOpened = isAIpanelOpened; + }); + + this._uiSettings.getUiSettings().subscribe((settings: UiSettings) => { + this.uiSettings = settings?.connections[this.connectionID]; + this.shownTableTitles = settings?.connections[this.connectionID]?.shownTableTitles ?? true; + + this.getData(); + console.log('getData from ngOnInit'); + }); + + this.loadTableFolders(); + } + + ngOnDestroy() { + this._tableState.clearSelection(); + } + + async getData() { + console.log('getData'); + let tables; + try { + tables = await this.getTables(); + } catch (err) { + this.loading = false; + this.isServerError = true; + this.title.setTitle(`Dashboard | ${this._company.companyTabTitle || 'Rocketadmin'}`); + + if (err instanceof HttpErrorResponse) { + this.serverError = { abstract: err.error.message || err.message, details: err.error.originalMessage }; + } else { + throw err; + } + } + + if (tables && tables.length === 0) { + this.noTablesError = true; + this.loading = false; + this.title.setTitle(`No tables | ${this._company.companyTabTitle || 'Rocketadmin'}`); + } else if (tables) { + this.formatTableNames(tables); + this.route.paramMap + .pipe( + map((params: ParamMap) => { + let tableName = params.get('table-name'); + if (tableName) { + this.selectedTableName = tableName; + this.setTable(tableName); + console.log('setTable from getData paramMap'); + this.title.setTitle( + `${this.selectedTableDisplayName} table | ${this._company.companyTabTitle || 'Rocketadmin'}`, + ); + this.selection.clear(); + } else { + if (this.defaultTableToOpen) { + tableName = this.defaultTableToOpen; + } else { + tableName = this.tablesList[0].table; + } + this.router.navigate([`/dashboard/${this.connectionID}/${tableName}`], { replaceUrl: true }); + this.selectedTableName = tableName; + } + }), + ) + .subscribe(); + this._tableRow.cast.subscribe((arg) => { + if (arg === 'delete row' && this.selectedTableName) { + this.setTable(this.selectedTableName); + console.log('setTable from getData _tableRow cast'); + this.selection.clear(); + } + }); + this._tables.cast.subscribe((arg) => { + if ((arg === 'delete rows' || arg === 'import') && this.selectedTableName) { + this.setTable(this.selectedTableName); + console.log('setTable from getData _tables cast'); + this.selection.clear(); + } + if (arg === 'activate actions') { + this.selection.clear(); + } + }); + } + } + + getTables() { + console.log('getTables'); + return this._tables.fetchTables(this.connectionID).toPromise(); + } + + formatTableNames(tables: TableProperties[]) { + this.tablesList = tables.map((tableItem: TableProperties) => { + let normalizedTableName; + if (tableItem.display_name) { + normalizedTableName = tableItem.display_name; + } else { + normalizedTableName = normalizeTableName(tableItem.table); + } + const words = normalizedTableName.split(' '); + const initials = words.reduce((result, word) => { + if (word.length > 0) { + return result + word[0].toUpperCase(); + } + return result; + }, ''); + + return { ...tableItem, normalizedTableName, initials: initials.slice(0, 2) }; + }); + } + + setTable(tableName: string) { + this.selectedTableName = tableName; + const queryParams = this.route.snapshot.queryParams; + this.filters = JsonURL.parse(queryParams.filters); + this.comparators = getComparatorsFromUrl(this.filters); + this.pageIndex = parseInt(queryParams.page_index, 10) || 0; + this.pageSize = parseInt(queryParams.page_size, 10) || 30; + this.sortColumn = queryParams.sort_active; + this.sortOrder = queryParams.sort_direction; + + const search = queryParams.search; + this.getRows(search); + console.log('getRows from setTable'); + + const selectedTableProperties = this.tablesList.find((table: any) => table.table === this.selectedTableName); + if (selectedTableProperties) { + this.selectedTableDisplayName = + selectedTableProperties.display_name || normalizeTableName(selectedTableProperties.table); + } else { + return; + } + this.loading = false; + } + + openTableFilters(structure) { + let filterDialodRef = this.dialog.open(DbTableFiltersDialogComponent, { + width: '56em', + data: { + connectionID: this.connectionID, + tableName: this.selectedTableName, + displayTableName: this.selectedTableDisplayName, + structure, + }, + }); + + filterDialodRef.afterClosed().subscribe((action) => { + if (action === 'filter') { + const filtersFromDialog = { ...filterDialodRef.componentInstance.tableRowFieldsShown }; + + console.log('Filters from dialog:', filtersFromDialog); + + const nonEmptyFilters = omitBy(filtersFromDialog, (value) => value === undefined); + this.comparators = filterDialodRef.componentInstance.tableRowFieldsComparator; + + if (Object.keys(nonEmptyFilters).length) { + this.filters = {}; + for (const key in nonEmptyFilters) { + if (this.comparators[key] !== undefined) { + this.filters[key] = { + [this.comparators[key]]: nonEmptyFilters[key], + }; + } + } + + console.log('Filters to apply:', this.filters); + + const filters = JsonURL.stringify(this.filters); + + console.log('Filters to navigate:', filters); + + this.router.navigate([`/dashboard/${this.connectionID}/${this.selectedTableName}`], { + queryParams: { + filters, + page_index: 0, + page_size: this.pageSize, + }, + }); + this.getRows(); + console.log('getRows from afterClosed'); + + this.angulartics2.eventTrack.next({ + action: 'Dashboard: filter is applied', + }); + } + } else if (action === 'reset') { + this.filters = {}; + this.getRows(); + console.log('getRows from reset filters afterClosed'); + this.router.navigate([`/dashboard/${this.connectionID}/${this.selectedTableName}`]); + } + }); + } + + removeFilter(columnName: string) { + this.filters[columnName] = undefined; + this.filters = omitBy(this.filters, (value) => value === undefined); + + const filters = JsonURL.stringify(this.filters); + + this.selection.clear(); + + this.getRows(); + console.log('getRows from removeFilter'); + this.router.navigate([`/dashboard/${this.connectionID}/${this.selectedTableName}`], { + queryParams: { + filters, + page_index: 0, + page_size: this.pageSize, + }, + }); + } + + clearAllFilters() { + this.filters = {}; + this.comparators = {}; + this.getRows(); + console.log('getRows from clearAllFilters'); + this.router.navigate([`/dashboard/${this.connectionID}/${this.selectedTableName}`], { + queryParams: { + page_index: 0, + page_size: this.pageSize, + }, + }); + } + + search(value: string) { + this.getRows(value); + console.log('getRows from search'); + this.filters = {}; + this.router.navigate([`/dashboard/${this.connectionID}/${this.selectedTableName}`], { + queryParams: { + page_index: 0, + page_size: this.pageSize, + search: value, + }, + }); + } + + getRows(search?: string) { + console.log('getRows, filters:', this.filters); + this._uiSettings.getUiSettings().subscribe((settings: UiSettings) => { + this.uiSettings = settings?.connections[this.connectionID]; + this.shownTableTitles = settings?.connections[this.connectionID]?.shownTableTitles ?? true; + + const shownColumns = this.uiSettings?.tables[this.selectedTableName]?.shownColumns; + this.dataSource.fetchRows({ + connectionID: this.connectionID, + tableName: this.selectedTableName, + requstedPage: this.pageIndex, + pageSize: this.pageSize, + sortColumn: this.sortColumn, + sortOrder: this.sortOrder, + filters: this.filters, + search, + shownColumns, + }); + }); + } + + applyFilter(filters: any) { + console.log('applyFilter with filters:', filters); + this.filters = filters?.filters; + this.getRows(); + console.log('getRows from applyFilter'); + } + + openIntercome() { + // @ts-expect-error + Intercom('show'); + } + + activateActions({ action, primaryKeys, identityFieldValues }: DataToActivateActions) { + if (action.require_confirmation) { + this.dialog.open(BbBulkActionConfirmationDialogComponent, { + width: '25em', + data: { + id: action.id, + title: action.title, + primaryKeys, + identityFieldValues, + tableDisplayName: this.selectedTableDisplayName, + }, + }); + } else { + this._tables + .activateActions(this.connectionID, this.selectedTableName, action.id, action.title, primaryKeys) + .subscribe((res) => { + if (res?.location) + this.dialog.open(DbActionLinkDialogComponent, { + width: '25em', + data: { href: res.location, actionName: action.title, primaryKeys: primaryKeys[0] }, + }); + }); + } + } + + toggleSideBar() { + this.shownTableTitles = !this.shownTableTitles; + this._uiSettings.updateConnectionSetting(this.connectionID, 'shownTableTitles', this.shownTableTitles); + } + + private loadTableFolders() { + this._connections.getTablesFolders(this.connectionID).subscribe({ + next: (categories: TableCategory[]) => { + if (categories && categories.length > 0) { + this.tableFolders = categories.map((cat) => ({ + id: cat.category_id, + name: cat.category_name, + tableIds: cat.tables, + })); + } else { + this.tableFolders = []; + } + }, + error: (error) => { + console.error('Error fetching table folders:', error); + this.tableFolders = []; + }, + }); + } } diff --git a/frontend/src/app/components/dashboard/db-table-view/db-table-view.component.ts b/frontend/src/app/components/dashboard/db-table-view/db-table-view.component.ts index 9c96cb153..fef902f3b 100644 --- a/frontend/src/app/components/dashboard/db-table-view/db-table-view.component.ts +++ b/frontend/src/app/components/dashboard/db-table-view/db-table-view.component.ts @@ -1,620 +1,641 @@ -import * as JSON5 from 'json5'; - -import { ActivatedRoute, Router } from '@angular/router'; -import { Component, EventEmitter, Input, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core'; -import { CustomAction, TableForeignKey, TablePermissions, TableProperties, TableRow, Widget } from 'src/app/models/table'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { UIwidgets, tableDisplayTypes } from '../../../consts/table-display-types'; - -import { AccessLevel } from 'src/app/models/user'; -import { Angulartics2OnModule } from 'angulartics2'; import { ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; -import { ConnectionsService } from 'src/app/services/connections.service'; -import { DbTableExportDialogComponent } from './db-table-export-dialog/db-table-export-dialog.component'; -import { DbTableImportDialogComponent } from './db-table-import-dialog/db-table-import-dialog.component'; +import { SelectionModel } from '@angular/cdk/collections'; import { DragDropModule } from '@angular/cdk/drag-drop'; -import { DynamicModule } from 'ng-dynamic-component'; -import { ForeignKeyDisplayComponent } from '../../ui-components/table-display-fields/foreign-key/foreign-key.component'; -import JsonURL from "@jsonurl/jsonurl"; +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatSelectModule } from '@angular/material/select'; import { MatButtonModule } from '@angular/material/button'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatChipsModule } from '@angular/material/chips'; -import { MatDialog } from '@angular/material/dialog'; -import { MatDialogModule } from '@angular/material/dialog'; +import { MatDialog, MatDialogModule } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatMenuModule } from '@angular/material/menu'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { MatSortModule } from '@angular/material/sort'; +import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSort, MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; import { MatTooltipModule } from '@angular/material/tooltip'; +import { ActivatedRoute, Router, RouterModule } from '@angular/router'; +import JsonURL from '@jsonurl/jsonurl'; +import { Angulartics2OnModule } from 'angulartics2'; +import * as JSON5 from 'json5'; +import { DynamicModule } from 'ng-dynamic-component'; +import { merge } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { formatFieldValue } from 'src/app/lib/format-field-value'; +import { getTableTypes } from 'src/app/lib/setup-table-row-structure'; +import { + CustomAction, + TableForeignKey, + TablePermissions, + TableProperties, + TableRow, + Widget, +} from 'src/app/models/table'; +import { AccessLevel } from 'src/app/models/user'; +import { ConnectionsService } from 'src/app/services/connections.service'; import { NotificationsService } from 'src/app/services/notifications.service'; -import { PlaceholderTableDataComponent } from '../../skeletons/placeholder-table-data/placeholder-table-data.component'; -import { RouterModule } from '@angular/router'; -import { SavedFiltersPanelComponent } from './saved-filters-panel/saved-filters-panel.component'; -import { SelectionModel } from '@angular/cdk/collections'; import { TableRowService } from 'src/app/services/table-row.service'; import { TableStateService } from 'src/app/services/table-state.service'; -import { formatFieldValue } from 'src/app/lib/format-field-value'; -import { getTableTypes } from 'src/app/lib/setup-table-row-structure'; -import { merge } from 'rxjs'; -import { normalizeTableName } from '../../../lib/normalize' -import { tap } from 'rxjs/operators'; +import { tableDisplayTypes, UIwidgets } from '../../../consts/table-display-types'; +import { normalizeTableName } from '../../../lib/normalize'; +import { PlaceholderTableDataComponent } from '../../skeletons/placeholder-table-data/placeholder-table-data.component'; +import { ForeignKeyDisplayComponent } from '../../ui-components/table-display-fields/foreign-key/foreign-key.component'; +import { DbTableExportDialogComponent } from './db-table-export-dialog/db-table-export-dialog.component'; +import { DbTableImportDialogComponent } from './db-table-import-dialog/db-table-import-dialog.component'; +import { SavedFiltersPanelComponent } from './saved-filters-panel/saved-filters-panel.component'; interface Column { - title: string, - selected: boolean + title: string; + selected: boolean; } export interface Folder { - id: string; - name: string; - tableIds: string[]; + id: string; + name: string; + tableIds: string[]; } @Component({ - selector: 'app-db-table-view', - templateUrl: './db-table-view.component.html', - styleUrls: ['./db-table-view.component.css'], - imports: [ - CommonModule, - FormsModule, - RouterModule, - MatTableModule, - MatPaginatorModule, - MatSortModule, - MatButtonModule, - MatIconModule, - MatCheckboxModule, - MatChipsModule, - MatDialogModule, - MatFormFieldModule, - ReactiveFormsModule, - MatInputModule, - MatAutocompleteModule, - MatSelectModule, - MatMenuModule, - MatTooltipModule, - ClipboardModule, - DragDropModule, - Angulartics2OnModule, - PlaceholderTableDataComponent, - DynamicModule, - ForeignKeyDisplayComponent, - SavedFiltersPanelComponent - ] + selector: 'app-db-table-view', + templateUrl: './db-table-view.component.html', + styleUrls: ['./db-table-view.component.css'], + imports: [ + CommonModule, + FormsModule, + RouterModule, + MatTableModule, + MatPaginatorModule, + MatSortModule, + MatButtonModule, + MatIconModule, + MatCheckboxModule, + MatChipsModule, + MatDialogModule, + MatFormFieldModule, + ReactiveFormsModule, + MatInputModule, + MatAutocompleteModule, + MatSelectModule, + MatMenuModule, + MatTooltipModule, + ClipboardModule, + DragDropModule, + Angulartics2OnModule, + PlaceholderTableDataComponent, + DynamicModule, + ForeignKeyDisplayComponent, + SavedFiltersPanelComponent, + ], }) - export class DbTableViewComponent implements OnInit { - - @Input() name: string; - @Input() displayName: string; - @Input() permissions: TablePermissions; - @Input() accessLevel: AccessLevel; - @Input() connectionID: string; - @Input() isTestConnection: boolean; - @Input() activeFilters: object; - @Input() filterComparators: object; - @Input() selection: SelectionModel; - @Input() tables: TableProperties[]; - @Input() folders: Folder[] = []; - - @Output() openFilters = new EventEmitter(); - @Output() openPage = new EventEmitter(); - @Output() search = new EventEmitter(); - @Output() removeFilter = new EventEmitter(); - @Output() resetAllFilters = new EventEmitter(); - // @Output() viewRow = new EventEmitter(); - - public hasSavedFilterActive: boolean = false; - @Output() activateAction = new EventEmitter(); - @Output() activateActions = new EventEmitter(); - - @Output() applyFilter = new EventEmitter(); - - // public tablesSwitchControl = new FormControl(''); - public tableData: any; - public filteredTables: TableProperties[]; - // public selection: any; - public columns: Column[]; - public displayedColumns: string[] = []; - public columnsToDisplay: string[] = []; - public searchString: string; - public staticSearchString: string; - public actionsColumnWidth: string; - public bulkActions: CustomAction[]; - public bulkRows: string[]; - public displayedComparators = { - eq: "=", - gt: ">", - lt: "<", - gte: ">=", - lte: "<=" - } - public selectedRow: TableRow = null; - public selectedRowType: 'record' | 'foreignKey' = 'record'; - public tableRelatedRecords: any = null; - public displayCellComponents; - public UIwidgets = UIwidgets; - // public tableTypes: object; - - @Input() set table(value){ - if (value) this.tableData = value; - } - - @ViewChild(MatPaginator) paginator: MatPaginator; - @ViewChild(MatSort) sort: MatSort; - - constructor( - private _tableState: TableStateService, - private _notifications: NotificationsService, - private _tableRow: TableRowService, - private _connections: ConnectionsService, - private route: ActivatedRoute, - public router: Router, - public dialog: MatDialog, - ) {} - - ngAfterViewInit() { - this.tableData.paginator = this.paginator; - - this.tableData.sort = this.sort; - // this.sort.sortChange.subscribe(() => { this.paginator.pageIndex = 0 }); - - merge(this.sort.sortChange, this.paginator.page) - .pipe( - tap(() => { - - const filters = JsonURL.stringify( this.activeFilters ); - const saved_filter = this.route.snapshot.queryParams.saved_filter; - const dynamic_column = this.route.snapshot.queryParams.dynamic_column; - - this.router.navigate([`/dashboard/${this.connectionID}/${this.name}`], { - queryParams: { - filters, - saved_filter, - dynamic_column, - sort_active: this.sort.active, - sort_direction: this.sort.direction.toUpperCase(), - page_index: this.paginator.pageIndex, - page_size: this.paginator.pageSize - } - }); - this.loadRowsPage(); - }) - ) - .subscribe(); - } - - ngOnInit() { - this.searchString = this.route.snapshot.queryParams.search; - // this.hasSavedFilterActive = !!this.route.snapshot.queryParams.saved_filter; - - const connectionType = this._connections.currentConnection.type; - this.displayCellComponents = tableDisplayTypes[connectionType]; - - this._tableState.cast.subscribe(row => { - this.selectedRow = row; - }); - - this.route.queryParams.subscribe(params => { - this.hasSavedFilterActive = !!params.saved_filter; - if (this.hasSavedFilterActive ) this.searchString = ''; - }); - } - - onInput(searchValue: string) { - this.filteredTables = this.filterTables(searchValue) - } - - onInputFocus() { - this.filteredTables = this.tables; - } - - private filterTables(searchValue: string): any[] { - const filterValue = searchValue.toLowerCase(); - return this.tables.filter((table) => - table.normalizedTableName.toLowerCase().includes(filterValue) - ); - } - - loadRowsPage() { - this.tableRelatedRecords = null; - this.tableData.fetchRows({ - connectionID: this.connectionID, - tableName: this.name, - requstedPage: this.paginator.pageIndex, - pageSize: this.paginator.pageSize, - sortColumn: this.sort.active, - sortOrder: this.sort.direction.toUpperCase(), - filters: this.activeFilters, - search: this.searchString, - isTablePageSwitched: true - }); - } - - ngOnChanges(changes: SimpleChanges) { - if (changes.name?.currentValue && this.paginator) { - this.paginator.pageIndex = 0; - this.searchString = ''; - } - } - - isSortable(column: string) { - return this.tableData.sortByColumns.includes(column) || !this.tableData.sortByColumns.length; - } - - isForeignKey(column: string) { - return this.tableData.foreignKeysList.includes(column); - } - - getForeignKeyQueryParams(foreignKey: TableForeignKey, cell) { - return { - [foreignKey.referenced_column_name]: cell[foreignKey.referenced_column_name] - } - } - - isWidget(column: string) { - if (this.tableData.widgetsList) return this.tableData.widgetsList.includes(column); - } - - getCellValue(foreignKey: TableForeignKey, cell) { - const identityColumnName = Object.keys(cell).find(key => key !== foreignKey.referenced_column_name); - if (identityColumnName) { - return cell[identityColumnName] - } else { - return cell[foreignKey.referenced_column_name] - } - } - - getFiltersCount(activeFilters: object) { - if (activeFilters && !this.hasSavedFilterActive) return Object.keys(activeFilters).length; - return 0; - } - - handleOpenFilters() { - this.openFilters.emit({ - structure: this.tableData.structure, - foreignKeysList: this.tableData.foreignKeysList, - foreignKeys: this.tableData.foreignKeys, - widgets: this.tableData.widgets - }); - this.searchString = ''; - } - - handleSearch() { - this.searchString = this.searchString.trim(); - this.staticSearchString = this.searchString; - this.search.emit(this.searchString); - } - - handleOpenExportDialog() { - this.dialog.open(DbTableExportDialogComponent, { - width: '25em', - data: { - connectionID: this.connectionID, - tableName: this.name, - sortColumn: this.sort.active, - sortOrder: this.sort.direction.toUpperCase(), - filters: this.activeFilters, - search: this.searchString - } - }) - } - - handleOpenImportDialog() { - this.dialog.open(DbTableImportDialogComponent, { - width: '25em', - data: { - connectionID: this.connectionID, - tableName: this.name, - isTestConnection: this.isTestConnection - } - }) - } - - clearSearch () { - this.searchString = null; - this.search.emit(this.searchString); - } - - getFilter(activeFilter: {key: string, value: object}) { - const displayedName = normalizeTableName(activeFilter.key); - const comparator = Object.keys(activeFilter.value)[0]; - const filterValue = Object.values(activeFilter.value)[0]; - if (comparator === 'startswith') { - return `${displayedName} = ${filterValue}...` - } else if (comparator === 'endswith') { - return `${displayedName} = ...${filterValue}` - } else if (comparator === 'contains') { - return `${displayedName} = ...${filterValue}...` - } else if (comparator === 'icontains') { - return `${displayedName} != ...${filterValue}...` - } else if (comparator === 'empty') { - return `${displayedName} = ' '` - } else { - return `${displayedName} ${this.displayedComparators[Object.keys(activeFilter.value)[0]]} ${filterValue}` - } - } - - /** Whether the number of selected elements matches the total number of rows. */ - isAllSelected() { - return this.tableData.rowsSubject.value.length === this.selection.selected.length; - } - - /** Selects all rows if they are not all selected; otherwise clear selection. */ - toggleAllRows() { - if (this.isAllSelected()) { - this.selection.clear(); - } else { - this.selection.select(...this.tableData.rowsSubject.value); - } - } - - /** The label for the checkbox on the passed row */ - checkboxLabel(row?: any): string { - if (!row) { - return `${this.isAllSelected() ? 'deselect' : 'select'} all`; - } - return `${this.selection.isSelected(row) ? 'deselect' : 'select'} row ${row.position + 1}`; - } - - stashUrlParams() { - this._tableState.setBackUrlParams(this.route.snapshot.queryParams.page_index, this.route.snapshot.queryParams.page_size, this.route.snapshot.queryParams.sort_active, this.route.snapshot.queryParams.sort_direction); - this.stashFilters(); - } - - stashFilters() { - if (this.activeFilters && Object.keys(this.activeFilters).length > 0) { - this._tableState.setBackUrlFilters(this.activeFilters); - } else { - this._tableState.setBackUrlFilters(null); - } - } - - getIdentityFieldsValues() { - if (this.tableData.identityColumn) return this.selection.selected.map(row => row[this.tableData.identityColumn]); - return null; - } - - handleAction(e, action, element) { - e.stopPropagation(); - - this.activateActions.emit({ - action, - primaryKeys: [this.tableData.getQueryParams(element)], - ...(this.tableData.identityColumn ? {identityFieldValues: [element[this.tableData.identityColumn]]} : null) - }) - } - - handleActions(action) { - const primaryKeys = this.selection.selected.map(row => this.tableData.getQueryParams(row)); - const identityFieldValues = this.getIdentityFieldsValues(); - - this.activateActions.emit({ - action, - primaryKeys, - identityFieldValues - }) - } - - handleDeleteRow(e, element){ - e.stopPropagation(); - this.stashFilters(); - - this.activateActions.emit({ - action: { - title: 'Delete row', - type: 'multiple', - require_confirmation: true - }, - primaryKeys: [this.tableData.getQueryParams(element)], - ...(this.tableData.identityColumn ? {identityFieldValues: [element[this.tableData.identityColumn]]} : null) - }) - } - - handleViewRow(row: TableRow) { - this.selectedRowType = 'record'; - this._tableState.selectRow({ - connectionID: this.connectionID, - tableName: this.name, - record: row, - columnsOrder: this.tableData.dataColumns, - primaryKeys: this.tableData.getQueryParams(row), - foreignKeys: this.tableData.foreignKeys, - foreignKeysList: this.tableData.foreignKeysList, - widgets: this.tableData.widgets, - widgetsList: this.tableData.widgetsList, - fieldsTypes: this.tableData.tableTypes, - relatedRecords: this.tableData.relatedRecords || null, - link: `/dashboard/${this.connectionID}/${this.name}/entry` - }); - } - - handleForeignKeyView(foreignKeys, row) { - this.selectedRowType = 'foreignKey'; - - this._tableState.selectRow({ - connectionID: null, - tableName: null, - record: null, - columnsOrder: null, - primaryKeys: null, - foreignKeys: null, - foreignKeysList: null, - widgets: null, - widgetsList: null, - fieldsTypes: null, - relatedRecords: null, - link: null - }) - - this._tableRow.fetchTableRow(this.connectionID, foreignKeys.referenced_table_name, {[foreignKeys.referenced_column_name]: row[foreignKeys.referenced_column_name]}) - .subscribe(res => { - const foreignKeysList = res.foreignKeys.map((foreignKey: TableForeignKey) => foreignKey.column_name); - const filedsTypes = getTableTypes(res.structure, foreignKeysList); - - const formattedRecord = Object.entries(res.row).reduce((acc, [key, value]) => { - acc[key] = formatFieldValue(value, filedsTypes[key]); - return acc; - }, {}) - - this._tableState.selectRow({ - connectionID: this.connectionID, - tableName: foreignKeys.referenced_table_name, - record: formattedRecord, - columnsOrder: res.list_fields, - primaryKeys: { - [foreignKeys.referenced_column_name]: res.row[foreignKeys.referenced_column_name] - }, - foreignKeys: Object.assign({}, ...res.foreignKeys.map((foreignKey: TableForeignKey) => ({[foreignKey.column_name]: foreignKey}))), - foreignKeysList, - widgets: Object.assign({}, ...res.table_widgets.map((widget: Widget) => { - let parsedParams; - - try { - parsedParams = JSON5.parse(widget.widget_params); - } catch { - parsedParams = {}; - } - - return { - [widget.field_name]: { - ...widget, - widget_params: parsedParams, - }, - }; - }) - ), - widgetsList: res.table_widgets.map(widget => widget.field_name), - fieldsTypes: filedsTypes, - relatedRecords: res.referenced_table_names_and_columns[0], - link: `/dashboard/${this.connectionID}/${foreignKeys.referenced_table_name}/entry` - }); - }) - } - - handleViewAIpanel() { - this._tableState.handleViewAIpanel(); - } - - isRowSelected(primaryKeys) { - // console.log('isRowSelected', this.selectedRowType, this.selectedRow, primaryKeys); - if (this.selectedRowType === 'record' && this.selectedRow && this.selectedRow.primaryKeys !== null) return Object.keys(this.selectedRow.primaryKeys).length && JSON.stringify(this.selectedRow.primaryKeys) === JSON.stringify(primaryKeys); - return false; - } - - isForeignKeySelected(record, foreignKey: TableForeignKey) { - const primaryKeyValue = record[foreignKey.referenced_column_name]; - - if (this.selectedRowType === 'foreignKey' && this.selectedRow && this.selectedRow.record !== null) { - return Object.values(this.selectedRow.primaryKeys)[0] === primaryKeyValue && this.selectedRow.tableName === foreignKey.referenced_table_name; - } - return false; - } - - showCopyNotification = (message: string) => { - this._notifications.showSuccessSnackbar(message); - } - - switchTable(tableName: string) { - if (tableName && tableName !== this.name) { - this.router.navigate([`/dashboard/${this.connectionID}/${tableName}`], { - queryParams: { page_index: 0, page_size: 30 } - }); - } - } - - getFolderTables(folder: Folder): TableProperties[] { - return this.tables.filter(table => folder.tableIds.includes(table.table)); - } - - getUncategorizedTables(): TableProperties[] { - const categorizedTableIds = new Set(); - this.folders.forEach(folder => { - folder.tableIds.forEach(id => categorizedTableIds.add(id)); - }); - return this.tables.filter(table => !categorizedTableIds.has(table.table)); - } - - onFilterSelected($event) { - console.log('table view fiers filterSelected:', $event) - this.applyFilter.emit($event); - } - - exportData() { - const convertToCSVValue = (value: any): string => { - // Handle null and undefined - if (value === null || value === undefined) { - return ''; - } - - // Handle nested objects and arrays - convert to JSON string - if (typeof value === 'object') { - try { - value = JSON.stringify(value); - } catch (_e) { - value = '[Object]'; - } - } - - // Convert to string if not already - const stringValue = String(value); - - // Check if value needs to be quoted (contains comma, double quote, or newline) - if (stringValue.includes(',') || stringValue.includes('"') || stringValue.includes('\n') || stringValue.includes('\r')) { - // Escape double quotes by doubling them and wrap in quotes - return `"${stringValue.replace(/"/g, '""')}"`; - } - - return stringValue; - }; - - // Check if there's any selection - if (!this.selection.selected || this.selection.selected.length === 0) { - this._notifications.showErrorSnackbar('No rows selected for export'); - return; - } - - // Use the displayed columns order from the table - const columnsToExport = this.tableData.displayedDataColumns; - - // Create CSV rows with proper handling of foreign keys - const csv = this.selection.selected.map((row) => - columnsToExport - .map((fieldName) => { - let value = row[fieldName]; - - if (this.isForeignKey(fieldName) && value && typeof value === 'object') { - const foreignKey = this.tableData.foreignKeys[fieldName]; - if (foreignKey) { - value = value[foreignKey.referenced_column_name]; - } - } - - return convertToCSVValue(value); - }) - .join(',') - ); - - // Add header row using the same column order - csv.unshift(columnsToExport.map(h => convertToCSVValue(h)).join(',')); - const csvArray = csv.join('\r\n'); - - const a = document.createElement('a'); - const blob = new Blob([csvArray], { type: 'text/csv' }); - const url = window.URL.createObjectURL(blob); - - a.href = url; - a.download = 'myFile.csv'; - a.click(); - window.URL.revokeObjectURL(url); - a.remove(); - } + @Input() name: string; + @Input() displayName: string; + @Input() permissions: TablePermissions; + @Input() accessLevel: AccessLevel; + @Input() connectionID: string; + @Input() isTestConnection: boolean; + @Input() activeFilters: object; + @Input() filterComparators: object; + @Input() selection: SelectionModel; + @Input() tables: TableProperties[]; + @Input() folders: Folder[] = []; + + @Output() openFilters = new EventEmitter(); + @Output() openPage = new EventEmitter(); + @Output() search = new EventEmitter(); + @Output() removeFilter = new EventEmitter(); + @Output() resetAllFilters = new EventEmitter(); + // @Output() viewRow = new EventEmitter(); + + public hasSavedFilterActive: boolean = false; + @Output() activateAction = new EventEmitter(); + @Output() activateActions = new EventEmitter(); + + @Output() applyFilter = new EventEmitter(); + + // public tablesSwitchControl = new FormControl(''); + public tableData: any; + public filteredTables: TableProperties[]; + // public selection: any; + public columns: Column[]; + public displayedColumns: string[] = []; + public columnsToDisplay: string[] = []; + public searchString: string; + public staticSearchString: string; + public actionsColumnWidth: string; + public bulkActions: CustomAction[]; + public bulkRows: string[]; + public displayedComparators = { + eq: '=', + gt: '>', + lt: '<', + gte: '>=', + lte: '<=', + }; + public selectedRow: TableRow = null; + public selectedRowType: 'record' | 'foreignKey' = 'record'; + public tableRelatedRecords: any = null; + public displayCellComponents; + public UIwidgets = UIwidgets; + // public tableTypes: object; + + @Input() set table(value) { + if (value) this.tableData = value; + } + + @ViewChild(MatPaginator) paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + + constructor( + private _tableState: TableStateService, + private _notifications: NotificationsService, + private _tableRow: TableRowService, + private _connections: ConnectionsService, + private route: ActivatedRoute, + public router: Router, + public dialog: MatDialog, + ) {} + + ngAfterViewInit() { + this.tableData.paginator = this.paginator; + + this.tableData.sort = this.sort; + // this.sort.sortChange.subscribe(() => { this.paginator.pageIndex = 0 }); + + merge(this.sort.sortChange, this.paginator.page) + .pipe( + tap(() => { + const filters = JsonURL.stringify(this.activeFilters); + const saved_filter = this.route.snapshot.queryParams.saved_filter; + const dynamic_column = this.route.snapshot.queryParams.dynamic_column; + + this.router.navigate([`/dashboard/${this.connectionID}/${this.name}`], { + queryParams: { + filters, + saved_filter, + dynamic_column, + sort_active: this.sort.active, + sort_direction: this.sort.direction.toUpperCase(), + page_index: this.paginator.pageIndex, + page_size: this.paginator.pageSize, + }, + }); + this.loadRowsPage(); + }), + ) + .subscribe(); + } + + ngOnInit() { + this.searchString = this.route.snapshot.queryParams.search; + // this.hasSavedFilterActive = !!this.route.snapshot.queryParams.saved_filter; + + const connectionType = this._connections.currentConnection.type; + this.displayCellComponents = tableDisplayTypes[connectionType]; + + this._tableState.cast.subscribe((row) => { + this.selectedRow = row; + }); + + this.route.queryParams.subscribe((params) => { + this.hasSavedFilterActive = !!params.saved_filter; + if (this.hasSavedFilterActive) this.searchString = ''; + }); + } + + onInput(searchValue: string) { + this.filteredTables = this.filterTables(searchValue); + } + + onInputFocus() { + this.filteredTables = this.tables; + } + + private filterTables(searchValue: string): any[] { + const filterValue = searchValue.toLowerCase(); + return this.tables.filter((table) => table.normalizedTableName.toLowerCase().includes(filterValue)); + } + + loadRowsPage() { + this.tableRelatedRecords = null; + this.tableData.fetchRows({ + connectionID: this.connectionID, + tableName: this.name, + requstedPage: this.paginator.pageIndex, + pageSize: this.paginator.pageSize, + sortColumn: this.sort.active, + sortOrder: this.sort.direction.toUpperCase(), + filters: this.activeFilters, + search: this.searchString, + isTablePageSwitched: true, + }); + } + + ngOnChanges(changes: SimpleChanges) { + if (changes.name?.currentValue && this.paginator) { + this.paginator.pageIndex = 0; + this.searchString = ''; + } + } + + isSortable(column: string) { + return this.tableData.sortByColumns.includes(column) || !this.tableData.sortByColumns.length; + } + + isForeignKey(column: string) { + return this.tableData.foreignKeysList.includes(column); + } + + getForeignKeyQueryParams(foreignKey: TableForeignKey, cell) { + return { + [foreignKey.referenced_column_name]: cell[foreignKey.referenced_column_name], + }; + } + + isWidget(column: string) { + if (this.tableData.widgetsList) return this.tableData.widgetsList.includes(column); + } + + getCellValue(foreignKey: TableForeignKey, cell) { + const identityColumnName = Object.keys(cell).find((key) => key !== foreignKey.referenced_column_name); + if (identityColumnName) { + return cell[identityColumnName]; + } else { + return cell[foreignKey.referenced_column_name]; + } + } + + getFiltersCount(activeFilters: object) { + if (activeFilters && !this.hasSavedFilterActive) return Object.keys(activeFilters).length; + return 0; + } + + handleOpenFilters() { + this.openFilters.emit({ + structure: this.tableData.structure, + foreignKeysList: this.tableData.foreignKeysList, + foreignKeys: this.tableData.foreignKeys, + widgets: this.tableData.widgets, + }); + this.searchString = ''; + } + + handleSearch() { + this.searchString = this.searchString.trim(); + this.staticSearchString = this.searchString; + this.search.emit(this.searchString); + } + + handleOpenExportDialog() { + this.dialog.open(DbTableExportDialogComponent, { + width: '25em', + data: { + connectionID: this.connectionID, + tableName: this.name, + sortColumn: this.sort.active, + sortOrder: this.sort.direction.toUpperCase(), + filters: this.activeFilters, + search: this.searchString, + }, + }); + } + + handleOpenImportDialog() { + this.dialog.open(DbTableImportDialogComponent, { + width: '25em', + data: { + connectionID: this.connectionID, + tableName: this.name, + isTestConnection: this.isTestConnection, + }, + }); + } + + clearSearch() { + this.searchString = null; + this.search.emit(this.searchString); + } + + getFilter(activeFilter: { key: string; value: object }) { + const displayedName = normalizeTableName(activeFilter.key); + const comparator = Object.keys(activeFilter.value)[0]; + const filterValue = Object.values(activeFilter.value)[0]; + if (comparator === 'startswith') { + return `${displayedName} = ${filterValue}...`; + } else if (comparator === 'endswith') { + return `${displayedName} = ...${filterValue}`; + } else if (comparator === 'contains') { + return `${displayedName} = ...${filterValue}...`; + } else if (comparator === 'icontains') { + return `${displayedName} != ...${filterValue}...`; + } else if (comparator === 'empty') { + return `${displayedName} = ' '`; + } else { + return `${displayedName} ${this.displayedComparators[Object.keys(activeFilter.value)[0]]} ${filterValue}`; + } + } + + /** Whether the number of selected elements matches the total number of rows. */ + isAllSelected() { + return this.tableData.rowsSubject.value.length === this.selection.selected.length; + } + + /** Selects all rows if they are not all selected; otherwise clear selection. */ + toggleAllRows() { + if (this.isAllSelected()) { + this.selection.clear(); + } else { + this.selection.select(...this.tableData.rowsSubject.value); + } + } + + /** The label for the checkbox on the passed row */ + checkboxLabel(row?: any): string { + if (!row) { + return `${this.isAllSelected() ? 'deselect' : 'select'} all`; + } + return `${this.selection.isSelected(row) ? 'deselect' : 'select'} row ${row.position + 1}`; + } + + stashUrlParams() { + this._tableState.setBackUrlParams( + this.route.snapshot.queryParams.page_index, + this.route.snapshot.queryParams.page_size, + this.route.snapshot.queryParams.sort_active, + this.route.snapshot.queryParams.sort_direction, + ); + this.stashFilters(); + } + + stashFilters() { + if (this.activeFilters && Object.keys(this.activeFilters).length > 0) { + this._tableState.setBackUrlFilters(this.activeFilters); + } else { + this._tableState.setBackUrlFilters(null); + } + } + + getIdentityFieldsValues() { + if (this.tableData.identityColumn) return this.selection.selected.map((row) => row[this.tableData.identityColumn]); + return null; + } + + handleAction(e, action, element) { + e.stopPropagation(); + + this.activateActions.emit({ + action, + primaryKeys: [this.tableData.getQueryParams(element)], + ...(this.tableData.identityColumn ? { identityFieldValues: [element[this.tableData.identityColumn]] } : null), + }); + } + + handleActions(action) { + const primaryKeys = this.selection.selected.map((row) => this.tableData.getQueryParams(row)); + const identityFieldValues = this.getIdentityFieldsValues(); + + this.activateActions.emit({ + action, + primaryKeys, + identityFieldValues, + }); + } + + handleDeleteRow(e, element) { + e.stopPropagation(); + this.stashFilters(); + + this.activateActions.emit({ + action: { + title: 'Delete row', + type: 'multiple', + require_confirmation: true, + }, + primaryKeys: [this.tableData.getQueryParams(element)], + ...(this.tableData.identityColumn ? { identityFieldValues: [element[this.tableData.identityColumn]] } : null), + }); + } + + handleViewRow(row: TableRow) { + this.selectedRowType = 'record'; + this._tableState.selectRow({ + connectionID: this.connectionID, + tableName: this.name, + record: row, + columnsOrder: this.tableData.dataColumns, + primaryKeys: this.tableData.getQueryParams(row), + foreignKeys: this.tableData.foreignKeys, + foreignKeysList: this.tableData.foreignKeysList, + widgets: this.tableData.widgets, + widgetsList: this.tableData.widgetsList, + fieldsTypes: this.tableData.tableTypes, + relatedRecords: this.tableData.relatedRecords || null, + link: `/dashboard/${this.connectionID}/${this.name}/entry`, + }); + } + + handleForeignKeyView(foreignKeys, row) { + this.selectedRowType = 'foreignKey'; + + this._tableState.selectRow({ + connectionID: null, + tableName: null, + record: null, + columnsOrder: null, + primaryKeys: null, + foreignKeys: null, + foreignKeysList: null, + widgets: null, + widgetsList: null, + fieldsTypes: null, + relatedRecords: null, + link: null, + }); + + this._tableRow + .fetchTableRow(this.connectionID, foreignKeys.referenced_table_name, { + [foreignKeys.referenced_column_name]: row[foreignKeys.referenced_column_name], + }) + .subscribe((res) => { + const foreignKeysList = res.foreignKeys.map((foreignKey: TableForeignKey) => foreignKey.column_name); + const filedsTypes = getTableTypes(res.structure, foreignKeysList); + + const formattedRecord = Object.entries(res.row).reduce((acc, [key, value]) => { + acc[key] = formatFieldValue(value, filedsTypes[key]); + return acc; + }, {}); + + this._tableState.selectRow({ + connectionID: this.connectionID, + tableName: foreignKeys.referenced_table_name, + record: formattedRecord, + columnsOrder: res.list_fields, + primaryKeys: { + [foreignKeys.referenced_column_name]: res.row[foreignKeys.referenced_column_name], + }, + foreignKeys: Object.assign( + {}, + ...res.foreignKeys.map((foreignKey: TableForeignKey) => ({ [foreignKey.column_name]: foreignKey })), + ), + foreignKeysList, + widgets: Object.assign( + {}, + ...res.table_widgets.map((widget: Widget) => { + let parsedParams; + + try { + parsedParams = JSON5.parse(widget.widget_params); + } catch { + parsedParams = {}; + } + + return { + [widget.field_name]: { + ...widget, + widget_params: parsedParams, + }, + }; + }), + ), + widgetsList: res.table_widgets.map((widget) => widget.field_name), + fieldsTypes: filedsTypes, + relatedRecords: res.referenced_table_names_and_columns[0], + link: `/dashboard/${this.connectionID}/${foreignKeys.referenced_table_name}/entry`, + }); + }); + } + + handleViewAIpanel() { + this._tableState.handleViewAIpanel(); + } + + isRowSelected(primaryKeys) { + // console.log('isRowSelected', this.selectedRowType, this.selectedRow, primaryKeys); + if (this.selectedRowType === 'record' && this.selectedRow && this.selectedRow.primaryKeys !== null) + return ( + Object.keys(this.selectedRow.primaryKeys).length && + JSON.stringify(this.selectedRow.primaryKeys) === JSON.stringify(primaryKeys) + ); + return false; + } + + isForeignKeySelected(record, foreignKey: TableForeignKey) { + const primaryKeyValue = record[foreignKey.referenced_column_name]; + + if (this.selectedRowType === 'foreignKey' && this.selectedRow && this.selectedRow.record !== null) { + return ( + Object.values(this.selectedRow.primaryKeys)[0] === primaryKeyValue && + this.selectedRow.tableName === foreignKey.referenced_table_name + ); + } + return false; + } + + showCopyNotification = (message: string) => { + this._notifications.showSuccessSnackbar(message); + }; + + switchTable(tableName: string) { + if (tableName && tableName !== this.name) { + this.router.navigate([`/dashboard/${this.connectionID}/${tableName}`], { + queryParams: { page_index: 0, page_size: 30 }, + }); + } + } + + getFolderTables(folder: Folder): TableProperties[] { + return this.tables.filter((table) => folder.tableIds.includes(table.table)); + } + + getUncategorizedTables(): TableProperties[] { + const categorizedTableIds = new Set(); + this.folders.forEach((folder) => { + folder.tableIds.forEach((id) => categorizedTableIds.add(id)); + }); + return this.tables.filter((table) => !categorizedTableIds.has(table.table)); + } + + onFilterSelected($event) { + console.log('table view fiers filterSelected:', $event); + this.applyFilter.emit($event); + } + + exportData() { + const convertToCSVValue = (value: any): string => { + // Handle null and undefined + if (value === null || value === undefined) { + return ''; + } + + // Handle nested objects and arrays - convert to JSON string + if (typeof value === 'object') { + try { + value = JSON.stringify(value); + } catch (_e) { + value = '[Object]'; + } + } + + // Convert to string if not already + const stringValue = String(value); + + // Check if value needs to be quoted (contains comma, double quote, or newline) + if ( + stringValue.includes(',') || + stringValue.includes('"') || + stringValue.includes('\n') || + stringValue.includes('\r') + ) { + // Escape double quotes by doubling them and wrap in quotes + return `"${stringValue.replace(/"/g, '""')}"`; + } + + return stringValue; + }; + + // Check if there's any selection + if (!this.selection.selected || this.selection.selected.length === 0) { + this._notifications.showErrorSnackbar('No rows selected for export'); + return; + } + + // Use the displayed columns order from the table + const columnsToExport = this.tableData.displayedDataColumns; + + // Create CSV rows with proper handling of foreign keys + const csv = this.selection.selected.map((row) => + columnsToExport + .map((fieldName) => { + let value = row[fieldName]; + + if (this.isForeignKey(fieldName) && value && typeof value === 'object') { + const foreignKey = this.tableData.foreignKeys[fieldName]; + if (foreignKey) { + value = value[foreignKey.referenced_column_name]; + } + } + + return convertToCSVValue(value); + }) + .join(','), + ); + + // Add header row using the same column order + csv.unshift(columnsToExport.map((h) => convertToCSVValue(h)).join(',')); + const csvArray = csv.join('\r\n'); + + const a = document.createElement('a'); + const blob = new Blob([csvArray], { type: 'text/csv' }); + const url = window.URL.createObjectURL(blob); + + a.href = url; + a.download = 'myFile.csv'; + a.click(); + window.URL.revokeObjectURL(url); + a.remove(); + } } diff --git a/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/db-table-widgets.component.ts b/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/db-table-widgets.component.ts index 0fe5da5bc..43b499808 100644 --- a/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/db-table-widgets.component.ts +++ b/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/db-table-widgets.component.ts @@ -278,6 +278,22 @@ export class DbTableWidgetsComponent implements OnInit { "namespace": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "name": "" } +`, + S3: `// Configure AWS S3 widget for file storage +// bucket: S3 bucket name (required) +// prefix: Optional path prefix for uploaded files +// region: AWS region (default: us-east-1) +// aws_access_key_id_secret_name: Slug of the secret containing AWS Access Key ID +// aws_secret_access_key_secret_name: Slug of the secret containing AWS Secret Access Key +// Note: Create secrets in Settings -> Secrets before configuring this widget + +{ + "bucket": "your-bucket-name", + "prefix": "uploads/", + "region": "us-east-1", + "aws_access_key_id_secret_name": "aws-access-key-id", + "aws_secret_access_key_secret_name": "aws-secret-access-key" +} `, } diff --git a/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/widget/widget.component.ts b/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/widget/widget.component.ts index 5a61eecac..e89c706da 100644 --- a/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/widget/widget.component.ts +++ b/frontend/src/app/components/dashboard/db-table-view/db-table-widgets/widget/widget.component.ts @@ -79,7 +79,7 @@ export class WidgetComponent implements OnInit, OnChanges { Date: 'https://docs.rocketadmin.com/Reference/UI%20Widgets/widgets_management#date-time-and-datetime', DateTime: 'https://docs.rocketadmin.com/Reference/UI%20Widgets/widgets_management#date-time-and-datetime', Time: 'https://docs.rocketadmin.com/Reference/UI%20Widgets/widgets_management#date-time-and-datetime', - + S3: 'https://docs.rocketadmin.com/Reference/UI%20Widgets/widgets_management#s3', }; ngOnInit(): void { diff --git a/frontend/src/app/components/dashboard/db-table-view/saved-filters-panel/saved-filters-panel.component.css b/frontend/src/app/components/dashboard/db-table-view/saved-filters-panel/saved-filters-panel.component.css index 2b7d4de87..9f34a7fdf 100644 --- a/frontend/src/app/components/dashboard/db-table-view/saved-filters-panel/saved-filters-panel.component.css +++ b/frontend/src/app/components/dashboard/db-table-view/saved-filters-panel/saved-filters-panel.component.css @@ -1,39 +1,39 @@ .saved-filters-container { - display: flex; - flex-direction: column; - gap: 8px; + display: flex; + flex-direction: column; + gap: 8px; } .saved-filters-list { - display: flex; - align-items: center; - gap: 16px; + display: flex; + align-items: center; + gap: 16px; } .saved-filters-list__first-time-button { - transition: background 0.3s ease; + transition: background 0.3s ease; } @media (prefers-color-scheme: light) { - .saved-filters-list__first-time-button { - background: var(--color-accentedPalette-50); - border: 1px dashed var(--color-accentedPalette-300); - } + .saved-filters-list__first-time-button { + background: var(--color-accentedPalette-50); + border: 1px dashed var(--color-accentedPalette-300); + } - .saved-filters-list__first-time-button:hover { - background: var(--color-accentedPalette-100) !important; - } + .saved-filters-list__first-time-button:hover { + background: var(--color-accentedPalette-100) !important; + } } @media (prefers-color-scheme: dark) { - .saved-filters-list__first-time-button { - background: var(--color-accentedPalette-900); - border: 1px dashed var(--color-accentedPalette-600); - } + .saved-filters-list__first-time-button { + background: var(--color-accentedPalette-900); + border: 1px dashed var(--color-accentedPalette-600); + } - .saved-filters-list__first-time-button:hover { - background: var(--color-accentedPalette-800) !important; - } + .saved-filters-list__first-time-button:hover { + background: var(--color-accentedPalette-800) !important; + } } /* .saved-filters-tabs { @@ -41,112 +41,112 @@ } */ .saved-filters-tabs ::ng-deep .mat-mdc-standard-chip { - --mdc-chip-container-shape-radius: 4px; - --mdc-chip-outline-width: 1px; - --mdc-chip-elevated-container-color: transparent !important; - --mdc-chip-elevated-selected-container-color: var(--color-accentedPalette-500) !important; - --mdc-chip-container-height: 32px; - --mdc-chip-label-text-color: rgba(0,0,0,0.64); + --mdc-chip-container-shape-radius: 4px; + --mdc-chip-outline-width: 1px; + --mdc-chip-elevated-container-color: transparent !important; + --mdc-chip-elevated-selected-container-color: var(--color-accentedPalette-500) !important; + --mdc-chip-container-height: 32px; + --mdc-chip-label-text-color: rgba(0, 0, 0, 0.64); } @media (prefers-color-scheme: light) { - .saved-filters-tabs ::ng-deep .mat-mdc-standard-chip { - --mdc-chip-outline-color: rgba(0,0,0,0.24); - --mdc-chip-elevated-selected-container-color: var(--color-accentedPalette-500) !important; - --mdc-chip-label-text-color: rgba(0,0,0,0.64); - } + .saved-filters-tabs ::ng-deep .mat-mdc-standard-chip { + --mdc-chip-outline-color: rgba(0, 0, 0, 0.24); + --mdc-chip-elevated-selected-container-color: var(--color-accentedPalette-500) !important; + --mdc-chip-label-text-color: rgba(0, 0, 0, 0.64); + } } @media (prefers-color-scheme: dark) { - .saved-filters-tabs ::ng-deep .mat-mdc-standard-chip { - --mdc-chip-outline-color: rgba(255,255,255,0.24); - --mdc-chip-elevated-selected-container-color: var(--color-accentedPalette-500) !important; - --mdc-chip-label-text-color: rgba(255,255,255,0.64); - } + .saved-filters-tabs ::ng-deep .mat-mdc-standard-chip { + --mdc-chip-outline-color: rgba(255, 255, 255, 0.24); + --mdc-chip-elevated-selected-container-color: var(--color-accentedPalette-500) !important; + --mdc-chip-label-text-color: rgba(255, 255, 255, 0.64); + } } .filters-container { - display: flex; - gap: 20px; - transform: translateX(-10%) scale(0.8); + display: flex; + gap: 20px; + transform: translateX(-10%) scale(0.8); } @media (width <= 600px) { - .filters-container { - flex-direction: column; - transform: none; - } + .filters-container { + flex-direction: column; + transform: none; + } } .dynamic-column-editor { - display: flex; - align-items: center; - gap: 16px; - /* transform: translateX(-20%) scale(0.8); */ - /* transform-origin: center right; */ + display: flex; + align-items: center; + gap: 16px; + /* transform: translateX(-20%) scale(0.8); */ + /* transform-origin: center right; */ } .column-name { - margin-top: -8px; + margin-top: -8px; } .comparator-text { - display: none; + display: none; } @media (width <= 600px) { - .comparator-select { - display: none; - } + .comparator-select { + display: none; + } - .comparator-text { - display: inline; - } + .comparator-text { + display: inline; + } } @media (prefers-color-scheme: light) { - .column-name { - color: rgba(0,0,0,0.64); - } + .column-name { + color: rgba(0, 0, 0, 0.64); + } } @media (prefers-color-scheme: dark) { - .column-name { - color: rgba(255,255,255,0.64); - } + .column-name { + color: rgba(255, 255, 255, 0.64); + } } .column-name strong { - margin-left: 8px; + margin-left: 8px; } .dynamic-column-editor ::ng-deep .foreign-key { - display: block; - min-width: 280px; - margin-bottom: 16px; + display: block; + min-width: 280px; + margin-bottom: 16px; } .dynamic-column-editor ::ng-deep .foreign-key .mat-mdc-form-field-subscript-wrapper, .dynamic-column-editor ::ng-deep .foreign-key .foreign-key__link { - display: none; + display: none; } .static-filters { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 8px; - transform: translateX(5%) scale(1.1); - padding-bottom: 16px; + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 8px; + transform: translateX(5%) scale(1.1); + padding-bottom: 16px; } @media (width <= 600px) { - .static-filters { - transform: none; - } + .static-filters { + transform: none; + } } .static-filter-chip { - cursor: default; + cursor: default; } /* .dynamic-column-editor + .static-filters { diff --git a/frontend/src/app/components/db-table-row-edit/db-table-row-edit.component.html b/frontend/src/app/components/db-table-row-edit/db-table-row-edit.component.html index b7204d8fa..e4b8a42b6 100644 --- a/frontend/src/app/components/db-table-row-edit/db-table-row-edit.component.html +++ b/frontend/src/app/components/db-table-row-edit/db-table-row-edit.component.html @@ -126,7 +126,8 @@

readonly: (!permissions?.edit && pageAction !== 'dub') || pageMode === 'view', disabled: isReadonlyField(value), widgetStructure: tableWidgets[value], - relations: tableTypes[value] === 'foreign key' ? getRelations(value) : undefined + relations: tableTypes[value] === 'foreign key' ? getRelations(value) : undefined, + rowPrimaryKey: keyAttributesFromURL }" [ndcDynamicOutputs]="{ onFieldChange: { handler: updateField, args: ['$event', value] } diff --git a/frontend/src/app/components/login/login.component.ts b/frontend/src/app/components/login/login.component.ts index 6e8a187d6..cb0b0161f 100644 --- a/frontend/src/app/components/login/login.component.ts +++ b/frontend/src/app/components/login/login.component.ts @@ -1,180 +1,184 @@ -import { AfterViewInit, CUSTOM_ELEMENTS_SCHEMA, Component, NgZone, OnInit } from '@angular/core'; -import { AlertActionType, AlertType } from 'src/app/models/alert'; -import { Angulartics2, Angulartics2OnModule } from 'angulartics2'; - -import { AlertComponent } from '../ui-components/alert/alert.component'; -import { AuthService } from 'src/app/services/auth.service'; import { CommonModule } from '@angular/common'; -import { CompanyService } from 'src/app/services/company.service'; -import { EmailValidationDirective } from 'src/app/directives/emailValidator.directive'; -import { ExistingAuthUser } from 'src/app/models/user'; +import { AfterViewInit, Component, CUSTOM_ELEMENTS_SCHEMA, NgZone, OnInit } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; +import { MatDialog } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; -import { NotificationsService } from 'src/app/services/notifications.service'; -import { Router } from '@angular/router'; -import { RouterModule } from '@angular/router'; +import { Router, RouterModule } from '@angular/router'; +import { Angulartics2, Angulartics2OnModule } from 'angulartics2'; import { accounts } from 'google-one-tap'; +import { EmailValidationDirective } from 'src/app/directives/emailValidator.directive'; +import { AlertActionType, AlertType } from 'src/app/models/alert'; +import { ExistingAuthUser } from 'src/app/models/user'; +import { AuthService } from 'src/app/services/auth.service'; +import { CompanyService } from 'src/app/services/company.service'; +import { NotificationsService } from 'src/app/services/notifications.service'; import { environment } from 'src/environments/environment'; -import { MatDialog } from '@angular/material/dialog'; +import { AlertComponent } from '../ui-components/alert/alert.component'; import { SsoDialogComponent } from './sso-dialog/sso-dialog.component'; declare var google: any; @Component({ - selector: 'app-login', - templateUrl: './login.component.html', - styleUrls: ['./login.component.css'], - imports: [ - CommonModule, - FormsModule, - RouterModule, - MatFormFieldModule, - MatInputModule, - MatSelectModule, - MatIconModule, - MatButtonModule, - EmailValidationDirective, - AlertComponent, - Angulartics2OnModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.css'], + imports: [ + CommonModule, + FormsModule, + RouterModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatIconModule, + MatButtonModule, + EmailValidationDirective, + AlertComponent, + Angulartics2OnModule, + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], }) export class LoginComponent implements OnInit, AfterViewInit { - - public isSaas = (environment as any).saas; - public isCustomDomain: boolean = false; - public user: ExistingAuthUser = { - email: '', - password: '', - companyId: '' - }; - public userCompanies: [] = null; - public isLoadingUserCompanies: boolean = false; - public authCode: string; - public submitting: boolean; - public isPasswordFieldShown: boolean = false; - public is2FAShown: boolean = false; - public errors = { - 'No_user_registered_with_this_GitHub_account.': 'No user registered with this GitHub account.', - 'GitHub_login_failed._Please_contact_our_support_team.': 'GitHub login failed. Please contact our support team.' - } - - constructor( - private _auth: AuthService, - public router: Router, - private angulartics2: Angulartics2, - private ngZone: NgZone, - private _notifications: NotificationsService, - public _company: CompanyService, - public dialog: MatDialog, - - ) { } - - ngOnInit(): void { - this.isCustomDomain = this._company.isCustomDomain() && this.isSaas; - - const error = new URLSearchParams(location.search).get('error'); - if (error) this._notifications.showAlert(AlertType.Error, this.errors[error] || error, [ - { - type: AlertActionType.Button, - caption: 'Dismiss', - action: (_id: number) => this._notifications.dismissAlert() - } - ]); - } - - ngAfterViewInit() { - if (this.isSaas) { - const gAccounts: accounts = google.accounts; - gAccounts.id.initialize({ - client_id: "681163285738-e4l0lrv5vv7m616ucrfhnhso9r396lum.apps.googleusercontent.com", - callback: (authUser) => { - this.ngZone.run(() => { - this._auth.loginWithGoogle(authUser.credential).subscribe((res) => { - if (res.isTemporary) this.is2FAShown = true; - this.angulartics2.eventTrack.next({ - action: 'Login: google login success' - }); - }); - }) - } - }); - gAccounts.id.renderButton( - document.getElementById("google_login_button"), - { theme: "outline", size: "large", width: 360, text: "continue_with" } - ); - gAccounts.id.prompt(); - } - } - - requestUserCompanies() { - this.isLoadingUserCompanies = true; - this._auth.fetchUserCompanies(this.user.email) - .subscribe(companies => { - this.angulartics2.eventTrack.next({ - action: 'Login: companies is received', - properties: { - count: companies.length - } - }) - - this.userCompanies = companies; - this.isLoadingUserCompanies = false; - - if (companies.length === 1) { - this.isPasswordFieldShown = true; - this.user.companyId = companies[0].id; - } - }); - } - - loginUser() { - this.submitting = true; - this._auth.loginUser(this.user) - .subscribe((res) => { - this.submitting = false; - if (res.isTemporary) this.is2FAShown = true; - this.angulartics2.eventTrack.next({ - action: 'Login: login success' - }); - }, (_error) => { - this.angulartics2.eventTrack.next({ - action: 'Login: login unsuccessful' - }); - this.submitting = false; - }, () => this.submitting = false) - } - - loginWithGithub() { - this._auth.loginWithGithub(); - this.angulartics2.eventTrack.next({ - action: 'Login: github login redirect' - }); - } - - openLoginWithSSOdialog() { - this.dialog.open(SsoDialogComponent, { - width: '32em' - }); - } - - loginWith2FA() { - this.submitting = true; - this._auth.loginWith2FA(this.authCode) - .subscribe(() => { - this.submitting = false; - this.angulartics2.eventTrack.next({ - action: 'Login: login with 2fa success' - }); - }, (_error) => { - this.angulartics2.eventTrack.next({ - action: 'Login: login with 2fa unsuccessful' - }); - this.submitting = false; - }, () => this.submitting = false) - } + public isSaas = (environment as any).saas; + public isCustomDomain: boolean = false; + public user: ExistingAuthUser = { + email: '', + password: '', + companyId: '', + }; + public userCompanies: [] = null; + public isLoadingUserCompanies: boolean = false; + public authCode: string; + public submitting: boolean; + public isPasswordFieldShown: boolean = false; + public is2FAShown: boolean = false; + public errors = { + 'No_user_registered_with_this_GitHub_account.': 'No user registered with this GitHub account.', + 'GitHub_login_failed._Please_contact_our_support_team.': 'GitHub login failed. Please contact our support team.', + }; + + constructor( + private _auth: AuthService, + public router: Router, + private angulartics2: Angulartics2, + private ngZone: NgZone, + private _notifications: NotificationsService, + public _company: CompanyService, + public dialog: MatDialog, + ) {} + + ngOnInit(): void { + this.isCustomDomain = this._company.isCustomDomain() && this.isSaas; + + const error = new URLSearchParams(location.search).get('error'); + if (error) + this._notifications.showAlert(AlertType.Error, this.errors[error] || error, [ + { + type: AlertActionType.Button, + caption: 'Dismiss', + action: (_id: number) => this._notifications.dismissAlert(), + }, + ]); + } + + ngAfterViewInit() { + if (this.isSaas) { + const gAccounts: accounts = google.accounts; + gAccounts.id.initialize({ + client_id: '681163285738-e4l0lrv5vv7m616ucrfhnhso9r396lum.apps.googleusercontent.com', + callback: (authUser) => { + this.ngZone.run(() => { + this._auth.loginWithGoogle(authUser.credential).subscribe((res) => { + if (res.isTemporary) this.is2FAShown = true; + this.angulartics2.eventTrack.next({ + action: 'Login: google login success', + }); + }); + }); + }, + }); + gAccounts.id.renderButton(document.getElementById('google_login_button'), { + theme: 'outline', + size: 'large', + width: 360, + text: 'continue_with', + }); + gAccounts.id.prompt(); + } + } + + requestUserCompanies() { + this.isLoadingUserCompanies = true; + this._auth.fetchUserCompanies(this.user.email).subscribe((companies) => { + this.angulartics2.eventTrack.next({ + action: 'Login: companies is received', + properties: { + count: companies.length, + }, + }); + + this.userCompanies = companies; + this.isLoadingUserCompanies = false; + + if (companies.length === 1) { + this.isPasswordFieldShown = true; + this.user.companyId = companies[0].id; + } + }); + } + + loginUser() { + this.submitting = true; + this._auth.loginUser(this.user).subscribe( + (res) => { + this.submitting = false; + if (res.isTemporary) this.is2FAShown = true; + this.angulartics2.eventTrack.next({ + action: 'Login: login success', + }); + }, + (_error) => { + this.angulartics2.eventTrack.next({ + action: 'Login: login unsuccessful', + }); + this.submitting = false; + }, + () => (this.submitting = false), + ); + } + + loginWithGithub() { + this._auth.loginWithGithub(); + this.angulartics2.eventTrack.next({ + action: 'Login: github login redirect', + }); + } + + openLoginWithSSOdialog() { + this.dialog.open(SsoDialogComponent, { + width: '32em', + }); + } + + loginWith2FA() { + this.submitting = true; + this._auth.loginWith2FA(this.authCode).subscribe( + () => { + this.submitting = false; + this.angulartics2.eventTrack.next({ + action: 'Login: login with 2fa success', + }); + }, + (_error) => { + this.angulartics2.eventTrack.next({ + action: 'Login: login with 2fa unsuccessful', + }); + this.submitting = false; + }, + () => (this.submitting = false), + ); + } } diff --git a/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.css b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.css new file mode 100644 index 000000000..7c0f62d5d --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.css @@ -0,0 +1,57 @@ +.s3-widget { + display: flex; + flex-direction: column; + gap: 12px; +} + +.s3-widget__key { + width: 100%; +} + +.s3-widget__actions { + display: flex; + gap: 8px; +} + +.s3-widget__actions button { + display: flex; + align-items: center; + gap: 4px; +} + +.s3-widget__preview { + display: flex; + align-items: center; + justify-content: center; + min-height: 100px; + border: 1px dashed #ccc; + border-radius: 4px; + padding: 8px; +} + +.s3-widget__thumbnail { + max-width: 200px; + max-height: 150px; + object-fit: contain; + border-radius: 4px; +} + +.s3-widget__file-icon { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + color: #666; +} + +.s3-widget__file-icon mat-icon { + font-size: 48px; + width: 48px; + height: 48px; +} + +.s3-widget__filename { + font-size: 12px; + word-break: break-all; + text-align: center; +} diff --git a/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.html b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.html new file mode 100644 index 000000000..a124a4e5f --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.html @@ -0,0 +1,37 @@ +
+ + {{normalizedLabel}} + + + +
+ + + +
+ +
+ + Preview +
+ insert_drive_file + {{value | slice:-30}} +
+
+
diff --git a/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.spec.ts b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.spec.ts new file mode 100644 index 000000000..cd1c763c6 --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.spec.ts @@ -0,0 +1,555 @@ +import { + ComponentFixture, + fakeAsync, + TestBed, + tick, +} from "@angular/core/testing"; +import { FormsModule } from "@angular/forms"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { of, Subject, throwError } from "rxjs"; +import { WidgetStructure } from "src/app/models/table"; +import { ConnectionsService } from "src/app/services/connections.service"; +import { S3Service } from "src/app/services/s3.service"; +import { TablesService } from "src/app/services/tables.service"; +import { S3EditComponent } from "./s3.component"; + +describe("S3EditComponent", () => { + let component: S3EditComponent; + let fixture: ComponentFixture; + let fakeS3Service: jasmine.SpyObj; + let fakeConnectionsService: jasmine.SpyObj; + let fakeTablesService: jasmine.SpyObj; + + const mockWidgetStructure: WidgetStructure = { + field_name: "document", + widget_type: "S3", + widget_params: { + bucket: "test-bucket", + prefix: "uploads/", + region: "us-east-1", + aws_access_key_id_secret_name: "aws-key", + aws_secret_access_key_secret_name: "aws-secret", + }, + name: "Document Upload", + description: "Upload documents to S3", + }; + + const mockWidgetStructureStringParams: WidgetStructure = { + field_name: "document", + widget_type: "S3", + widget_params: JSON.stringify({ + bucket: "test-bucket", + prefix: "uploads/", + region: "us-east-1", + aws_access_key_id_secret_name: "aws-key", + aws_secret_access_key_secret_name: "aws-secret", + }) as any, + name: "Document Upload", + description: "Upload documents to S3", + }; + + const mockFileUrlResponse = { + url: "https://s3.amazonaws.com/bucket/file.pdf?signature=abc123", + key: "uploads/file.pdf", + expiresIn: 3600, + }; + + const mockUploadUrlResponse = { + uploadUrl: + "https://s3.amazonaws.com/bucket/uploads/newfile.pdf?signature=xyz789", + key: "uploads/newfile.pdf", + expiresIn: 3600, + }; + + beforeEach(async () => { + fakeS3Service = jasmine.createSpyObj("S3Service", [ + "getFileUrl", + "getUploadUrl", + "uploadToS3", + ]); + fakeConnectionsService = jasmine.createSpyObj("ConnectionsService", [], { + currentConnectionID: "conn-123", + }); + fakeTablesService = jasmine.createSpyObj("TablesService", [], { + currentTableName: "users", + }); + + await TestBed.configureTestingModule({ + imports: [FormsModule, BrowserAnimationsModule, S3EditComponent], + providers: [ + { provide: S3Service, useValue: fakeS3Service }, + { provide: ConnectionsService, useValue: fakeConnectionsService }, + { provide: TablesService, useValue: fakeTablesService }, + ], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(S3EditComponent); + component = fixture.componentInstance; + + component.key = "document"; + component.label = "Document"; + component.widgetStructure = mockWidgetStructure; + component.rowPrimaryKey = { id: 1 }; + }); + + it("should create", () => { + fixture.detectChanges(); + expect(component).toBeTruthy(); + }); + + describe("ngOnInit", () => { + it("should set connectionId and tableName from services", () => { + fixture.detectChanges(); + + expect((component as any).connectionId).toBe("conn-123"); + expect((component as any).tableName).toBe("users"); + }); + + it("should parse widget params from object", () => { + component.widgetStructure = mockWidgetStructure; + fixture.detectChanges(); + + expect(component.params).toEqual({ + bucket: "test-bucket", + prefix: "uploads/", + region: "us-east-1", + aws_access_key_id_secret_name: "aws-key", + aws_secret_access_key_secret_name: "aws-secret", + }); + }); + + it("should parse widget params from string", () => { + component.widgetStructure = mockWidgetStructureStringParams; + fixture.detectChanges(); + + expect(component.params.bucket).toBe("test-bucket"); + }); + + it("should load preview if value is present", () => { + component.value = "uploads/existing-file.pdf"; + fakeS3Service.getFileUrl.and.returnValue(of(mockFileUrlResponse)); + + fixture.detectChanges(); + + expect(fakeS3Service.getFileUrl).toHaveBeenCalledWith( + "conn-123", + "users", + "document", + { id: 1 }, + ); + }); + + it("should not load preview if value is empty", () => { + component.value = ""; + fixture.detectChanges(); + + expect(fakeS3Service.getFileUrl).not.toHaveBeenCalled(); + }); + }); + + describe("ngOnChanges", () => { + it("should load preview when value changes and no preview exists", () => { + fixture.detectChanges(); + fakeS3Service.getFileUrl.and.returnValue(of(mockFileUrlResponse)); + + component.value = "uploads/new-file.pdf"; + component.ngOnChanges(); + + expect(fakeS3Service.getFileUrl).toHaveBeenCalled(); + }); + + it("should not reload preview if already loading", () => { + fixture.detectChanges(); + component.isLoading = true; + component.value = "uploads/file.pdf"; + + component.ngOnChanges(); + + expect(fakeS3Service.getFileUrl).not.toHaveBeenCalled(); + }); + + it("should not reload preview if preview already exists", () => { + fixture.detectChanges(); + component.previewUrl = "https://example.com/preview"; + component.value = "uploads/file.pdf"; + + component.ngOnChanges(); + + expect(fakeS3Service.getFileUrl).not.toHaveBeenCalled(); + }); + }); + + describe("onFileSelected", () => { + it("should upload file and update value on success", fakeAsync(() => { + fixture.detectChanges(); + fakeS3Service.getUploadUrl.and.returnValue(of(mockUploadUrlResponse)); + fakeS3Service.uploadToS3.and.returnValue(of(undefined)); + fakeS3Service.getFileUrl.and.returnValue(of(mockFileUrlResponse)); + + const file = new File(["test content"], "test.pdf", { + type: "application/pdf", + }); + const event = { + target: { + files: [file], + }, + } as unknown as Event; + + spyOn(component.onFieldChange, "emit"); + component.onFileSelected(event); + tick(); + + expect(fakeS3Service.getUploadUrl).toHaveBeenCalledWith( + "conn-123", + "users", + "document", + "test.pdf", + "application/pdf", + ); + expect(fakeS3Service.uploadToS3).toHaveBeenCalledWith( + mockUploadUrlResponse.uploadUrl, + file, + ); + expect(component.value).toBe("uploads/newfile.pdf"); + expect(component.onFieldChange.emit).toHaveBeenCalledWith( + "uploads/newfile.pdf", + ); + })); + + it("should do nothing if no files selected", () => { + fixture.detectChanges(); + const event = { + target: { + files: [], + }, + } as unknown as Event; + + component.onFileSelected(event); + + expect(fakeS3Service.getUploadUrl).not.toHaveBeenCalled(); + }); + + it("should do nothing if files is null", () => { + fixture.detectChanges(); + const event = { + target: { + files: null, + }, + } as unknown as Event; + + component.onFileSelected(event); + + expect(fakeS3Service.getUploadUrl).not.toHaveBeenCalled(); + }); + + it("should set isLoading to true during upload", () => { + fixture.detectChanges(); + fakeS3Service.getUploadUrl.and.returnValue(of(mockUploadUrlResponse)); + // Use a Subject that never emits to keep the upload "in progress" + const pendingUpload$ = new Subject(); + fakeS3Service.uploadToS3.and.returnValue(pendingUpload$.asObservable()); + + const file = new File(["test"], "test.pdf", { type: "application/pdf" }); + const event = { target: { files: [file] } } as unknown as Event; + + component.onFileSelected(event); + + expect(component.isLoading).toBeTrue(); + }); + + it("should set isLoading to false on getUploadUrl error", fakeAsync(() => { + fixture.detectChanges(); + fakeS3Service.getUploadUrl.and.returnValue( + throwError(() => new Error("Upload URL error")), + ); + + const file = new File(["test"], "test.pdf", { type: "application/pdf" }); + const event = { target: { files: [file] } } as unknown as Event; + + component.onFileSelected(event); + tick(); + + expect(component.isLoading).toBeFalse(); + })); + + it("should set isLoading to false on uploadToS3 error", fakeAsync(() => { + fixture.detectChanges(); + fakeS3Service.getUploadUrl.and.returnValue(of(mockUploadUrlResponse)); + fakeS3Service.uploadToS3.and.returnValue( + throwError(() => new Error("S3 upload error")), + ); + + const file = new File(["test"], "test.pdf", { type: "application/pdf" }); + const event = { target: { files: [file] } } as unknown as Event; + + component.onFileSelected(event); + tick(); + + expect(component.isLoading).toBeFalse(); + })); + }); + + describe("openFile", () => { + it("should open preview URL in new tab", () => { + fixture.detectChanges(); + component.previewUrl = "https://s3.amazonaws.com/bucket/file.pdf"; + spyOn(window, "open"); + + component.openFile(); + + expect(window.open).toHaveBeenCalledWith( + "https://s3.amazonaws.com/bucket/file.pdf", + "_blank", + ); + }); + + it("should not open if previewUrl is null", () => { + fixture.detectChanges(); + component.previewUrl = null; + spyOn(window, "open"); + + component.openFile(); + + expect(window.open).not.toHaveBeenCalled(); + }); + }); + + describe("_isImageFile", () => { + const testCases = [ + { key: "photo.jpg", expected: true }, + { key: "photo.JPG", expected: true }, + { key: "photo.jpeg", expected: true }, + { key: "photo.png", expected: true }, + { key: "photo.gif", expected: true }, + { key: "photo.webp", expected: true }, + { key: "photo.svg", expected: true }, + { key: "photo.bmp", expected: true }, + { key: "document.pdf", expected: false }, + { key: "document.doc", expected: false }, + { key: "data.csv", expected: false }, + { key: "archive.zip", expected: false }, + { key: "uploads/folder/photo.png", expected: true }, + { key: "file-without-extension", expected: false }, + ]; + + testCases.forEach(({ key, expected }) => { + it(`should return ${expected} for "${key}"`, () => { + fixture.detectChanges(); + const result = (component as any)._isImageFile(key); + expect(result).toBe(expected); + }); + }); + }); + + describe("_loadPreview", () => { + it("should set previewUrl and isImage on successful load", fakeAsync(() => { + component.value = "uploads/photo.jpg"; + fakeS3Service.getFileUrl.and.returnValue(of(mockFileUrlResponse)); + + fixture.detectChanges(); + tick(); + + expect(component.previewUrl).toBe(mockFileUrlResponse.url); + expect(component.isImage).toBeTrue(); + expect(component.isLoading).toBeFalse(); + })); + + it("should set isImage to false for non-image files", fakeAsync(() => { + component.value = "uploads/document.pdf"; + fakeS3Service.getFileUrl.and.returnValue(of(mockFileUrlResponse)); + + fixture.detectChanges(); + tick(); + + expect(component.isImage).toBeFalse(); + })); + + it("should not load preview if value is empty", () => { + component.value = ""; + fixture.detectChanges(); + + expect(fakeS3Service.getFileUrl).not.toHaveBeenCalled(); + }); + + it("should not load preview if connectionId is missing", () => { + (component as any).connectionId = ""; + component.value = "uploads/file.pdf"; + (component as any)._loadPreview(); + + expect(fakeS3Service.getFileUrl).not.toHaveBeenCalled(); + }); + + it("should not load preview if tableName is missing", () => { + fixture.detectChanges(); + (component as any).tableName = ""; + component.value = "uploads/file.pdf"; + fakeS3Service.getFileUrl.calls.reset(); + + (component as any)._loadPreview(); + + expect(fakeS3Service.getFileUrl).not.toHaveBeenCalled(); + }); + + it("should not load preview if rowPrimaryKey is missing", () => { + component.rowPrimaryKey = null as any; + component.value = "uploads/file.pdf"; + fixture.detectChanges(); + + expect(fakeS3Service.getFileUrl).not.toHaveBeenCalled(); + }); + + it("should set isLoading to false on error", fakeAsync(() => { + component.value = "uploads/file.pdf"; + fakeS3Service.getFileUrl.and.returnValue( + throwError(() => new Error("File URL error")), + ); + + fixture.detectChanges(); + tick(); + + expect(component.isLoading).toBeFalse(); + })); + }); + + describe("_parseWidgetParams", () => { + it("should handle undefined widgetStructure gracefully", () => { + component.widgetStructure = undefined as any; + fixture.detectChanges(); + + expect(component.params).toBeUndefined(); + }); + + it("should handle null widget_params gracefully", () => { + component.widgetStructure = { + ...mockWidgetStructure, + widget_params: null as any, + }; + fixture.detectChanges(); + + expect(component.params).toBeUndefined(); + }); + + it("should handle invalid JSON string gracefully", () => { + spyOn(console, "error"); + component.widgetStructure = { + ...mockWidgetStructure, + widget_params: "invalid json" as any, + }; + fixture.detectChanges(); + + expect(console.error).toHaveBeenCalled(); + }); + }); + + describe("template integration", () => { + beforeEach(() => { + fixture.detectChanges(); + }); + + it("should display label in form field", () => { + const label = fixture.nativeElement.querySelector("mat-label"); + expect(label.textContent).toContain("Document"); + }); + + it("should show upload button", () => { + const uploadButton = fixture.nativeElement.querySelector("button"); + expect(uploadButton.textContent).toContain("Upload"); + }); + + it("should disable upload button when disabled", () => { + component.disabled = true; + fixture.detectChanges(); + + const uploadButton = fixture.nativeElement.querySelector("button"); + expect(uploadButton.disabled).toBeTrue(); + }); + + it("should disable upload button when readonly", () => { + component.readonly = true; + fixture.detectChanges(); + + const uploadButton = fixture.nativeElement.querySelector("button"); + expect(uploadButton.disabled).toBeTrue(); + }); + + it("should disable upload button when loading", () => { + component.isLoading = true; + fixture.detectChanges(); + + const uploadButton = fixture.nativeElement.querySelector("button"); + expect(uploadButton.disabled).toBeTrue(); + }); + + it("should show open button when previewUrl exists", () => { + component.previewUrl = "https://example.com/file.pdf"; + fixture.detectChanges(); + + const buttons = fixture.nativeElement.querySelectorAll("button"); + const openButton = Array.from(buttons).find((b: any) => + b.textContent.includes("Open"), + ); + expect(openButton).toBeTruthy(); + }); + + it("should not show open button when previewUrl is null", () => { + component.previewUrl = null; + fixture.detectChanges(); + + const buttons = fixture.nativeElement.querySelectorAll("button"); + const openButton = Array.from(buttons).find((b: any) => + b.textContent.includes("Open"), + ); + expect(openButton).toBeFalsy(); + }); + + it("should show spinner when loading", () => { + component.value = "uploads/file.pdf"; + component.isLoading = true; + fixture.detectChanges(); + + const spinner = fixture.nativeElement.querySelector("mat-spinner"); + expect(spinner).toBeTruthy(); + }); + + it("should show image preview for image files", () => { + component.value = "uploads/photo.jpg"; + component.isImage = true; + component.previewUrl = "https://example.com/photo.jpg"; + component.isLoading = false; + fixture.detectChanges(); + + const img = fixture.nativeElement.querySelector(".s3-widget__thumbnail"); + expect(img).toBeTruthy(); + expect(img.src).toBe("https://example.com/photo.jpg"); + }); + + it("should show file icon for non-image files", () => { + component.value = "uploads/document.pdf"; + component.isImage = false; + component.previewUrl = "https://example.com/document.pdf"; + component.isLoading = false; + fixture.detectChanges(); + + const fileIcon = fixture.nativeElement.querySelector( + ".s3-widget__file-icon", + ); + expect(fileIcon).toBeTruthy(); + }); + + it("should show truncated filename for long filenames", () => { + component.value = + "uploads/very-long-filename-that-should-be-truncated.pdf"; + component.isImage = false; + component.previewUrl = "https://example.com/file.pdf"; + component.isLoading = false; + fixture.detectChanges(); + + const filename = fixture.nativeElement.querySelector( + ".s3-widget__filename", + ); + expect(filename).toBeTruthy(); + }); + }); +}); diff --git a/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.ts b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.ts new file mode 100644 index 000000000..cbf3ef7ad --- /dev/null +++ b/frontend/src/app/components/ui-components/record-edit-fields/s3/s3.component.ts @@ -0,0 +1,169 @@ +import { CommonModule } from "@angular/common"; +import { Component, Input, OnInit } from "@angular/core"; +import { FormsModule } from "@angular/forms"; +import { MatButtonModule } from "@angular/material/button"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatIconModule } from "@angular/material/icon"; +import { MatInputModule } from "@angular/material/input"; +import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; +import { ConnectionsService } from "src/app/services/connections.service"; +import { S3Service } from "src/app/services/s3.service"; +import { TablesService } from "src/app/services/tables.service"; +import { BaseEditFieldComponent } from "../base-row-field/base-row-field.component"; + +interface S3WidgetParams { + bucket: string; + prefix?: string; + region?: string; + aws_access_key_id_secret_name: string; + aws_secret_access_key_secret_name: string; +} + +@Component({ + selector: "app-edit-s3", + templateUrl: "./s3.component.html", + styleUrl: "./s3.component.css", + imports: [ + CommonModule, + FormsModule, + MatFormFieldModule, + MatInputModule, + MatButtonModule, + MatIconModule, + MatProgressSpinnerModule, + ], +}) +export class S3EditComponent extends BaseEditFieldComponent implements OnInit { + @Input() value: string; + @Input() rowPrimaryKey: Record; + + public params: S3WidgetParams; + public previewUrl: string | null = null; + public isImage: boolean = false; + public isLoading: boolean = false; + + private connectionId: string; + private tableName: string; + + constructor( + private s3Service: S3Service, + private connectionsService: ConnectionsService, + private tablesService: TablesService, + ) { + super(); + } + + ngOnInit(): void { + super.ngOnInit(); + this.connectionId = this.connectionsService.currentConnectionID; + this.tableName = this.tablesService.currentTableName; + this._parseWidgetParams(); + if (this.value) { + this._loadPreview(); + } + } + + ngOnChanges(): void { + this._parseWidgetParams(); + if (this.value && !this.previewUrl && !this.isLoading) { + this._loadPreview(); + } + } + + onFileSelected(event: Event): void { + const input = event.target as HTMLInputElement; + if (!input.files?.length) return; + + const file = input.files[0]; + this.isLoading = true; + + this.s3Service + .getUploadUrl( + this.connectionId, + this.tableName, + this.widgetStructure.field_name, + file.name, + file.type, + ) + .subscribe({ + next: (response) => { + this.s3Service.uploadToS3(response.uploadUrl, file).subscribe({ + next: () => { + this.value = response.key; + this.onFieldChange.emit(response.key); + this._loadPreview(); + }, + error: () => { + this.isLoading = false; + }, + }); + }, + error: () => { + this.isLoading = false; + }, + }); + } + + openFile(): void { + if (this.previewUrl) { + window.open(this.previewUrl, "_blank"); + } + } + + private _parseWidgetParams(): void { + if (this.widgetStructure?.widget_params) { + try { + this.params = + typeof this.widgetStructure.widget_params === "string" + ? JSON.parse(this.widgetStructure.widget_params) + : this.widgetStructure.widget_params; + } catch (e) { + console.error("Error parsing S3 widget params:", e); + } + } + } + + private _loadPreview(): void { + if ( + !this.value || + !this.connectionId || + !this.tableName || + !this.rowPrimaryKey + ) + return; + + this.isLoading = true; + this.isImage = this._isImageFile(this.value); + + this.s3Service + .getFileUrl( + this.connectionId, + this.tableName, + this.widgetStructure.field_name, + this.rowPrimaryKey, + ) + .subscribe({ + next: (response) => { + this.previewUrl = response.url; + this.isLoading = false; + }, + error: () => { + this.isLoading = false; + }, + }); + } + + private _isImageFile(key: string): boolean { + const imageExtensions = [ + ".jpg", + ".jpeg", + ".png", + ".gif", + ".webp", + ".svg", + ".bmp", + ]; + const lowerKey = key.toLowerCase(); + return imageExtensions.some((ext) => lowerKey.endsWith(ext)); + } +} diff --git a/frontend/src/app/consts/record-edit-types.ts b/frontend/src/app/consts/record-edit-types.ts index 18505d969..568d384e7 100644 --- a/frontend/src/app/consts/record-edit-types.ts +++ b/frontend/src/app/consts/record-edit-types.ts @@ -27,6 +27,7 @@ import { TimeIntervalEditComponent } from '../components/ui-components/record-ed import { TimezoneEditComponent } from '../components/ui-components/record-edit-fields/timezone/timezone.component'; import { UrlEditComponent } from '../components/ui-components/record-edit-fields/url/url.component'; import { UuidEditComponent } from '../components/ui-components/record-edit-fields/uuid/uuid.component'; +import { S3EditComponent } from '../components/ui-components/record-edit-fields/s3/s3.component'; export const timestampTypes = ['timestamp without time zone', 'timestamp with time zone', 'timestamp', 'date', 'time without time zone', 'time with time zone' , 'time', 'datetime', 'date time', 'datetime2', 'datetimeoffset', 'curdate', 'curtime', 'now', 'localtime', 'localtimestamp']; export const defaultTimestampValues = { @@ -61,6 +62,7 @@ export const UIwidgets = { Timezone: TimezoneEditComponent, URL: UrlEditComponent, UUID: UuidEditComponent, + S3: S3EditComponent, } export const recordEditTypes = { diff --git a/frontend/src/app/services/s3.service.spec.ts b/frontend/src/app/services/s3.service.spec.ts new file mode 100644 index 000000000..240f6fa28 --- /dev/null +++ b/frontend/src/app/services/s3.service.spec.ts @@ -0,0 +1,331 @@ +import { provideHttpClient } from "@angular/common/http"; +import { + HttpTestingController, + provideHttpClientTesting, +} from "@angular/common/http/testing"; +import { TestBed } from "@angular/core/testing"; +import { MatSnackBarModule } from "@angular/material/snack-bar"; +import { NotificationsService } from "./notifications.service"; +import { S3Service } from "./s3.service"; + +describe("S3Service", () => { + let service: S3Service; + let httpMock: HttpTestingController; + let fakeNotifications: jasmine.SpyObj; + + const mockFileUrlResponse = { + url: "https://s3.amazonaws.com/bucket/file.pdf?signature=abc123", + key: "prefix/file.pdf", + expiresIn: 3600, + }; + + const mockUploadUrlResponse = { + uploadUrl: + "https://s3.amazonaws.com/bucket/prefix/newfile.pdf?signature=xyz789", + key: "prefix/newfile.pdf", + expiresIn: 3600, + }; + + const fakeError = { + message: "Something went wrong", + statusCode: 400, + }; + + beforeEach(() => { + fakeNotifications = jasmine.createSpyObj("NotificationsService", [ + "showAlert", + "dismissAlert", + ]); + + TestBed.configureTestingModule({ + imports: [MatSnackBarModule], + providers: [ + provideHttpClient(), + provideHttpClientTesting(), + S3Service, + { provide: NotificationsService, useValue: fakeNotifications }, + ], + }); + + service = TestBed.inject(S3Service); + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + it("should be created", () => { + expect(service).toBeTruthy(); + }); + + describe("getFileUrl", () => { + const connectionId = "conn-123"; + const tableName = "users"; + const fieldName = "avatar"; + const rowPrimaryKey = { id: 1 }; + + it("should fetch file URL successfully", () => { + let result: any; + + service + .getFileUrl(connectionId, tableName, fieldName, rowPrimaryKey) + .subscribe((res) => { + result = res; + }); + + const req = httpMock.expectOne( + (request) => + request.url === `/s3/file/${connectionId}` && + request.params.get("tableName") === tableName && + request.params.get("fieldName") === fieldName && + request.params.get("rowPrimaryKey") === JSON.stringify(rowPrimaryKey), + ); + expect(req.request.method).toBe("GET"); + req.flush(mockFileUrlResponse); + + expect(result).toEqual(mockFileUrlResponse); + }); + + it("should handle complex primary key", () => { + const complexPrimaryKey = { user_id: 1, org_id: "abc" }; + let result: any; + + service + .getFileUrl(connectionId, tableName, fieldName, complexPrimaryKey) + .subscribe((res) => { + result = res; + }); + + const req = httpMock.expectOne( + (request) => + request.url === `/s3/file/${connectionId}` && + request.params.get("rowPrimaryKey") === + JSON.stringify(complexPrimaryKey), + ); + req.flush(mockFileUrlResponse); + + expect(result).toEqual(mockFileUrlResponse); + }); + + it("should show error alert on failure", async () => { + const promise = service + .getFileUrl(connectionId, tableName, fieldName, rowPrimaryKey) + .toPromise(); + + const req = httpMock.expectOne( + (request) => request.url === `/s3/file/${connectionId}`, + ); + req.flush(fakeError, { status: 400, statusText: "Bad Request" }); + + await promise; + + expect(fakeNotifications.showAlert).toHaveBeenCalledWith( + jasmine.anything(), + jasmine.objectContaining({ + abstract: "Failed to get S3 file URL", + details: fakeError.message, + }), + jasmine.any(Array), + ); + }); + + it("should return EMPTY observable on error", (done) => { + let completed = false; + let emitted = false; + + service + .getFileUrl(connectionId, tableName, fieldName, rowPrimaryKey) + .subscribe({ + next: () => { + emitted = true; + }, + complete: () => { + completed = true; + expect(emitted).toBeFalse(); + done(); + }, + }); + + const req = httpMock.expectOne( + (request) => request.url === `/s3/file/${connectionId}`, + ); + req.flush(fakeError, { status: 400, statusText: "Bad Request" }); + }); + }); + + describe("getUploadUrl", () => { + const connectionId = "conn-123"; + const tableName = "users"; + const fieldName = "avatar"; + const filename = "document.pdf"; + const contentType = "application/pdf"; + + it("should fetch upload URL successfully", () => { + let result: any; + + service + .getUploadUrl(connectionId, tableName, fieldName, filename, contentType) + .subscribe((res) => { + result = res; + }); + + const req = httpMock.expectOne( + (request) => + request.url === `/s3/upload-url/${connectionId}` && + request.params.get("tableName") === tableName && + request.params.get("fieldName") === fieldName, + ); + expect(req.request.method).toBe("POST"); + expect(req.request.body).toEqual({ filename, contentType }); + req.flush(mockUploadUrlResponse); + + expect(result).toEqual(mockUploadUrlResponse); + }); + + it("should handle image upload", () => { + const imageFilename = "photo.jpg"; + const imageContentType = "image/jpeg"; + + service + .getUploadUrl( + connectionId, + tableName, + fieldName, + imageFilename, + imageContentType, + ) + .subscribe(); + + const req = httpMock.expectOne( + (request) => request.url === `/s3/upload-url/${connectionId}`, + ); + expect(req.request.body).toEqual({ + filename: imageFilename, + contentType: imageContentType, + }); + req.flush(mockUploadUrlResponse); + }); + + it("should show error alert on failure", async () => { + const promise = service + .getUploadUrl(connectionId, tableName, fieldName, filename, contentType) + .toPromise(); + + const req = httpMock.expectOne( + (request) => request.url === `/s3/upload-url/${connectionId}`, + ); + req.flush(fakeError, { status: 400, statusText: "Bad Request" }); + + await promise; + + expect(fakeNotifications.showAlert).toHaveBeenCalledWith( + jasmine.anything(), + jasmine.objectContaining({ + abstract: "Failed to get upload URL", + details: fakeError.message, + }), + jasmine.any(Array), + ); + }); + + it("should return EMPTY observable on error", (done) => { + let emitted = false; + + service + .getUploadUrl(connectionId, tableName, fieldName, filename, contentType) + .subscribe({ + next: () => { + emitted = true; + }, + complete: () => { + expect(emitted).toBeFalse(); + done(); + }, + }); + + const req = httpMock.expectOne( + (request) => request.url === `/s3/upload-url/${connectionId}`, + ); + req.flush(fakeError, { status: 400, statusText: "Bad Request" }); + }); + }); + + describe("uploadToS3", () => { + const uploadUrl = + "https://s3.amazonaws.com/bucket/file.pdf?signature=abc123"; + + it("should upload file to S3 successfully", () => { + const file = new File(["test content"], "test.pdf", { + type: "application/pdf", + }); + let completed = false; + + service.uploadToS3(uploadUrl, file).subscribe({ + complete: () => { + completed = true; + }, + }); + + const req = httpMock.expectOne(uploadUrl); + expect(req.request.method).toBe("PUT"); + expect(req.request.headers.get("Content-Type")).toBe("application/pdf"); + expect(req.request.body).toBe(file); + req.flush(null); + + expect(completed).toBeTrue(); + }); + + it("should upload image file with correct content type", () => { + const file = new File(["image data"], "photo.jpg", { + type: "image/jpeg", + }); + + service.uploadToS3(uploadUrl, file).subscribe(); + + const req = httpMock.expectOne(uploadUrl); + expect(req.request.headers.get("Content-Type")).toBe("image/jpeg"); + req.flush(null); + }); + + it("should show error alert on upload failure", async () => { + const file = new File(["test content"], "test.pdf", { + type: "application/pdf", + }); + const promise = service.uploadToS3(uploadUrl, file).toPromise(); + + const req = httpMock.expectOne(uploadUrl); + req.flush(null, { status: 500, statusText: "Internal Server Error" }); + + await promise; + + expect(fakeNotifications.showAlert).toHaveBeenCalledWith( + jasmine.anything(), + jasmine.objectContaining({ + abstract: "File upload failed", + }), + jasmine.any(Array), + ); + }); + + it("should return EMPTY observable on error", (done) => { + const file = new File(["test content"], "test.pdf", { + type: "application/pdf", + }); + let emitted = false; + + service.uploadToS3(uploadUrl, file).subscribe({ + next: () => { + emitted = true; + }, + complete: () => { + expect(emitted).toBeFalse(); + done(); + }, + }); + + const req = httpMock.expectOne(uploadUrl); + req.flush(null, { status: 500, statusText: "Internal Server Error" }); + }); + }); +}); diff --git a/frontend/src/app/services/s3.service.ts b/frontend/src/app/services/s3.service.ts new file mode 100644 index 000000000..486c105de --- /dev/null +++ b/frontend/src/app/services/s3.service.ts @@ -0,0 +1,119 @@ +import { HttpClient } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { catchError, EMPTY, Observable } from "rxjs"; +import { AlertActionType, AlertType } from "../models/alert"; +import { NotificationsService } from "./notifications.service"; + +interface S3FileUrlResponse { + url: string; + key: string; + expiresIn: number; +} + +interface S3UploadUrlResponse { + uploadUrl: string; + key: string; + expiresIn: number; +} + +@Injectable({ + providedIn: "root", +}) +export class S3Service { + constructor( + private http: HttpClient, + private notifications: NotificationsService, + ) {} + + getFileUrl( + connectionId: string, + tableName: string, + fieldName: string, + rowPrimaryKey: Record, + ): Observable { + return this.http + .get(`/s3/file/${connectionId}`, { + params: { + tableName, + fieldName, + rowPrimaryKey: JSON.stringify(rowPrimaryKey), + }, + }) + .pipe( + catchError((err) => { + this.notifications.showAlert( + AlertType.Error, + { + abstract: "Failed to get S3 file URL", + details: err.error?.message, + }, + [ + { + type: AlertActionType.Button, + caption: "Dismiss", + action: () => this.notifications.dismissAlert(), + }, + ], + ); + return EMPTY; + }), + ); + } + + getUploadUrl( + connectionId: string, + tableName: string, + fieldName: string, + filename: string, + contentType: string, + ): Observable { + return this.http + .post( + `/s3/upload-url/${connectionId}`, + { filename, contentType }, + { params: { tableName, fieldName } }, + ) + .pipe( + catchError((err) => { + this.notifications.showAlert( + AlertType.Error, + { + abstract: "Failed to get upload URL", + details: err.error?.message, + }, + [ + { + type: AlertActionType.Button, + caption: "Dismiss", + action: () => this.notifications.dismissAlert(), + }, + ], + ); + return EMPTY; + }), + ); + } + + uploadToS3(uploadUrl: string, file: File): Observable { + return this.http + .put(uploadUrl, file, { + headers: { "Content-Type": file.type }, + }) + .pipe( + catchError((err) => { + this.notifications.showAlert( + AlertType.Error, + { abstract: "File upload failed", details: err.message }, + [ + { + type: AlertActionType.Button, + caption: "Dismiss", + action: () => this.notifications.dismissAlert(), + }, + ], + ); + return EMPTY; + }), + ); + } +} diff --git a/frontend/src/environments/environment.dev.ts b/frontend/src/environments/environment.dev.ts index a78ef43c1..9490b3494 100644 --- a/frontend/src/environments/environment.dev.ts +++ b/frontend/src/environments/environment.dev.ts @@ -1,9 +1,9 @@ export const environment = { - production: false, - saas: false, - apiRoot: "https://app.rocketadmin.com/api", - saasURL: "https://app.rocketadmin.com", - saasHostnames: ['localhost', '127.0.0.1'], - stagingHost: "", - version: '0.0.0' + production: false, + saas: false, + apiRoot: 'https://app.rocketadmin.com/api', + saasURL: 'https://app.rocketadmin.com', + saasHostnames: ['localhost', '127.0.0.1'], + stagingHost: '', + version: '0.0.0', }; diff --git a/justfile b/justfile index c46044740..03b0817cf 100644 --- a/justfile +++ b/justfile @@ -1,2 +1,2 @@ test args='test/ava-tests/non-saas-tests/*': - EXTRA_ARGS="{{args}}" docker compose -f docker-compose.tst.yml up --abort-on-container-exit --force-recreate --build --attach=backend_test --no-log-prefix + EXTRA_ARGS="{{args}}" docker compose -f docker-compose.tst.yml up --abort-on-container-exit --force-recreate --build --attach=backend --no-log-prefix diff --git a/package.json b/package.json index 383716007..4ac591705 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,31 @@ { - "name": "root", - "private": true, - "workspaces": [ - "backend", - "rocketadmin-agent", - "shared-code" - ], - "packageManager": "yarn@3.4.1", - "dependencies": { - "monaco-editor": "^0.53.0" - }, - "resolutions": { - "cipher-base": "1.0.7", - "tar-fs": "1.16.6" - }, - "scripts": { - "lint": "biome lint" - }, - "devDependencies": { - "@biomejs/biome": "2.3.8" - } + "name": "root", + "private": true, + "workspaces": [ + "backend", + "rocketadmin-agent", + "shared-code" + ], + "packageManager": "yarn@3.4.1", + "dependencies": { + "monaco-editor": "^0.53.0" + }, + "resolutions": { + "cipher-base": "1.0.7", + "tar-fs": "1.16.6" + }, + "scripts": { + "lint": "biome lint", + "prepare": "husky" + }, + "devDependencies": { + "@biomejs/biome": "2.3.8", + "husky": "^9.1.7", + "lint-staged": "^16.2.7" + }, + "lint-staged": { + "*.{js,ts,jsx,tsx,json,html,css}": [ + "biome check --write" + ] + } } diff --git a/rocketadmin-agent/package.json b/rocketadmin-agent/package.json index 7dec77e30..9c4032e9f 100644 --- a/rocketadmin-agent/package.json +++ b/rocketadmin-agent/package.json @@ -1,44 +1,43 @@ { - "name": "rocketadmin-agent", - "version": "0.0.1", - "description": "RocketAdmin Agent - Connect your database to RocketAdmin through a secure agent", - "author": "RocketAdmin", - "private": true, - "license": "UNLICENSED", - "type": "module", - "bin": "./dist/main.js", - "scripts": { - "prebuild": "rimraf dist", - "build": "tsc -p tsconfig.build.json", - "start": "node dist/main.js", - "start:dev": "tsc -p tsconfig.build.json && node dist/main.js", - "start:debug": "node --inspect dist/main.js", - "start:prod": "node dist/main.js" - - }, - "dependencies": { - "@azure/core-tracing": "^1.3.1", - "@rocketadmin/shared-code": "workspace:*", - "argon2": "^0.44.0", - "chalk": "^5.6.2", - "commander": "^14.0.2", - "crypto-js": "^4.2.0", - "dotenv": "^17.2.3", - "inquirer": "^13.1.0", - "ora": "^9.0.0", - "rimraf": "^6.1.2", - "wait-on": "^9.0.3", - "winston": "^3.19.0", - "ws": "^8.18.3", - "yarn": "^1.22.22" - }, - "devDependencies": { - "@types/inquirer": "^9.0.9", - "@types/node": "^24.9.1", - "@types/ws": "^8.18.1", - "ts-loader": "^9.5.4", - "ts-node": "^10.9.2", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.9.3" - } + "name": "rocketadmin-agent", + "version": "0.0.1", + "description": "RocketAdmin Agent - Connect your database to RocketAdmin through a secure agent", + "author": "RocketAdmin", + "private": true, + "license": "UNLICENSED", + "type": "module", + "bin": "./dist/main.js", + "scripts": { + "prebuild": "rimraf dist", + "build": "tsc -p tsconfig.build.json", + "start": "node dist/main.js", + "start:dev": "tsc -p tsconfig.build.json && node dist/main.js", + "start:debug": "node --inspect dist/main.js", + "start:prod": "node dist/main.js" + }, + "dependencies": { + "@azure/core-tracing": "^1.3.1", + "@rocketadmin/shared-code": "workspace:*", + "argon2": "^0.44.0", + "chalk": "^5.6.2", + "commander": "^14.0.2", + "crypto-js": "^4.2.0", + "dotenv": "^17.2.3", + "inquirer": "^13.1.0", + "ora": "^9.0.0", + "rimraf": "^6.1.2", + "wait-on": "^9.0.3", + "winston": "^3.19.0", + "ws": "^8.18.3", + "yarn": "^1.22.22" + }, + "devDependencies": { + "@types/inquirer": "^9.0.9", + "@types/node": "^24.9.1", + "@types/ws": "^8.18.1", + "ts-loader": "^9.5.4", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.9.3" + } } diff --git a/shared-code/package.json b/shared-code/package.json index 97fb0f4a4..ffb95199a 100644 --- a/shared-code/package.json +++ b/shared-code/package.json @@ -1,47 +1,47 @@ { - "name": "@rocketadmin/shared-code", - "version": "1.0.0", - "description": "shared code for rocketadmin backend and client applications (agent version, cli version)", - "type": "module", - "packageExtensions": { - "ibm_db": { - "dependencies": { - "node-gyp": "^11.5.0" - } - } - }, - "dependencies": { - "@aws-sdk/client-dynamodb": "^3.952.0", - "@aws-sdk/lib-dynamodb": "^3.952.0", - "@clickhouse/client": "^1.15.0", - "@elastic/elasticsearch": "8.18.1", - "@types/multer": "^2.0.0", - "axios": "^1.13.2", - "cassandra-driver": "^4.8.0", - "csv": "^6.4.1", - "get-port": "^7.1.0", - "jsonwebtoken": "^9.0.3", - "knex": "^3.1.0", - "lru-cache": "^11.2.4", - "mongodb": "^7.0.0", - "mysql2": "^3.16.0", - "nanoid": "^5.1.6", - "oracledb": "^6.10.0", - "p-queue": "^9.0.1", - "pg": "^8.16.3", - "pg-copy-streams": "^7.0.0", - "pg-query-stream": "^4.10.3", - "redis": "^5.10.0", - "ssh2": "^1.17.0", - "tedious": "^19.1.3", - "tunnel-ssh": "5.2.0" - }, - "optionalDependencies": { - "ibm_db": "3.3.0" - }, - "devDependencies": { - "@types/oracledb": "^6.10.0", - "@types/pg-copy-streams": "^1.2.5", - "typescript": "^5.9.3" - } + "name": "@rocketadmin/shared-code", + "version": "1.0.0", + "description": "shared code for rocketadmin backend and client applications (agent version, cli version)", + "type": "module", + "packageExtensions": { + "ibm_db": { + "dependencies": { + "node-gyp": "^11.5.0" + } + } + }, + "dependencies": { + "@aws-sdk/client-dynamodb": "^3.952.0", + "@aws-sdk/lib-dynamodb": "^3.952.0", + "@clickhouse/client": "^1.15.0", + "@elastic/elasticsearch": "8.18.1", + "@types/multer": "^2.0.0", + "axios": "^1.13.2", + "cassandra-driver": "^4.8.0", + "csv": "^6.4.1", + "get-port": "^7.1.0", + "jsonwebtoken": "^9.0.3", + "knex": "^3.1.0", + "lru-cache": "^11.2.4", + "mongodb": "^7.0.0", + "mysql2": "^3.16.0", + "nanoid": "^5.1.6", + "oracledb": "^6.10.0", + "p-queue": "^9.0.1", + "pg": "^8.16.3", + "pg-copy-streams": "^7.0.0", + "pg-query-stream": "^4.10.3", + "redis": "^5.10.0", + "ssh2": "^1.17.0", + "tedious": "^19.1.3", + "tunnel-ssh": "5.2.0" + }, + "optionalDependencies": { + "ibm_db": "3.3.0" + }, + "devDependencies": { + "@types/oracledb": "^6.10.0", + "@types/pg-copy-streams": "^1.2.5", + "typescript": "^5.9.3" + } } diff --git a/shared-code/src/data-access-layer/data-access-objects/data-access-object-redis.ts b/shared-code/src/data-access-layer/data-access-objects/data-access-object-redis.ts index 1a11d7e32..fb9ebba52 100644 --- a/shared-code/src/data-access-layer/data-access-objects/data-access-object-redis.ts +++ b/shared-code/src/data-access-layer/data-access-objects/data-access-object-redis.ts @@ -1,12 +1,16 @@ /* eslint-disable security/detect-object-injection */ + +import { Readable, Stream } from 'node:stream'; import * as csv from 'csv'; import getPort from 'get-port'; import { nanoid } from 'nanoid'; -import { Readable, Stream } from 'node:stream'; import { createClient, RedisClientType } from 'redis'; import { LRUStorage } from '../../caching/lru-storage.js'; -import { getTunnel } from '../../helpers/get-ssh-tunnel.js'; import { DAO_CONSTANTS } from '../../helpers/data-access-objects-constants.js'; +import { getTunnel } from '../../helpers/get-ssh-tunnel.js'; +import { FilterCriteriaEnum } from '../../shared/enums/filter-criteria.enum.js'; +import { IDataAccessObject } from '../../shared/interfaces/data-access-object.interface.js'; +import { isRedisConnectionUrl } from '../shared/create-data-access-object.js'; import { AutocompleteFieldsDS } from '../shared/data-structures/autocomplete-fields.ds.js'; import { ConnectionParams } from '../shared/data-structures/connections-params.ds.js'; import { FilteringFieldsDS } from '../shared/data-structures/filtering-fields.ds.js'; @@ -14,15 +18,12 @@ import { ForeignKeyDS } from '../shared/data-structures/foreign-key.ds.js'; import { FoundRowsDS } from '../shared/data-structures/found-rows.ds.js'; import { PrimaryKeyDS } from '../shared/data-structures/primary-key.ds.js'; import { ReferencedTableNamesAndColumnsDS } from '../shared/data-structures/referenced-table-names-columns.ds.js'; +import { TableDS } from '../shared/data-structures/table.ds.js'; import { TableSettingsDS } from '../shared/data-structures/table-settings.ds.js'; import { TableStructureDS } from '../shared/data-structures/table-structure.ds.js'; -import { TableDS } from '../shared/data-structures/table.ds.js'; import { TestConnectionResultDS } from '../shared/data-structures/test-result-connection.ds.js'; import { ValidateTableSettingsDS } from '../shared/data-structures/validate-table-settings.ds.js'; -import { FilterCriteriaEnum } from '../../shared/enums/filter-criteria.enum.js'; -import { IDataAccessObject } from '../../shared/interfaces/data-access-object.interface.js'; import { BasicDataAccessObject } from './basic-data-access-object.js'; -import { isRedisConnectionUrl } from '../shared/create-data-access-object.js'; enum RedisTableType { PREFIXED_KEYS = 'prefixed_keys', diff --git a/shared-code/src/shared/enums/table-widget-type.enum.ts b/shared-code/src/shared/enums/table-widget-type.enum.ts index 745996e62..12dd6a13a 100644 --- a/shared-code/src/shared/enums/table-widget-type.enum.ts +++ b/shared-code/src/shared/enums/table-widget-type.enum.ts @@ -22,4 +22,5 @@ export enum TableWidgetTypeEnum { Color = 'Color', Range = 'Range', Timezone = 'Timezone', + S3 = 'S3', } diff --git a/yarn.lock b/yarn.lock index 6cdf041f2..9dc86f22f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -164,6 +164,31 @@ __metadata: languageName: node linkType: hard +"@aws-crypto/crc32c@npm:5.2.0": + version: 5.2.0 + resolution: "@aws-crypto/crc32c@npm:5.2.0" + dependencies: + "@aws-crypto/util": ^5.2.0 + "@aws-sdk/types": ^3.222.0 + tslib: ^2.6.2 + checksum: 0b399de8607c59e1e46c05d2b24a16b56d507944fdac925c611f0ba7302f5555c098139806d7da1ebef1f89bf4e4b5d4dec74d4809ce0f18238b72072065effe + languageName: node + linkType: hard + +"@aws-crypto/sha1-browser@npm:5.2.0": + version: 5.2.0 + resolution: "@aws-crypto/sha1-browser@npm:5.2.0" + dependencies: + "@aws-crypto/supports-web-crypto": ^5.2.0 + "@aws-crypto/util": ^5.2.0 + "@aws-sdk/types": ^3.222.0 + "@aws-sdk/util-locate-window": ^3.0.0 + "@smithy/util-utf8": ^2.0.0 + tslib: ^2.6.2 + checksum: 8b04af601d945c5ef0f5f733b55681edc95b81c02ce5067b57f1eb4ee718e45485cf9aeeb7a84da9131656d09e1c4bc78040ec759f557a46703422d8df098d59 + languageName: node + linkType: hard + "@aws-crypto/sha256-browser@npm:5.2.0": version: 5.2.0 resolution: "@aws-crypto/sha256-browser@npm:5.2.0" @@ -199,7 +224,7 @@ __metadata: languageName: node linkType: hard -"@aws-crypto/util@npm:^5.2.0": +"@aws-crypto/util@npm:5.2.0, @aws-crypto/util@npm:^5.2.0": version: 5.2.0 resolution: "@aws-crypto/util@npm:5.2.0" dependencies: @@ -211,1511 +236,880 @@ __metadata: linkType: hard "@aws-sdk/client-bedrock-runtime@npm:^3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/client-bedrock-runtime@npm:3.954.0" + version: 3.958.0 + resolution: "@aws-sdk/client-bedrock-runtime@npm:3.958.0" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.954.0 - "@aws-sdk/credential-provider-node": 3.954.0 - "@aws-sdk/eventstream-handler-node": 3.953.0 - "@aws-sdk/middleware-eventstream": 3.953.0 - "@aws-sdk/middleware-host-header": 3.953.0 - "@aws-sdk/middleware-logger": 3.953.0 - "@aws-sdk/middleware-recursion-detection": 3.953.0 - "@aws-sdk/middleware-user-agent": 3.954.0 - "@aws-sdk/middleware-websocket": 3.953.0 - "@aws-sdk/region-config-resolver": 3.953.0 - "@aws-sdk/token-providers": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@aws-sdk/util-endpoints": 3.953.0 - "@aws-sdk/util-user-agent-browser": 3.953.0 - "@aws-sdk/util-user-agent-node": 3.954.0 - "@smithy/config-resolver": ^4.4.4 - "@smithy/core": ^3.19.0 - "@smithy/eventstream-serde-browser": ^4.2.6 - "@smithy/eventstream-serde-config-resolver": ^4.3.6 - "@smithy/eventstream-serde-node": ^4.2.6 - "@smithy/fetch-http-handler": ^5.3.7 - "@smithy/hash-node": ^4.2.6 - "@smithy/invalid-dependency": ^4.2.6 - "@smithy/middleware-content-length": ^4.2.6 - "@smithy/middleware-endpoint": ^4.4.0 - "@smithy/middleware-retry": ^4.4.16 - "@smithy/middleware-serde": ^4.2.7 - "@smithy/middleware-stack": ^4.2.6 - "@smithy/node-config-provider": ^4.3.6 - "@smithy/node-http-handler": ^4.4.6 - "@smithy/protocol-http": ^5.3.6 - "@smithy/smithy-client": ^4.10.1 - "@smithy/types": ^4.10.0 - "@smithy/url-parser": ^4.2.6 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/credential-provider-node": 3.958.0 + "@aws-sdk/eventstream-handler-node": 3.957.0 + "@aws-sdk/middleware-eventstream": 3.957.0 + "@aws-sdk/middleware-host-header": 3.957.0 + "@aws-sdk/middleware-logger": 3.957.0 + "@aws-sdk/middleware-recursion-detection": 3.957.0 + "@aws-sdk/middleware-user-agent": 3.957.0 + "@aws-sdk/middleware-websocket": 3.957.0 + "@aws-sdk/region-config-resolver": 3.957.0 + "@aws-sdk/token-providers": 3.958.0 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/util-endpoints": 3.957.0 + "@aws-sdk/util-user-agent-browser": 3.957.0 + "@aws-sdk/util-user-agent-node": 3.957.0 + "@smithy/config-resolver": ^4.4.5 + "@smithy/core": ^3.20.0 + "@smithy/eventstream-serde-browser": ^4.2.7 + "@smithy/eventstream-serde-config-resolver": ^4.3.7 + "@smithy/eventstream-serde-node": ^4.2.7 + "@smithy/fetch-http-handler": ^5.3.8 + "@smithy/hash-node": ^4.2.7 + "@smithy/invalid-dependency": ^4.2.7 + "@smithy/middleware-content-length": ^4.2.7 + "@smithy/middleware-endpoint": ^4.4.1 + "@smithy/middleware-retry": ^4.4.17 + "@smithy/middleware-serde": ^4.2.8 + "@smithy/middleware-stack": ^4.2.7 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/node-http-handler": ^4.4.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 + "@smithy/url-parser": ^4.2.7 "@smithy/util-base64": ^4.3.0 "@smithy/util-body-length-browser": ^4.2.0 "@smithy/util-body-length-node": ^4.2.1 - "@smithy/util-defaults-mode-browser": ^4.3.15 - "@smithy/util-defaults-mode-node": ^4.2.18 - "@smithy/util-endpoints": ^3.2.6 - "@smithy/util-middleware": ^4.2.6 - "@smithy/util-retry": ^4.2.6 - "@smithy/util-stream": ^4.5.7 + "@smithy/util-defaults-mode-browser": ^4.3.16 + "@smithy/util-defaults-mode-node": ^4.2.19 + "@smithy/util-endpoints": ^3.2.7 + "@smithy/util-middleware": ^4.2.7 + "@smithy/util-retry": ^4.2.7 + "@smithy/util-stream": ^4.5.8 "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: 6d73e6bbdab5149e12325868ed222e4b30f9e137791ffb157699603d5390f2ee536b67a08596d0cc4359f0b53cc4b1ba8d6422041b6ea21ed602ee1d04b97491 + checksum: 5e54e18f8c9c310c6061dcc77589c72bc081e77dd1c59fc051c8bb6f168076787dbcba05684bc88be0eeb97f0cc80ae33f479aa960397997690cb174dd102485 languageName: node linkType: hard "@aws-sdk/client-dynamodb@npm:^3.952.0": - version: 3.952.0 - resolution: "@aws-sdk/client-dynamodb@npm:3.952.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.947.0 - "@aws-sdk/credential-provider-node": 3.952.0 - "@aws-sdk/dynamodb-codec": 3.947.0 - "@aws-sdk/middleware-endpoint-discovery": 3.936.0 - "@aws-sdk/middleware-host-header": 3.936.0 - "@aws-sdk/middleware-logger": 3.936.0 - "@aws-sdk/middleware-recursion-detection": 3.948.0 - "@aws-sdk/middleware-user-agent": 3.947.0 - "@aws-sdk/region-config-resolver": 3.936.0 - "@aws-sdk/types": 3.936.0 - "@aws-sdk/util-endpoints": 3.936.0 - "@aws-sdk/util-user-agent-browser": 3.936.0 - "@aws-sdk/util-user-agent-node": 3.947.0 - "@smithy/config-resolver": ^4.4.3 - "@smithy/core": ^3.18.7 - "@smithy/fetch-http-handler": ^5.3.6 - "@smithy/hash-node": ^4.2.5 - "@smithy/invalid-dependency": ^4.2.5 - "@smithy/middleware-content-length": ^4.2.5 - "@smithy/middleware-endpoint": ^4.3.14 - "@smithy/middleware-retry": ^4.4.14 - "@smithy/middleware-serde": ^4.2.6 - "@smithy/middleware-stack": ^4.2.5 - "@smithy/node-config-provider": ^4.3.5 - "@smithy/node-http-handler": ^4.4.5 - "@smithy/protocol-http": ^5.3.5 - "@smithy/smithy-client": ^4.9.10 - "@smithy/types": ^4.9.0 - "@smithy/url-parser": ^4.2.5 - "@smithy/util-base64": ^4.3.0 - "@smithy/util-body-length-browser": ^4.2.0 - "@smithy/util-body-length-node": ^4.2.1 - "@smithy/util-defaults-mode-browser": ^4.3.13 - "@smithy/util-defaults-mode-node": ^4.2.16 - "@smithy/util-endpoints": ^3.2.5 - "@smithy/util-middleware": ^4.2.5 - "@smithy/util-retry": ^4.2.5 - "@smithy/util-utf8": ^4.2.0 - "@smithy/util-waiter": ^4.2.5 - tslib: ^2.6.2 - checksum: f53971d41a523f83cf3c84a058ac993e30b3032f43c72cc550b9536df51a806bff86ab1ec7f64defd5a2e0c6e231c45357111956a0e26aa3b87657a2f07ffbe6 - languageName: node - linkType: hard - -"@aws-sdk/client-sesv2@npm:^3.839.0": - version: 3.926.0 - resolution: "@aws-sdk/client-sesv2@npm:3.926.0" + version: 3.958.0 + resolution: "@aws-sdk/client-dynamodb@npm:3.958.0" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.926.0 - "@aws-sdk/credential-provider-node": 3.926.0 - "@aws-sdk/middleware-host-header": 3.922.0 - "@aws-sdk/middleware-logger": 3.922.0 - "@aws-sdk/middleware-recursion-detection": 3.922.0 - "@aws-sdk/middleware-user-agent": 3.926.0 - "@aws-sdk/region-config-resolver": 3.925.0 - "@aws-sdk/signature-v4-multi-region": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@aws-sdk/util-endpoints": 3.922.0 - "@aws-sdk/util-user-agent-browser": 3.922.0 - "@aws-sdk/util-user-agent-node": 3.926.0 - "@smithy/config-resolver": ^4.4.2 - "@smithy/core": ^3.17.2 - "@smithy/fetch-http-handler": ^5.3.5 - "@smithy/hash-node": ^4.2.4 - "@smithy/invalid-dependency": ^4.2.4 - "@smithy/middleware-content-length": ^4.2.4 - "@smithy/middleware-endpoint": ^4.3.6 - "@smithy/middleware-retry": ^4.4.6 - "@smithy/middleware-serde": ^4.2.4 - "@smithy/middleware-stack": ^4.2.4 - "@smithy/node-config-provider": ^4.3.4 - "@smithy/node-http-handler": ^4.4.4 - "@smithy/protocol-http": ^5.3.4 - "@smithy/smithy-client": ^4.9.2 - "@smithy/types": ^4.8.1 - "@smithy/url-parser": ^4.2.4 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/credential-provider-node": 3.958.0 + "@aws-sdk/dynamodb-codec": 3.957.0 + "@aws-sdk/middleware-endpoint-discovery": 3.957.0 + "@aws-sdk/middleware-host-header": 3.957.0 + "@aws-sdk/middleware-logger": 3.957.0 + "@aws-sdk/middleware-recursion-detection": 3.957.0 + "@aws-sdk/middleware-user-agent": 3.957.0 + "@aws-sdk/region-config-resolver": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/util-endpoints": 3.957.0 + "@aws-sdk/util-user-agent-browser": 3.957.0 + "@aws-sdk/util-user-agent-node": 3.957.0 + "@smithy/config-resolver": ^4.4.5 + "@smithy/core": ^3.20.0 + "@smithy/fetch-http-handler": ^5.3.8 + "@smithy/hash-node": ^4.2.7 + "@smithy/invalid-dependency": ^4.2.7 + "@smithy/middleware-content-length": ^4.2.7 + "@smithy/middleware-endpoint": ^4.4.1 + "@smithy/middleware-retry": ^4.4.17 + "@smithy/middleware-serde": ^4.2.8 + "@smithy/middleware-stack": ^4.2.7 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/node-http-handler": ^4.4.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 + "@smithy/url-parser": ^4.2.7 "@smithy/util-base64": ^4.3.0 "@smithy/util-body-length-browser": ^4.2.0 "@smithy/util-body-length-node": ^4.2.1 - "@smithy/util-defaults-mode-browser": ^4.3.5 - "@smithy/util-defaults-mode-node": ^4.2.8 - "@smithy/util-endpoints": ^3.2.4 - "@smithy/util-middleware": ^4.2.4 - "@smithy/util-retry": ^4.2.4 + "@smithy/util-defaults-mode-browser": ^4.3.16 + "@smithy/util-defaults-mode-node": ^4.2.19 + "@smithy/util-endpoints": ^3.2.7 + "@smithy/util-middleware": ^4.2.7 + "@smithy/util-retry": ^4.2.7 "@smithy/util-utf8": ^4.2.0 + "@smithy/util-waiter": ^4.2.7 tslib: ^2.6.2 - checksum: 4e3f6d83cbafdfc5f827e2ec09504804eb8d1c66eb6358cd9ba427e6ce960c9a92483816f3c6a688971fb41110390578a34349f4fbcf0bbacded530d5d0ad883 + checksum: 45cd914c6ef42a9c01e6281a31abb002c54e05e677d3fa4d3d6f1ac699678888fb21a4a3e1cc9d1968ecdfb3d90bf1b0ad38c52ee6a2c4031e03c75dc453d9fc languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/client-sso@npm:3.926.0" +"@aws-sdk/client-s3@npm:^3.958.0": + version: 3.958.0 + resolution: "@aws-sdk/client-s3@npm:3.958.0" dependencies: + "@aws-crypto/sha1-browser": 5.2.0 "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.926.0 - "@aws-sdk/middleware-host-header": 3.922.0 - "@aws-sdk/middleware-logger": 3.922.0 - "@aws-sdk/middleware-recursion-detection": 3.922.0 - "@aws-sdk/middleware-user-agent": 3.926.0 - "@aws-sdk/region-config-resolver": 3.925.0 - "@aws-sdk/types": 3.922.0 - "@aws-sdk/util-endpoints": 3.922.0 - "@aws-sdk/util-user-agent-browser": 3.922.0 - "@aws-sdk/util-user-agent-node": 3.926.0 - "@smithy/config-resolver": ^4.4.2 - "@smithy/core": ^3.17.2 - "@smithy/fetch-http-handler": ^5.3.5 - "@smithy/hash-node": ^4.2.4 - "@smithy/invalid-dependency": ^4.2.4 - "@smithy/middleware-content-length": ^4.2.4 - "@smithy/middleware-endpoint": ^4.3.6 - "@smithy/middleware-retry": ^4.4.6 - "@smithy/middleware-serde": ^4.2.4 - "@smithy/middleware-stack": ^4.2.4 - "@smithy/node-config-provider": ^4.3.4 - "@smithy/node-http-handler": ^4.4.4 - "@smithy/protocol-http": ^5.3.4 - "@smithy/smithy-client": ^4.9.2 - "@smithy/types": ^4.8.1 - "@smithy/url-parser": ^4.2.4 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/credential-provider-node": 3.958.0 + "@aws-sdk/middleware-bucket-endpoint": 3.957.0 + "@aws-sdk/middleware-expect-continue": 3.957.0 + "@aws-sdk/middleware-flexible-checksums": 3.957.0 + "@aws-sdk/middleware-host-header": 3.957.0 + "@aws-sdk/middleware-location-constraint": 3.957.0 + "@aws-sdk/middleware-logger": 3.957.0 + "@aws-sdk/middleware-recursion-detection": 3.957.0 + "@aws-sdk/middleware-sdk-s3": 3.957.0 + "@aws-sdk/middleware-ssec": 3.957.0 + "@aws-sdk/middleware-user-agent": 3.957.0 + "@aws-sdk/region-config-resolver": 3.957.0 + "@aws-sdk/signature-v4-multi-region": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/util-endpoints": 3.957.0 + "@aws-sdk/util-user-agent-browser": 3.957.0 + "@aws-sdk/util-user-agent-node": 3.957.0 + "@smithy/config-resolver": ^4.4.5 + "@smithy/core": ^3.20.0 + "@smithy/eventstream-serde-browser": ^4.2.7 + "@smithy/eventstream-serde-config-resolver": ^4.3.7 + "@smithy/eventstream-serde-node": ^4.2.7 + "@smithy/fetch-http-handler": ^5.3.8 + "@smithy/hash-blob-browser": ^4.2.8 + "@smithy/hash-node": ^4.2.7 + "@smithy/hash-stream-node": ^4.2.7 + "@smithy/invalid-dependency": ^4.2.7 + "@smithy/md5-js": ^4.2.7 + "@smithy/middleware-content-length": ^4.2.7 + "@smithy/middleware-endpoint": ^4.4.1 + "@smithy/middleware-retry": ^4.4.17 + "@smithy/middleware-serde": ^4.2.8 + "@smithy/middleware-stack": ^4.2.7 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/node-http-handler": ^4.4.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 + "@smithy/url-parser": ^4.2.7 "@smithy/util-base64": ^4.3.0 "@smithy/util-body-length-browser": ^4.2.0 "@smithy/util-body-length-node": ^4.2.1 - "@smithy/util-defaults-mode-browser": ^4.3.5 - "@smithy/util-defaults-mode-node": ^4.2.8 - "@smithy/util-endpoints": ^3.2.4 - "@smithy/util-middleware": ^4.2.4 - "@smithy/util-retry": ^4.2.4 + "@smithy/util-defaults-mode-browser": ^4.3.16 + "@smithy/util-defaults-mode-node": ^4.2.19 + "@smithy/util-endpoints": ^3.2.7 + "@smithy/util-middleware": ^4.2.7 + "@smithy/util-retry": ^4.2.7 + "@smithy/util-stream": ^4.5.8 "@smithy/util-utf8": ^4.2.0 + "@smithy/util-waiter": ^4.2.7 tslib: ^2.6.2 - checksum: 6d5a58287ccc1c393007d1930429fc59346fdbae34d1407aa093e980674aa5d0a58e055b3988c6b553d8417b5e7b045f047d0e3fcae2c2a83bee2919c109cbf7 + checksum: 3b5374af4ea17e63fb50cbe8691a76336d8907d34b32fce34c0cb890d1c5608d91086f81f932bb9d3a6a9f0ac61360734a214dd707c9b20700dd032b2a48aa42 languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.948.0": - version: 3.948.0 - resolution: "@aws-sdk/client-sso@npm:3.948.0" +"@aws-sdk/client-sesv2@npm:^3.839.0": + version: 3.958.0 + resolution: "@aws-sdk/client-sesv2@npm:3.958.0" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.947.0 - "@aws-sdk/middleware-host-header": 3.936.0 - "@aws-sdk/middleware-logger": 3.936.0 - "@aws-sdk/middleware-recursion-detection": 3.948.0 - "@aws-sdk/middleware-user-agent": 3.947.0 - "@aws-sdk/region-config-resolver": 3.936.0 - "@aws-sdk/types": 3.936.0 - "@aws-sdk/util-endpoints": 3.936.0 - "@aws-sdk/util-user-agent-browser": 3.936.0 - "@aws-sdk/util-user-agent-node": 3.947.0 - "@smithy/config-resolver": ^4.4.3 - "@smithy/core": ^3.18.7 - "@smithy/fetch-http-handler": ^5.3.6 - "@smithy/hash-node": ^4.2.5 - "@smithy/invalid-dependency": ^4.2.5 - "@smithy/middleware-content-length": ^4.2.5 - "@smithy/middleware-endpoint": ^4.3.14 - "@smithy/middleware-retry": ^4.4.14 - "@smithy/middleware-serde": ^4.2.6 - "@smithy/middleware-stack": ^4.2.5 - "@smithy/node-config-provider": ^4.3.5 - "@smithy/node-http-handler": ^4.4.5 - "@smithy/protocol-http": ^5.3.5 - "@smithy/smithy-client": ^4.9.10 - "@smithy/types": ^4.9.0 - "@smithy/url-parser": ^4.2.5 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/credential-provider-node": 3.958.0 + "@aws-sdk/middleware-host-header": 3.957.0 + "@aws-sdk/middleware-logger": 3.957.0 + "@aws-sdk/middleware-recursion-detection": 3.957.0 + "@aws-sdk/middleware-user-agent": 3.957.0 + "@aws-sdk/region-config-resolver": 3.957.0 + "@aws-sdk/signature-v4-multi-region": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/util-endpoints": 3.957.0 + "@aws-sdk/util-user-agent-browser": 3.957.0 + "@aws-sdk/util-user-agent-node": 3.957.0 + "@smithy/config-resolver": ^4.4.5 + "@smithy/core": ^3.20.0 + "@smithy/fetch-http-handler": ^5.3.8 + "@smithy/hash-node": ^4.2.7 + "@smithy/invalid-dependency": ^4.2.7 + "@smithy/middleware-content-length": ^4.2.7 + "@smithy/middleware-endpoint": ^4.4.1 + "@smithy/middleware-retry": ^4.4.17 + "@smithy/middleware-serde": ^4.2.8 + "@smithy/middleware-stack": ^4.2.7 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/node-http-handler": ^4.4.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 + "@smithy/url-parser": ^4.2.7 "@smithy/util-base64": ^4.3.0 "@smithy/util-body-length-browser": ^4.2.0 "@smithy/util-body-length-node": ^4.2.1 - "@smithy/util-defaults-mode-browser": ^4.3.13 - "@smithy/util-defaults-mode-node": ^4.2.16 - "@smithy/util-endpoints": ^3.2.5 - "@smithy/util-middleware": ^4.2.5 - "@smithy/util-retry": ^4.2.5 + "@smithy/util-defaults-mode-browser": ^4.3.16 + "@smithy/util-defaults-mode-node": ^4.2.19 + "@smithy/util-endpoints": ^3.2.7 + "@smithy/util-middleware": ^4.2.7 + "@smithy/util-retry": ^4.2.7 "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: 1bb746002a26d454bda767e0380f388fef30f3f38262ffb11a33a8fb7fe0c6850c8db8daa2bfbbb9b6d38a7e652d163dd95121e6a45c1961b23a62674fb9bb84 + checksum: bb07bbeea7ca408c03525933cc505da5bb0e8fc999c5f20923370c88bafeea3bf6d737ecb316f38cefde7ef5762b1288d03fdf74320a22c34baf6347f8b641f4 languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/client-sso@npm:3.954.0" +"@aws-sdk/client-sso@npm:3.958.0": + version: 3.958.0 + resolution: "@aws-sdk/client-sso@npm:3.958.0" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.954.0 - "@aws-sdk/middleware-host-header": 3.953.0 - "@aws-sdk/middleware-logger": 3.953.0 - "@aws-sdk/middleware-recursion-detection": 3.953.0 - "@aws-sdk/middleware-user-agent": 3.954.0 - "@aws-sdk/region-config-resolver": 3.953.0 - "@aws-sdk/types": 3.953.0 - "@aws-sdk/util-endpoints": 3.953.0 - "@aws-sdk/util-user-agent-browser": 3.953.0 - "@aws-sdk/util-user-agent-node": 3.954.0 - "@smithy/config-resolver": ^4.4.4 - "@smithy/core": ^3.19.0 - "@smithy/fetch-http-handler": ^5.3.7 - "@smithy/hash-node": ^4.2.6 - "@smithy/invalid-dependency": ^4.2.6 - "@smithy/middleware-content-length": ^4.2.6 - "@smithy/middleware-endpoint": ^4.4.0 - "@smithy/middleware-retry": ^4.4.16 - "@smithy/middleware-serde": ^4.2.7 - "@smithy/middleware-stack": ^4.2.6 - "@smithy/node-config-provider": ^4.3.6 - "@smithy/node-http-handler": ^4.4.6 - "@smithy/protocol-http": ^5.3.6 - "@smithy/smithy-client": ^4.10.1 - "@smithy/types": ^4.10.0 - "@smithy/url-parser": ^4.2.6 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/middleware-host-header": 3.957.0 + "@aws-sdk/middleware-logger": 3.957.0 + "@aws-sdk/middleware-recursion-detection": 3.957.0 + "@aws-sdk/middleware-user-agent": 3.957.0 + "@aws-sdk/region-config-resolver": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/util-endpoints": 3.957.0 + "@aws-sdk/util-user-agent-browser": 3.957.0 + "@aws-sdk/util-user-agent-node": 3.957.0 + "@smithy/config-resolver": ^4.4.5 + "@smithy/core": ^3.20.0 + "@smithy/fetch-http-handler": ^5.3.8 + "@smithy/hash-node": ^4.2.7 + "@smithy/invalid-dependency": ^4.2.7 + "@smithy/middleware-content-length": ^4.2.7 + "@smithy/middleware-endpoint": ^4.4.1 + "@smithy/middleware-retry": ^4.4.17 + "@smithy/middleware-serde": ^4.2.8 + "@smithy/middleware-stack": ^4.2.7 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/node-http-handler": ^4.4.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 + "@smithy/url-parser": ^4.2.7 "@smithy/util-base64": ^4.3.0 "@smithy/util-body-length-browser": ^4.2.0 "@smithy/util-body-length-node": ^4.2.1 - "@smithy/util-defaults-mode-browser": ^4.3.15 - "@smithy/util-defaults-mode-node": ^4.2.18 - "@smithy/util-endpoints": ^3.2.6 - "@smithy/util-middleware": ^4.2.6 - "@smithy/util-retry": ^4.2.6 - "@smithy/util-utf8": ^4.2.0 - tslib: ^2.6.2 - checksum: 0ba6bb9a6fb26c0f0686bf76792f3d7fcbb6defade88f05872737388310115f417eae14e22db6ed1c6e5ef25f6b8bf78f4133cdd8766a9dba752220179c3b33d - languageName: node - linkType: hard - -"@aws-sdk/core@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/core@npm:3.926.0" - dependencies: - "@aws-sdk/types": 3.922.0 - "@aws-sdk/xml-builder": 3.921.0 - "@smithy/core": ^3.17.2 - "@smithy/node-config-provider": ^4.3.4 - "@smithy/property-provider": ^4.2.4 - "@smithy/protocol-http": ^5.3.4 - "@smithy/signature-v4": ^5.3.4 - "@smithy/smithy-client": ^4.9.2 - "@smithy/types": ^4.8.1 - "@smithy/util-base64": ^4.3.0 - "@smithy/util-middleware": ^4.2.4 - "@smithy/util-utf8": ^4.2.0 - tslib: ^2.6.2 - checksum: 62851ac4909c2a160320b386e9847617c759e0dfaf29464466000284f2134196854ed44337e619ee52fd10b88ca2590d058ca41480a5f22804eda5b2adc12a5f - languageName: node - linkType: hard - -"@aws-sdk/core@npm:3.947.0": - version: 3.947.0 - resolution: "@aws-sdk/core@npm:3.947.0" - dependencies: - "@aws-sdk/types": 3.936.0 - "@aws-sdk/xml-builder": 3.930.0 - "@smithy/core": ^3.18.7 - "@smithy/node-config-provider": ^4.3.5 - "@smithy/property-provider": ^4.2.5 - "@smithy/protocol-http": ^5.3.5 - "@smithy/signature-v4": ^5.3.5 - "@smithy/smithy-client": ^4.9.10 - "@smithy/types": ^4.9.0 - "@smithy/util-base64": ^4.3.0 - "@smithy/util-middleware": ^4.2.5 + "@smithy/util-defaults-mode-browser": ^4.3.16 + "@smithy/util-defaults-mode-node": ^4.2.19 + "@smithy/util-endpoints": ^3.2.7 + "@smithy/util-middleware": ^4.2.7 + "@smithy/util-retry": ^4.2.7 "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: 3fbab1f61d68e375984d5bb300e9a6375489d69fd0066dc65b3d83b10a2c103f18232a3aaf8d8d260aaedb7ff5c338c83a4aa33c5870c25fe53938550355740a + checksum: 3fd6296b8f0ac3eafb64ce46c841732c6e7867e287c934922c5ecb9391a643d19bc8adfcafd1468095d20021adb25073c34a317ba097ceda278efe5265186033 languageName: node linkType: hard -"@aws-sdk/core@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/core@npm:3.953.0" +"@aws-sdk/core@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/core@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.953.0 - "@aws-sdk/xml-builder": 3.953.0 - "@smithy/core": ^3.19.0 - "@smithy/node-config-provider": ^4.3.6 - "@smithy/property-provider": ^4.2.6 - "@smithy/protocol-http": ^5.3.6 - "@smithy/signature-v4": ^5.3.6 - "@smithy/smithy-client": ^4.10.0 - "@smithy/types": ^4.10.0 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/xml-builder": 3.957.0 + "@smithy/core": ^3.20.0 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/property-provider": ^4.2.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/signature-v4": ^5.3.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 "@smithy/util-base64": ^4.3.0 - "@smithy/util-middleware": ^4.2.6 + "@smithy/util-middleware": ^4.2.7 "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: 9b93125286250980b8c83df132d850affc0bc140ba6518f1273823eb73ac2c4d80c01353d3da38d0a8ec120055b0aaecbfe7eca4404cae02aac78aaf533b5355 + checksum: 7e408e5c86bdc46abf87632f9aadf97c5374cdcac6e77e0ad1f3bded761c67fa08e883adfd514b7a9a84b50d733422dccb476a8c1e78f64b1987bea48d97aaa0 languageName: node linkType: hard -"@aws-sdk/core@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/core@npm:3.954.0" +"@aws-sdk/crc64-nvme@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/crc64-nvme@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.953.0 - "@aws-sdk/xml-builder": 3.953.0 - "@smithy/core": ^3.19.0 - "@smithy/node-config-provider": ^4.3.6 - "@smithy/property-provider": ^4.2.6 - "@smithy/protocol-http": ^5.3.6 - "@smithy/signature-v4": ^5.3.6 - "@smithy/smithy-client": ^4.10.1 - "@smithy/types": ^4.10.0 - "@smithy/util-base64": ^4.3.0 - "@smithy/util-middleware": ^4.2.6 - "@smithy/util-utf8": ^4.2.0 - tslib: ^2.6.2 - checksum: 5928daf164b4fc1db7f1a5b831d0c12229421124253163d4cf104b6e084650465c450fb9c57b3ff92dd5846394f6dca6e4d0ca469cc8e89128e824b0a2d14994 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-env@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.926.0" - dependencies: - "@aws-sdk/core": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@smithy/property-provider": ^4.2.4 - "@smithy/types": ^4.8.1 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: a0f90b8441df90daea1560e2200cc3277bc1b145b863ead5ea1f92d9e6f1c8fcdd4a0ff9bf3fd5c317dd689be8a892c4d1ab711406f61120d9255934e5be9cca + checksum: 7ed9a42f6899edc776385c7fa35d56a9bbcbf3c0bdcca728e8059c7c3f49d58b170b77f9bf008c085029fb563f77e312c91dfe534b2be4c3943f52ded96edbde languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.947.0": - version: 3.947.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.947.0" +"@aws-sdk/credential-provider-env@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.957.0" dependencies: - "@aws-sdk/core": 3.947.0 - "@aws-sdk/types": 3.936.0 - "@smithy/property-provider": ^4.2.5 - "@smithy/types": ^4.9.0 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@smithy/property-provider": ^4.2.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 478f5f080678f7db5f05f0d30c2b08ce1d54ea48ec10136445404e0cd5f34521d550f1901889cf9ccd57d9f8e0e4502c409a1a7f664f5541e8a4a2185e3e6eef + checksum: 9045186b12a58dd05c9a1f3cee6763b9543d66c75d18d58cfeda477304b1178f3bf2a72f3e623d4510f84cc435d0d6c0428af1ae7579aab115aa0a2e78dc98fb languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.954.0" +"@aws-sdk/credential-provider-http@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/credential-provider-http@npm:3.957.0" dependencies: - "@aws-sdk/core": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@smithy/property-provider": ^4.2.6 - "@smithy/types": ^4.10.0 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@smithy/fetch-http-handler": ^5.3.8 + "@smithy/node-http-handler": ^4.4.7 + "@smithy/property-provider": ^4.2.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 + "@smithy/util-stream": ^4.5.8 tslib: ^2.6.2 - checksum: d8fc24b85ce8f83189862cacdbfc3a0559dc8217c8e837c500c86579c73a1b4266bd83efb262ea44bd523941d9d2ed283d2d294c1a679fd5ec66fa153c7657ea + checksum: 0f37b37433e2e9c2c04ec65e68f7f6599f80d6662b4b864642e4db94b152ee2f32ae31eec8fbaa758c16575e75a4d1f533195bfb4cc7342c7380bd0b153c6fe6 languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.926.0" +"@aws-sdk/credential-provider-ini@npm:3.958.0": + version: 3.958.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.958.0" dependencies: - "@aws-sdk/core": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@smithy/fetch-http-handler": ^5.3.5 - "@smithy/node-http-handler": ^4.4.4 - "@smithy/property-provider": ^4.2.4 - "@smithy/protocol-http": ^5.3.4 - "@smithy/smithy-client": ^4.9.2 - "@smithy/types": ^4.8.1 - "@smithy/util-stream": ^4.5.5 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/credential-provider-env": 3.957.0 + "@aws-sdk/credential-provider-http": 3.957.0 + "@aws-sdk/credential-provider-login": 3.958.0 + "@aws-sdk/credential-provider-process": 3.957.0 + "@aws-sdk/credential-provider-sso": 3.958.0 + "@aws-sdk/credential-provider-web-identity": 3.958.0 + "@aws-sdk/nested-clients": 3.958.0 + "@aws-sdk/types": 3.957.0 + "@smithy/credential-provider-imds": ^4.2.7 + "@smithy/property-provider": ^4.2.7 + "@smithy/shared-ini-file-loader": ^4.4.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 66c978924dc91c6c96aba29fab1594fe89ada3055f4e8003463d801308869f363db97828072f7ab16776754bab9d0598b3a34e29d31f7de8fb62d74400c247db + checksum: d1041cad363e89ae91f81024164e29eab94839f1c46a7d8ff6bfd21db04c6926b05db4a11bb121b996d1ce5a833c6e591a3d49b9c6453849d251c34f0860ec0c languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.947.0": - version: 3.947.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.947.0" +"@aws-sdk/credential-provider-login@npm:3.958.0": + version: 3.958.0 + resolution: "@aws-sdk/credential-provider-login@npm:3.958.0" dependencies: - "@aws-sdk/core": 3.947.0 - "@aws-sdk/types": 3.936.0 - "@smithy/fetch-http-handler": ^5.3.6 - "@smithy/node-http-handler": ^4.4.5 - "@smithy/property-provider": ^4.2.5 - "@smithy/protocol-http": ^5.3.5 - "@smithy/smithy-client": ^4.9.10 - "@smithy/types": ^4.9.0 - "@smithy/util-stream": ^4.5.6 - tslib: ^2.6.2 - checksum: 3b9661b229314b977b2161ffa08910f819a1ae2a130e0a77258f9d5db0f729a39321294ebebb62c7aad64c5bd05fea15407c248f47ccc4c31e2016f3092e1099 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-http@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.954.0" - dependencies: - "@aws-sdk/core": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@smithy/fetch-http-handler": ^5.3.7 - "@smithy/node-http-handler": ^4.4.6 - "@smithy/property-provider": ^4.2.6 - "@smithy/protocol-http": ^5.3.6 - "@smithy/smithy-client": ^4.10.1 - "@smithy/types": ^4.10.0 - "@smithy/util-stream": ^4.5.7 - tslib: ^2.6.2 - checksum: 9c6afaf1c069252f5077be380dc5594addc3cb5e39d3a4905802c14f6c0c543893ddad7269706260e7ed1f20329195139e3ecc6343f8225c82adb371175b61e9 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-ini@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.926.0" - dependencies: - "@aws-sdk/core": 3.926.0 - "@aws-sdk/credential-provider-env": 3.926.0 - "@aws-sdk/credential-provider-http": 3.926.0 - "@aws-sdk/credential-provider-process": 3.926.0 - "@aws-sdk/credential-provider-sso": 3.926.0 - "@aws-sdk/credential-provider-web-identity": 3.926.0 - "@aws-sdk/nested-clients": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@smithy/credential-provider-imds": ^4.2.4 - "@smithy/property-provider": ^4.2.4 - "@smithy/shared-ini-file-loader": ^4.3.4 - "@smithy/types": ^4.8.1 - tslib: ^2.6.2 - checksum: d7ab77a2457c7e3c467249ba28d85295d3faf043f98fd06b41eff38dd150acb2458d23837935825910ae23c1750c7e8dd779f00bae34442f5cfbb72768a95dd0 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-ini@npm:3.952.0": - version: 3.952.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.952.0" - dependencies: - "@aws-sdk/core": 3.947.0 - "@aws-sdk/credential-provider-env": 3.947.0 - "@aws-sdk/credential-provider-http": 3.947.0 - "@aws-sdk/credential-provider-login": 3.952.0 - "@aws-sdk/credential-provider-process": 3.947.0 - "@aws-sdk/credential-provider-sso": 3.952.0 - "@aws-sdk/credential-provider-web-identity": 3.952.0 - "@aws-sdk/nested-clients": 3.952.0 - "@aws-sdk/types": 3.936.0 - "@smithy/credential-provider-imds": ^4.2.5 - "@smithy/property-provider": ^4.2.5 - "@smithy/shared-ini-file-loader": ^4.4.0 - "@smithy/types": ^4.9.0 - tslib: ^2.6.2 - checksum: 67cead8c7939a2137c963df28aec4d2b26e95648a952e97e65741501876d991f9830a5cc7e2df8724b0d51d28f671ade67321c26360d25dba6c191c609628497 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-ini@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.954.0" - dependencies: - "@aws-sdk/core": 3.954.0 - "@aws-sdk/credential-provider-env": 3.954.0 - "@aws-sdk/credential-provider-http": 3.954.0 - "@aws-sdk/credential-provider-login": 3.954.0 - "@aws-sdk/credential-provider-process": 3.954.0 - "@aws-sdk/credential-provider-sso": 3.954.0 - "@aws-sdk/credential-provider-web-identity": 3.954.0 - "@aws-sdk/nested-clients": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@smithy/credential-provider-imds": ^4.2.6 - "@smithy/property-provider": ^4.2.6 - "@smithy/shared-ini-file-loader": ^4.4.1 - "@smithy/types": ^4.10.0 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/nested-clients": 3.958.0 + "@aws-sdk/types": 3.957.0 + "@smithy/property-provider": ^4.2.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/shared-ini-file-loader": ^4.4.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 5373119e4618f2004a866124549153333f17205d8ebfee96673874809ca8aebcc014cd6ade36c1b969e68dc165925631995ed6e3fbc3a19a1eb6176718f8790c + checksum: 2924fbb53bbd610a2c24f5082a68762a42a1ada576ed8e401e1e9494d74cdc6ef77017c8b564cf0225d1bf1ea61befc9409fd23518e326d1c6af78a3b42ebbd4 languageName: node linkType: hard -"@aws-sdk/credential-provider-login@npm:3.952.0": - version: 3.952.0 - resolution: "@aws-sdk/credential-provider-login@npm:3.952.0" +"@aws-sdk/credential-provider-node@npm:3.958.0": + version: 3.958.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.958.0" dependencies: - "@aws-sdk/core": 3.947.0 - "@aws-sdk/nested-clients": 3.952.0 - "@aws-sdk/types": 3.936.0 - "@smithy/property-provider": ^4.2.5 - "@smithy/protocol-http": ^5.3.5 - "@smithy/shared-ini-file-loader": ^4.4.0 - "@smithy/types": ^4.9.0 + "@aws-sdk/credential-provider-env": 3.957.0 + "@aws-sdk/credential-provider-http": 3.957.0 + "@aws-sdk/credential-provider-ini": 3.958.0 + "@aws-sdk/credential-provider-process": 3.957.0 + "@aws-sdk/credential-provider-sso": 3.958.0 + "@aws-sdk/credential-provider-web-identity": 3.958.0 + "@aws-sdk/types": 3.957.0 + "@smithy/credential-provider-imds": ^4.2.7 + "@smithy/property-provider": ^4.2.7 + "@smithy/shared-ini-file-loader": ^4.4.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 080d81409ed9c395b660962f52262aa21b177daf9ca3e89cc3c838dd6fdeaac011f24c062a914c600b580ee853f4acade3cb70c1a4804d2b00eca6b0c614fbe3 + checksum: ae991076af8265ecfbd9ff1a13a0564fe60028537bb81d691efd71f7bddf57e0736e86003b7b6d8cb215aa2382a270b2f97e48e824607724a7006562a96f4725 languageName: node linkType: hard -"@aws-sdk/credential-provider-login@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/credential-provider-login@npm:3.954.0" +"@aws-sdk/credential-provider-process@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.957.0" dependencies: - "@aws-sdk/core": 3.954.0 - "@aws-sdk/nested-clients": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@smithy/property-provider": ^4.2.6 - "@smithy/protocol-http": ^5.3.6 - "@smithy/shared-ini-file-loader": ^4.4.1 - "@smithy/types": ^4.10.0 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@smithy/property-provider": ^4.2.7 + "@smithy/shared-ini-file-loader": ^4.4.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: ca73f9202d17a29b4dfa760c9ec542103aed12e16d75b8161ae2328f8f2c49af5a4795099a376951604e1b61a0db377b2157d7db2db671e419befb4354dd45a4 + checksum: b2ee86097ba2f885dd63d7de576279ae1898be8a7ed1725bd50f8d5bcd9f0e5fc764a8f093706dbdbe0ca3c95a2c2fb8d7aaa495f0dc60658d044d5f53f979c3 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.926.0" +"@aws-sdk/credential-provider-sso@npm:3.958.0": + version: 3.958.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.958.0" dependencies: - "@aws-sdk/credential-provider-env": 3.926.0 - "@aws-sdk/credential-provider-http": 3.926.0 - "@aws-sdk/credential-provider-ini": 3.926.0 - "@aws-sdk/credential-provider-process": 3.926.0 - "@aws-sdk/credential-provider-sso": 3.926.0 - "@aws-sdk/credential-provider-web-identity": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@smithy/credential-provider-imds": ^4.2.4 - "@smithy/property-provider": ^4.2.4 - "@smithy/shared-ini-file-loader": ^4.3.4 - "@smithy/types": ^4.8.1 + "@aws-sdk/client-sso": 3.958.0 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/token-providers": 3.958.0 + "@aws-sdk/types": 3.957.0 + "@smithy/property-provider": ^4.2.7 + "@smithy/shared-ini-file-loader": ^4.4.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: d89c39acd92571bffa48d7c1e338b2a65b75e2682d6f3add44c6b4c0c544ca11031768dc8fafdacb63dcb3960790cb0b9038cc1a714080f9e9baaba35d0216de + checksum: 5fd43d6506aea10967ae6b86e427de86be192a82b260acd9b327ce1ce0b0208c6983952b27f6d4d8478b23e54c08ba2502eab790ec86a69e44afa525c7d750c9 languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.952.0": - version: 3.952.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.952.0" +"@aws-sdk/credential-provider-web-identity@npm:3.958.0": + version: 3.958.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.958.0" dependencies: - "@aws-sdk/credential-provider-env": 3.947.0 - "@aws-sdk/credential-provider-http": 3.947.0 - "@aws-sdk/credential-provider-ini": 3.952.0 - "@aws-sdk/credential-provider-process": 3.947.0 - "@aws-sdk/credential-provider-sso": 3.952.0 - "@aws-sdk/credential-provider-web-identity": 3.952.0 - "@aws-sdk/types": 3.936.0 - "@smithy/credential-provider-imds": ^4.2.5 - "@smithy/property-provider": ^4.2.5 - "@smithy/shared-ini-file-loader": ^4.4.0 - "@smithy/types": ^4.9.0 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/nested-clients": 3.958.0 + "@aws-sdk/types": 3.957.0 + "@smithy/property-provider": ^4.2.7 + "@smithy/shared-ini-file-loader": ^4.4.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: b6464a4d49451f3d223442809461f88a771aa2ce15af84a438558e506024b1b3aa446b7ffbe1fa545032789826f73e2e4e08d5197df91dbddb77e130a168628f + checksum: 43f4352c54cac61045ac50d0bc0617ba592106bda57501afcce9f61ac837afb82a1182e3b392cb2c5579550c8c8246348e9511d22a58fb80298fa8d1b32ae82c languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.954.0" +"@aws-sdk/dynamodb-codec@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/dynamodb-codec@npm:3.957.0" dependencies: - "@aws-sdk/credential-provider-env": 3.954.0 - "@aws-sdk/credential-provider-http": 3.954.0 - "@aws-sdk/credential-provider-ini": 3.954.0 - "@aws-sdk/credential-provider-process": 3.954.0 - "@aws-sdk/credential-provider-sso": 3.954.0 - "@aws-sdk/credential-provider-web-identity": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@smithy/credential-provider-imds": ^4.2.6 - "@smithy/property-provider": ^4.2.6 - "@smithy/shared-ini-file-loader": ^4.4.1 - "@smithy/types": ^4.10.0 - tslib: ^2.6.2 - checksum: 882e844ea276162428f1f1e1d09296f08c393052516db9e0518a44a3e70dbbefd76281a2b3d76987535df5ce481ef778d85b3157e9a253963cf888abedf1bc43 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-process@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.926.0" - dependencies: - "@aws-sdk/core": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@smithy/property-provider": ^4.2.4 - "@smithy/shared-ini-file-loader": ^4.3.4 - "@smithy/types": ^4.8.1 - tslib: ^2.6.2 - checksum: 29ba80316ee231741ab3f8e854deb527a0e9bd5a480b3eb2f318766df1dd4a2d9e62c02ae9c16c4e8484079a294db0cbce4aa91ce7086a071b99c40741d922af - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-process@npm:3.947.0": - version: 3.947.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.947.0" - dependencies: - "@aws-sdk/core": 3.947.0 - "@aws-sdk/types": 3.936.0 - "@smithy/property-provider": ^4.2.5 - "@smithy/shared-ini-file-loader": ^4.4.0 - "@smithy/types": ^4.9.0 - tslib: ^2.6.2 - checksum: 6e52266d35a14086e9eb44dbef046631c662f74c61f1992644dce0297e6825bc45b845624b8c6f7a2e15f78f7ddf3f1ecc87eed72c0fa5d0165c89476f17e4b6 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-process@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.954.0" - dependencies: - "@aws-sdk/core": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@smithy/property-provider": ^4.2.6 - "@smithy/shared-ini-file-loader": ^4.4.1 - "@smithy/types": ^4.10.0 - tslib: ^2.6.2 - checksum: b3ae10b9b8e3ed6a9c5cc19aef61bb9346ad655b1d9d63cce18e0d990a98144aa65e38b5783bdb069cb8b3ff71fb8519bdf2d7bec2ece5ac6bba9fc7b9088251 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-sso@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.926.0" - dependencies: - "@aws-sdk/client-sso": 3.926.0 - "@aws-sdk/core": 3.926.0 - "@aws-sdk/token-providers": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@smithy/property-provider": ^4.2.4 - "@smithy/shared-ini-file-loader": ^4.3.4 - "@smithy/types": ^4.8.1 - tslib: ^2.6.2 - checksum: c06922147137c2183de979280ee33e84423ce9653ed79f98c84b118a1c86a6b3f056078005c50e081abe0d5807b2641170375db9fc6136a4add196d2f616b193 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-sso@npm:3.952.0": - version: 3.952.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.952.0" - dependencies: - "@aws-sdk/client-sso": 3.948.0 - "@aws-sdk/core": 3.947.0 - "@aws-sdk/token-providers": 3.952.0 - "@aws-sdk/types": 3.936.0 - "@smithy/property-provider": ^4.2.5 - "@smithy/shared-ini-file-loader": ^4.4.0 - "@smithy/types": ^4.9.0 - tslib: ^2.6.2 - checksum: 47c497e17394c727091e52aa6163851bd8c19a77ce36e07a570f6f41d5659f22f1f9a08a0b22b082772e5e0017c2e616adf736acd9c82b47d1d885a8e177f4a4 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-sso@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.954.0" - dependencies: - "@aws-sdk/client-sso": 3.954.0 - "@aws-sdk/core": 3.954.0 - "@aws-sdk/token-providers": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@smithy/property-provider": ^4.2.6 - "@smithy/shared-ini-file-loader": ^4.4.1 - "@smithy/types": ^4.10.0 - tslib: ^2.6.2 - checksum: 9293e9114577f28f5555a42ce92a8ab1cbbce707e6fa0889e8e15150a4bf8d96aeacb74cf1f30b04c5025e685543aee65c770a7d0849928e583ad35aa9b36964 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-web-identity@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.926.0" - dependencies: - "@aws-sdk/core": 3.926.0 - "@aws-sdk/nested-clients": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@smithy/property-provider": ^4.2.4 - "@smithy/shared-ini-file-loader": ^4.3.4 - "@smithy/types": ^4.8.1 - tslib: ^2.6.2 - checksum: 16556528ef0453c1d886b88f23357257058727c1c2998836ed18907173f193d1e9eff84db463420eb58db7939c9de90908ed0b02d98ff6c457a115594db655cb - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-web-identity@npm:3.952.0": - version: 3.952.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.952.0" - dependencies: - "@aws-sdk/core": 3.947.0 - "@aws-sdk/nested-clients": 3.952.0 - "@aws-sdk/types": 3.936.0 - "@smithy/property-provider": ^4.2.5 - "@smithy/shared-ini-file-loader": ^4.4.0 - "@smithy/types": ^4.9.0 - tslib: ^2.6.2 - checksum: c7aa6896a4241915d1912648b6440d019222fc6bb81013b95bbc0ce8d1a8b893313e713a7cf34f893d66229c513837ee1f2ac1fc8eee152bf651a5334247ab1a - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-web-identity@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.954.0" - dependencies: - "@aws-sdk/core": 3.954.0 - "@aws-sdk/nested-clients": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@smithy/property-provider": ^4.2.6 - "@smithy/shared-ini-file-loader": ^4.4.1 - "@smithy/types": ^4.10.0 - tslib: ^2.6.2 - checksum: c55541f6bd79e88c4711839160e275a54beaa2337d6351c1e73f471d878a89e06dde7ce49ab2e7762a3c3f4c623e6fa0e2ffddf29bab0dfe593aaff2af909cd7 - languageName: node - linkType: hard - -"@aws-sdk/dynamodb-codec@npm:3.947.0": - version: 3.947.0 - resolution: "@aws-sdk/dynamodb-codec@npm:3.947.0" - dependencies: - "@aws-sdk/core": 3.947.0 - "@smithy/core": ^3.18.7 - "@smithy/smithy-client": ^4.9.10 - "@smithy/types": ^4.9.0 + "@aws-sdk/core": 3.957.0 + "@smithy/core": ^3.20.0 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 "@smithy/util-base64": ^4.3.0 tslib: ^2.6.2 peerDependencies: - "@aws-sdk/client-dynamodb": ^3.947.0 - checksum: 4b35424ce31dd91cefa5a35a5f801f34473528e79cf99628806cc9e6945390a941aa1a771f5f14a2a2e51dc1b83f75c280f595547a4e4af6a3aa5efd2c826d08 + "@aws-sdk/client-dynamodb": ^3.957.0 + checksum: 0287175c62509954d2998e6cfd94a6d66f7e6aa9bdee5f466c30e0aa8722cd1ecb2af6e316d3d8f6dd73cf7964218764b41d149735c6fe9c18dbcac850201a0e languageName: node linkType: hard -"@aws-sdk/endpoint-cache@npm:3.893.0": - version: 3.893.0 - resolution: "@aws-sdk/endpoint-cache@npm:3.893.0" +"@aws-sdk/endpoint-cache@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/endpoint-cache@npm:3.957.0" dependencies: mnemonist: 0.38.3 tslib: ^2.6.2 - checksum: 4d271e0a74f594271ac756e17bf38530c1764484f599f0bdec6c421887c275f62fec5ad559ccf1630750a21a56576577e48ecf55e0c8e43e6c9b55a66fc7d6c8 + checksum: b32b15c688c36d03064ea0d94792f01b3ecff23dd74cde8402c519e982dfc1cb59a07b94044ed9dc168e511ce6996688f0d6cf6c0b6fbde66e23acaeb20bee2a languageName: node linkType: hard -"@aws-sdk/eventstream-handler-node@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/eventstream-handler-node@npm:3.953.0" +"@aws-sdk/eventstream-handler-node@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/eventstream-handler-node@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.953.0 - "@smithy/eventstream-codec": ^4.2.6 - "@smithy/types": ^4.10.0 + "@aws-sdk/types": 3.957.0 + "@smithy/eventstream-codec": ^4.2.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: f4b03a614db1e9a9a14bb751867e4327aca65f6e86c9a43ba8f775417f07cdf81248c410a94ae00c42703198b94434799d85ac9b50fb6732799180cf61c8092f + checksum: 73a666b44c5f1817133539af0e5ece76efbf40d6bd890449d5b0fffbd5a7515ec9e5c78004fe9289fbbd5da2724bf6b1c983e33eaeac934f2be607378df6f21a languageName: node linkType: hard "@aws-sdk/lib-dynamodb@npm:^3.952.0, @aws-sdk/lib-dynamodb@npm:^3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/lib-dynamodb@npm:3.953.0" - dependencies: - "@aws-sdk/core": 3.953.0 - "@aws-sdk/util-dynamodb": 3.953.0 - "@smithy/core": ^3.19.0 - "@smithy/smithy-client": ^4.10.0 - "@smithy/types": ^4.10.0 - tslib: ^2.6.2 - peerDependencies: - "@aws-sdk/client-dynamodb": ^3.953.0 - checksum: 3d827e6f00a60ad8a717860971d8f19e3af6ea924e7a2e688bf82e923ac27d830a26ca73284f594b64e1211b5b62c075ca3cf1d303a0d2413ac032d0fbc26cb9 - languageName: node - linkType: hard - -"@aws-sdk/middleware-endpoint-discovery@npm:3.936.0": - version: 3.936.0 - resolution: "@aws-sdk/middleware-endpoint-discovery@npm:3.936.0" - dependencies: - "@aws-sdk/endpoint-cache": 3.893.0 - "@aws-sdk/types": 3.936.0 - "@smithy/node-config-provider": ^4.3.5 - "@smithy/protocol-http": ^5.3.5 - "@smithy/types": ^4.9.0 - tslib: ^2.6.2 - checksum: 7f7534a62689f564cf048f3cf4e79a669d37de231498e293ab9c2c6c7b992daa7797f256dca341d278f14959a3d00fce1c565c2e0becb158591be86b268b77c4 - languageName: node - linkType: hard - -"@aws-sdk/middleware-eventstream@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/middleware-eventstream@npm:3.953.0" + version: 3.958.0 + resolution: "@aws-sdk/lib-dynamodb@npm:3.958.0" dependencies: - "@aws-sdk/types": 3.953.0 - "@smithy/protocol-http": ^5.3.6 - "@smithy/types": ^4.10.0 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/util-dynamodb": 3.958.0 + "@smithy/core": ^3.20.0 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: ee8ac296508c2c965a42e0a7e31fc4da8339e1b2736b8baf2dac99d51fcc1d62bd14a1e63ec8b35c5a44885ae1627106044697423d31549c96207dbdeb77a100 + peerDependencies: + "@aws-sdk/client-dynamodb": ^3.958.0 + checksum: 809f264940c1e7af50cddcb5d26b7c87f695cca80d08e0929bd08f89515a291666a6bb27066510b0f4ebfa7f8f9f2598e425996e3209784210adc5e23a07c520 languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.922.0": - version: 3.922.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.922.0" +"@aws-sdk/middleware-bucket-endpoint@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.922.0 - "@smithy/protocol-http": ^5.3.4 - "@smithy/types": ^4.8.1 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/util-arn-parser": 3.957.0 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 + "@smithy/util-config-provider": ^4.2.0 tslib: ^2.6.2 - checksum: 13ab02d2369fcb844caa6e171b169263795fd88d178e851011676691f0611c0c7fb422db3f9521065e3fac4a5badc5f3a31f3ec15bd5a823d443c69f1720d174 + checksum: 36cdb32e3ad8f238dd2dbb6ecf5899f7f624639d3f914f4730a326a1a187747c7c6d0df4ff197cf729cae1919b800b8f9668bcc4ff4803cbf4e62fd50b99bc64 languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.936.0": - version: 3.936.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.936.0" +"@aws-sdk/middleware-endpoint-discovery@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-endpoint-discovery@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.936.0 - "@smithy/protocol-http": ^5.3.5 - "@smithy/types": ^4.9.0 + "@aws-sdk/endpoint-cache": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: edd13115342ac016f70125f0337d28e764a9b513466e75af76a5301791a9d4842c02615254e430a00f6e9400a75d11113f1845f6d9d0eb6172012750795ab107 + checksum: ecfcdaec550e81053e7abb48a64431561cc32a64a3c372e93fa927d4b01c269fff0c852cbea150407efa5858a23b7169911b5718b886fc4f24ab90378533aceb languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.953.0" +"@aws-sdk/middleware-eventstream@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-eventstream@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.953.0 - "@smithy/protocol-http": ^5.3.6 - "@smithy/types": ^4.10.0 + "@aws-sdk/types": 3.957.0 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 73b4643e7d2d3312cb00bd81d286425fd9ca3b17b9742109bd56142a8f4b7ef5744bde7e81da79190f0076f8eefb4a2b2132078a26bc6c4731e6e93b2613f67f + checksum: 14ca9405b0040c3da201132679442ef09733fa63aa232e6d16a4e42a0a46fab2bc7690cab2e591adf1bfed2545e0bab475d5fac9d82c875021905f0dbf583f21 languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.922.0": - version: 3.922.0 - resolution: "@aws-sdk/middleware-logger@npm:3.922.0" +"@aws-sdk/middleware-expect-continue@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-expect-continue@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.922.0 - "@smithy/types": ^4.8.1 + "@aws-sdk/types": 3.957.0 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 2c66f0bb819220e5b4894904c0b5f7e735b95e4f504b696298fc6a0ac9b06edce2eb990ddbadf22cb39b9d9139904af375473dbf386aff9c5c9189f95f8af3e6 + checksum: 1f22580cdcbe340d7af4ea3dbde7aaf8972bb83f34b886f2b7f6c8e078333c9f641a8a4c462fd8d8df1889492e4a10c8280d1c9e2bb8a9790050822a356c29cf languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.936.0": - version: 3.936.0 - resolution: "@aws-sdk/middleware-logger@npm:3.936.0" +"@aws-sdk/middleware-flexible-checksums@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-flexible-checksums@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.936.0 - "@smithy/types": ^4.9.0 + "@aws-crypto/crc32": 5.2.0 + "@aws-crypto/crc32c": 5.2.0 + "@aws-crypto/util": 5.2.0 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/crc64-nvme": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@smithy/is-array-buffer": ^4.2.0 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 + "@smithy/util-middleware": ^4.2.7 + "@smithy/util-stream": ^4.5.8 + "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: b25fcb51b749648e6979760838e18a683392d4505879ecc99621ec6e76317f3ef772c46b40b8e0a3c7a587151bcfcb1d10bce0ae23814483231cac3e462269c0 + checksum: 5479a6f8836d60b9e2411e70075beb1a3f996b1ae9071b49ed17d761577cc89991d5af74f29c5a363f7e651ff174551f7e8f6e626d7d65532c69d91258741a2b languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/middleware-logger@npm:3.953.0" +"@aws-sdk/middleware-host-header@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.953.0 - "@smithy/types": ^4.10.0 + "@aws-sdk/types": 3.957.0 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: db026a3b53c31708f7f1eb822da04dfcd5adb767692528be764ca59c7108fc20e3b1f3de0ba3e7c4bde80fab6b1256b1ad0ccb030752bcf5e5da16d473f75aac + checksum: 9dc82155c28cb0805db6e682211aa1d9bbabbe8f5f9c1babebe8e87c7df7117134f7cfa9ea2a3899b694eddbeebb1d893f4386a9c5d0a9bcdcbe43c9404310e4 languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.922.0": - version: 3.922.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.922.0" +"@aws-sdk/middleware-location-constraint@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-location-constraint@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.922.0 - "@aws/lambda-invoke-store": ^0.1.1 - "@smithy/protocol-http": ^5.3.4 - "@smithy/types": ^4.8.1 + "@aws-sdk/types": 3.957.0 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: cec2d25aa5ce75c88d361621a20f1fd4b9b551225f8c4f2bc6207c0768bd2c0358229fa91d349c67351f4286178ac278c31ab4093b2cbd84ee6a4c0f5a48d066 + checksum: bc70ce43a98b9dc2f953188d31062761a466a88667040edc8fd03df45f88a66624b27ceb74a39d07d3b7ac0d894f5fab2435d9eef145a83fa8161abf619f88a8 languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.948.0": - version: 3.948.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.948.0" +"@aws-sdk/middleware-logger@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-logger@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.936.0 - "@aws/lambda-invoke-store": ^0.2.2 - "@smithy/protocol-http": ^5.3.5 - "@smithy/types": ^4.9.0 + "@aws-sdk/types": 3.957.0 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: ab0df8cce631653675a960f8998b5a60e22ba11d6ed422ca712c4fc8c8d69cffd4ebd1c4f220168fb0c90ba28821a0ef3006e8f5c9a4938a61347bf3a219eb90 + checksum: 01ea819f1e3a7c33674ae0dba204375d2a22733909fce4fd689cd6f345c152d6b93270a63dd4fcd4d0a3675ae94966d3dce7594b6d657e64bb92a4fa286d5294 languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.953.0" +"@aws-sdk/middleware-recursion-detection@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.953.0 + "@aws-sdk/types": 3.957.0 "@aws/lambda-invoke-store": ^0.2.2 - "@smithy/protocol-http": ^5.3.6 - "@smithy/types": ^4.10.0 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 66ea964c1a8be3b847851bd3bec156a5c21e6ad2d8c9a28b163a103518cdd86d96a72ed3121c443aa6e6d7131a573163741be4fc4f26ed0d2a4c1b7fcd264259 + checksum: fc422df1a63a031120c6e5d4a3dbcec2bafddeaaabaa467945f90f8cb054b99551381dbc571ba73427f43ea6551d60ff5d24abf2fb12e30fd276549ebfba6e89 languageName: node linkType: hard -"@aws-sdk/middleware-sdk-s3@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.926.0" +"@aws-sdk/middleware-sdk-s3@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-sdk-s3@npm:3.957.0" dependencies: - "@aws-sdk/core": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@aws-sdk/util-arn-parser": 3.893.0 - "@smithy/core": ^3.17.2 - "@smithy/node-config-provider": ^4.3.4 - "@smithy/protocol-http": ^5.3.4 - "@smithy/signature-v4": ^5.3.4 - "@smithy/smithy-client": ^4.9.2 - "@smithy/types": ^4.8.1 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/util-arn-parser": 3.957.0 + "@smithy/core": ^3.20.0 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/signature-v4": ^5.3.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 "@smithy/util-config-provider": ^4.2.0 - "@smithy/util-middleware": ^4.2.4 - "@smithy/util-stream": ^4.5.5 + "@smithy/util-middleware": ^4.2.7 + "@smithy/util-stream": ^4.5.8 "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: 28625098be6d92e800180899c8ae599db4a42e412d8889520804f404d96f8b0762c5263c05b5b243775a68b8c1c07855060980a393fd59a5a1119aba79486c59 + checksum: 8085429ca7cd941f625fa26e7d1c20cbd6b271a6089f80c58830df268bd689723819f67a33982d7a878e746be2ca6648583c450e75b0388fc3d4a11c0436c706 languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.926.0" +"@aws-sdk/middleware-ssec@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-ssec@npm:3.957.0" dependencies: - "@aws-sdk/core": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@aws-sdk/util-endpoints": 3.922.0 - "@smithy/core": ^3.17.2 - "@smithy/protocol-http": ^5.3.4 - "@smithy/types": ^4.8.1 + "@aws-sdk/types": 3.957.0 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: d965a0104d77e8b7b0c067355274d7860a233133482842412c4e7da0fd93a3a509e97510af7093f4de30a822bc1595430fdb5e840b656bfc588c2eeb0dfa2605 + checksum: 5579444621a96f65d11aee37d675591491be3140b32bc060651cc2aa2527d7f0b76e042815c2c232695a6ff3df1dd8f2d60c1a205525d07e22eb07a36be50aa7 languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.947.0": - version: 3.947.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.947.0" +"@aws-sdk/middleware-user-agent@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.957.0" dependencies: - "@aws-sdk/core": 3.947.0 - "@aws-sdk/types": 3.936.0 - "@aws-sdk/util-endpoints": 3.936.0 - "@smithy/core": ^3.18.7 - "@smithy/protocol-http": ^5.3.5 - "@smithy/types": ^4.9.0 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/util-endpoints": 3.957.0 + "@smithy/core": ^3.20.0 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 4abd52b774abb53d16b701b59377c73c7dd0e3a7eb72de325d0f216c97eeece608ee0bb1b0511fc56a85616c2313e8d526ae7502acf395866bfc7ec2fccdbd6f + checksum: b7ada3932cad5c514a04de6151a8fb1caf9d5c7ab7636be54fc7008ac43cd740662ff959be38fc057037354c29cafbed314b08882e12517ca65973e612da314c languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.954.0" +"@aws-sdk/middleware-websocket@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/middleware-websocket@npm:3.957.0" dependencies: - "@aws-sdk/core": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@aws-sdk/util-endpoints": 3.953.0 - "@smithy/core": ^3.19.0 - "@smithy/protocol-http": ^5.3.6 - "@smithy/types": ^4.10.0 - tslib: ^2.6.2 - checksum: 26a18c3ffececa22b64bb9a215f77bff1a7232324e562d87826d9a7651d5e8f2aa67745448afbe8cc0146eb61456037b83cfe36721b3ee45fc837ad475b89db5 - languageName: node - linkType: hard - -"@aws-sdk/middleware-websocket@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/middleware-websocket@npm:3.953.0" - dependencies: - "@aws-sdk/types": 3.953.0 - "@aws-sdk/util-format-url": 3.953.0 - "@smithy/eventstream-codec": ^4.2.6 - "@smithy/eventstream-serde-browser": ^4.2.6 - "@smithy/fetch-http-handler": ^5.3.7 - "@smithy/protocol-http": ^5.3.6 - "@smithy/signature-v4": ^5.3.6 - "@smithy/types": ^4.10.0 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/util-format-url": 3.957.0 + "@smithy/eventstream-codec": ^4.2.7 + "@smithy/eventstream-serde-browser": ^4.2.7 + "@smithy/fetch-http-handler": ^5.3.8 + "@smithy/protocol-http": ^5.3.7 + "@smithy/signature-v4": ^5.3.7 + "@smithy/types": ^4.11.0 "@smithy/util-hex-encoding": ^4.2.0 tslib: ^2.6.2 - checksum: 6ff4c61d76eebf132190b107d13cd67a30cf88db97a7e3c9f24c0e9049efb12968fedc29fe45c77930576912aeb8cfb9c44931a003ee2197f69bb4c05a21e507 - languageName: node - linkType: hard - -"@aws-sdk/nested-clients@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/nested-clients@npm:3.926.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.926.0 - "@aws-sdk/middleware-host-header": 3.922.0 - "@aws-sdk/middleware-logger": 3.922.0 - "@aws-sdk/middleware-recursion-detection": 3.922.0 - "@aws-sdk/middleware-user-agent": 3.926.0 - "@aws-sdk/region-config-resolver": 3.925.0 - "@aws-sdk/types": 3.922.0 - "@aws-sdk/util-endpoints": 3.922.0 - "@aws-sdk/util-user-agent-browser": 3.922.0 - "@aws-sdk/util-user-agent-node": 3.926.0 - "@smithy/config-resolver": ^4.4.2 - "@smithy/core": ^3.17.2 - "@smithy/fetch-http-handler": ^5.3.5 - "@smithy/hash-node": ^4.2.4 - "@smithy/invalid-dependency": ^4.2.4 - "@smithy/middleware-content-length": ^4.2.4 - "@smithy/middleware-endpoint": ^4.3.6 - "@smithy/middleware-retry": ^4.4.6 - "@smithy/middleware-serde": ^4.2.4 - "@smithy/middleware-stack": ^4.2.4 - "@smithy/node-config-provider": ^4.3.4 - "@smithy/node-http-handler": ^4.4.4 - "@smithy/protocol-http": ^5.3.4 - "@smithy/smithy-client": ^4.9.2 - "@smithy/types": ^4.8.1 - "@smithy/url-parser": ^4.2.4 - "@smithy/util-base64": ^4.3.0 - "@smithy/util-body-length-browser": ^4.2.0 - "@smithy/util-body-length-node": ^4.2.1 - "@smithy/util-defaults-mode-browser": ^4.3.5 - "@smithy/util-defaults-mode-node": ^4.2.8 - "@smithy/util-endpoints": ^3.2.4 - "@smithy/util-middleware": ^4.2.4 - "@smithy/util-retry": ^4.2.4 - "@smithy/util-utf8": ^4.2.0 - tslib: ^2.6.2 - checksum: 628ca9cb580ab60d6e073cdb8e91b3548c89ea244d126101292b236a2fa5310564434f2d57b72388e1224e14c959ecd4366dbb1ac7610738962ba83a12baf336 - languageName: node - linkType: hard - -"@aws-sdk/nested-clients@npm:3.952.0": - version: 3.952.0 - resolution: "@aws-sdk/nested-clients@npm:3.952.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.947.0 - "@aws-sdk/middleware-host-header": 3.936.0 - "@aws-sdk/middleware-logger": 3.936.0 - "@aws-sdk/middleware-recursion-detection": 3.948.0 - "@aws-sdk/middleware-user-agent": 3.947.0 - "@aws-sdk/region-config-resolver": 3.936.0 - "@aws-sdk/types": 3.936.0 - "@aws-sdk/util-endpoints": 3.936.0 - "@aws-sdk/util-user-agent-browser": 3.936.0 - "@aws-sdk/util-user-agent-node": 3.947.0 - "@smithy/config-resolver": ^4.4.3 - "@smithy/core": ^3.18.7 - "@smithy/fetch-http-handler": ^5.3.6 - "@smithy/hash-node": ^4.2.5 - "@smithy/invalid-dependency": ^4.2.5 - "@smithy/middleware-content-length": ^4.2.5 - "@smithy/middleware-endpoint": ^4.3.14 - "@smithy/middleware-retry": ^4.4.14 - "@smithy/middleware-serde": ^4.2.6 - "@smithy/middleware-stack": ^4.2.5 - "@smithy/node-config-provider": ^4.3.5 - "@smithy/node-http-handler": ^4.4.5 - "@smithy/protocol-http": ^5.3.5 - "@smithy/smithy-client": ^4.9.10 - "@smithy/types": ^4.9.0 - "@smithy/url-parser": ^4.2.5 - "@smithy/util-base64": ^4.3.0 - "@smithy/util-body-length-browser": ^4.2.0 - "@smithy/util-body-length-node": ^4.2.1 - "@smithy/util-defaults-mode-browser": ^4.3.13 - "@smithy/util-defaults-mode-node": ^4.2.16 - "@smithy/util-endpoints": ^3.2.5 - "@smithy/util-middleware": ^4.2.5 - "@smithy/util-retry": ^4.2.5 - "@smithy/util-utf8": ^4.2.0 - tslib: ^2.6.2 - checksum: a9364dd55567d529f99a45cb1ca7057ef1de6d847f1cf5faf360bc729f95db4e52f3344ffb26e593f216bd6915bf6a5eccf0009a1707a188b335535a6ab40161 + checksum: 7f65fcc88b793d3eae984303a9ed9edf7aeab4594e0c67fc2a561c506e2310065376a74b76f81ead3ebad95edf8e093872f4dd8347355782f1fe006357341979 languageName: node linkType: hard -"@aws-sdk/nested-clients@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/nested-clients@npm:3.954.0" +"@aws-sdk/nested-clients@npm:3.958.0": + version: 3.958.0 + resolution: "@aws-sdk/nested-clients@npm:3.958.0" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.954.0 - "@aws-sdk/middleware-host-header": 3.953.0 - "@aws-sdk/middleware-logger": 3.953.0 - "@aws-sdk/middleware-recursion-detection": 3.953.0 - "@aws-sdk/middleware-user-agent": 3.954.0 - "@aws-sdk/region-config-resolver": 3.953.0 - "@aws-sdk/types": 3.953.0 - "@aws-sdk/util-endpoints": 3.953.0 - "@aws-sdk/util-user-agent-browser": 3.953.0 - "@aws-sdk/util-user-agent-node": 3.954.0 - "@smithy/config-resolver": ^4.4.4 - "@smithy/core": ^3.19.0 - "@smithy/fetch-http-handler": ^5.3.7 - "@smithy/hash-node": ^4.2.6 - "@smithy/invalid-dependency": ^4.2.6 - "@smithy/middleware-content-length": ^4.2.6 - "@smithy/middleware-endpoint": ^4.4.0 - "@smithy/middleware-retry": ^4.4.16 - "@smithy/middleware-serde": ^4.2.7 - "@smithy/middleware-stack": ^4.2.6 - "@smithy/node-config-provider": ^4.3.6 - "@smithy/node-http-handler": ^4.4.6 - "@smithy/protocol-http": ^5.3.6 - "@smithy/smithy-client": ^4.10.1 - "@smithy/types": ^4.10.0 - "@smithy/url-parser": ^4.2.6 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/middleware-host-header": 3.957.0 + "@aws-sdk/middleware-logger": 3.957.0 + "@aws-sdk/middleware-recursion-detection": 3.957.0 + "@aws-sdk/middleware-user-agent": 3.957.0 + "@aws-sdk/region-config-resolver": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/util-endpoints": 3.957.0 + "@aws-sdk/util-user-agent-browser": 3.957.0 + "@aws-sdk/util-user-agent-node": 3.957.0 + "@smithy/config-resolver": ^4.4.5 + "@smithy/core": ^3.20.0 + "@smithy/fetch-http-handler": ^5.3.8 + "@smithy/hash-node": ^4.2.7 + "@smithy/invalid-dependency": ^4.2.7 + "@smithy/middleware-content-length": ^4.2.7 + "@smithy/middleware-endpoint": ^4.4.1 + "@smithy/middleware-retry": ^4.4.17 + "@smithy/middleware-serde": ^4.2.8 + "@smithy/middleware-stack": ^4.2.7 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/node-http-handler": ^4.4.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 + "@smithy/url-parser": ^4.2.7 "@smithy/util-base64": ^4.3.0 "@smithy/util-body-length-browser": ^4.2.0 "@smithy/util-body-length-node": ^4.2.1 - "@smithy/util-defaults-mode-browser": ^4.3.15 - "@smithy/util-defaults-mode-node": ^4.2.18 - "@smithy/util-endpoints": ^3.2.6 - "@smithy/util-middleware": ^4.2.6 - "@smithy/util-retry": ^4.2.6 + "@smithy/util-defaults-mode-browser": ^4.3.16 + "@smithy/util-defaults-mode-node": ^4.2.19 + "@smithy/util-endpoints": ^3.2.7 + "@smithy/util-middleware": ^4.2.7 + "@smithy/util-retry": ^4.2.7 "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: f8b4e1cb5f37de5b44e43ad24ae8792c9b9813da61bc7c26b31ca3456ea0c0bc5a4d72283079fc755f155e8bb437bea8837b21ed17bcebc7ee42f2c767716e8e - languageName: node - linkType: hard - -"@aws-sdk/region-config-resolver@npm:3.925.0": - version: 3.925.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.925.0" - dependencies: - "@aws-sdk/types": 3.922.0 - "@smithy/config-resolver": ^4.4.2 - "@smithy/node-config-provider": ^4.3.4 - "@smithy/types": ^4.8.1 - tslib: ^2.6.2 - checksum: 4fc41a7fc0b12ce30581dcb1d97415b1fc8bd022d99358b4f42b179c5ea0dda133748565103f2592a1368e4d8d9b83740486b410a9a0bed6350e9a515fd2104e - languageName: node - linkType: hard - -"@aws-sdk/region-config-resolver@npm:3.936.0": - version: 3.936.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.936.0" - dependencies: - "@aws-sdk/types": 3.936.0 - "@smithy/config-resolver": ^4.4.3 - "@smithy/node-config-provider": ^4.3.5 - "@smithy/types": ^4.9.0 - tslib: ^2.6.2 - checksum: 19dcb7c3eb3c93a59ccbb5129716a48d33adbfa8999fd7494c7d8e91ab69914959d803349fd9409a8592f9614beb81e3ed6e1bd300db28cfd9eefee224cf75fb - languageName: node - linkType: hard - -"@aws-sdk/region-config-resolver@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.953.0" - dependencies: - "@aws-sdk/types": 3.953.0 - "@smithy/config-resolver": ^4.4.4 - "@smithy/node-config-provider": ^4.3.6 - "@smithy/types": ^4.10.0 - tslib: ^2.6.2 - checksum: e4ffd77e6d639df8b0f6f3c4737f5edb48748f6cc22c7f7787be0354567ac7bd4d70f1691ac13a551ba1160da46ccee0edb97a1aa64aa224b11cc1d5bb2d329d - languageName: node - linkType: hard - -"@aws-sdk/signature-v4-multi-region@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.926.0" - dependencies: - "@aws-sdk/middleware-sdk-s3": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@smithy/protocol-http": ^5.3.4 - "@smithy/signature-v4": ^5.3.4 - "@smithy/types": ^4.8.1 - tslib: ^2.6.2 - checksum: 2383e58aecd67358d4e8dc3970b1ce1254ae4bc5e47b0a440f27f38807511cb9cdf560dea3b54bf9ad423df7fcb39638adddd1c5c920ccebc40407f4ef979b45 + checksum: a0afa488ac6904e8393bd47909d892e76303d79ea64571f2c605499dcbaf8dfe0e6ac7a6e4d32ae8772c6bb8b609698ddf5893e91a7fbe4f43bd212009418021 languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/token-providers@npm:3.926.0" +"@aws-sdk/region-config-resolver@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.957.0" dependencies: - "@aws-sdk/core": 3.926.0 - "@aws-sdk/nested-clients": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@smithy/property-provider": ^4.2.4 - "@smithy/shared-ini-file-loader": ^4.3.4 - "@smithy/types": ^4.8.1 + "@aws-sdk/types": 3.957.0 + "@smithy/config-resolver": ^4.4.5 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 5f707e0ab839654c7dd11be1ea1426a7732b96fa52040268c758cbad3816870dd72b6d15b2be4e6675f32df39029fcf385a920fcb6f1ca51ecabeaa50721f107 + checksum: acf5b1b505acd1c2fe37fcb4c41038ef123dc1c965e9ccc945df33cbfef08d2af383fcdeb9fe1b4c99bccd0ea8b7b1427963f8e03693e7081e05af3a59d22f3a languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.952.0": - version: 3.952.0 - resolution: "@aws-sdk/token-providers@npm:3.952.0" +"@aws-sdk/s3-request-presigner@npm:^3.958.0": + version: 3.958.0 + resolution: "@aws-sdk/s3-request-presigner@npm:3.958.0" dependencies: - "@aws-sdk/core": 3.947.0 - "@aws-sdk/nested-clients": 3.952.0 - "@aws-sdk/types": 3.936.0 - "@smithy/property-provider": ^4.2.5 - "@smithy/shared-ini-file-loader": ^4.4.0 - "@smithy/types": ^4.9.0 + "@aws-sdk/signature-v4-multi-region": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@aws-sdk/util-format-url": 3.957.0 + "@smithy/middleware-endpoint": ^4.4.1 + "@smithy/protocol-http": ^5.3.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 4b80095a760214af9db8543ee0d0f1868414862f26939cad483a1e018a64afa4ffa98dbccb8ee63879e780ebeddd720361676c2b18f3b6bf2b1350507a0f29f7 + checksum: 9b6d504dfee3382cf06568aa02d9d8b21dd8ec1c01c62e544f33f05d11277fdddcf81383a72cb96cf25291f4ca591230b43d0e49b51223ac695d126be47485e6 languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/token-providers@npm:3.954.0" +"@aws-sdk/signature-v4-multi-region@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/signature-v4-multi-region@npm:3.957.0" dependencies: - "@aws-sdk/core": 3.954.0 - "@aws-sdk/nested-clients": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@smithy/property-provider": ^4.2.6 - "@smithy/shared-ini-file-loader": ^4.4.1 - "@smithy/types": ^4.10.0 + "@aws-sdk/middleware-sdk-s3": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@smithy/protocol-http": ^5.3.7 + "@smithy/signature-v4": ^5.3.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: b2419ff9acf7427961baf65fc45061fa820034e42a820532f11116551af014ed8973944d82774848066b740ed237818352a6615d599802be4bbc785d4303ead2 + checksum: aa1ca0bab434a45339d313b983afb37cb36f1da1124609c52246fd04c7dbfb297fb8fc8c584218e2d4ef3d641e5bd3ca3cdee8cec377f4c545754eab5283007d languageName: node linkType: hard -"@aws-sdk/types@npm:3.922.0": - version: 3.922.0 - resolution: "@aws-sdk/types@npm:3.922.0" +"@aws-sdk/token-providers@npm:3.958.0": + version: 3.958.0 + resolution: "@aws-sdk/token-providers@npm:3.958.0" dependencies: - "@smithy/types": ^4.8.1 + "@aws-sdk/core": 3.957.0 + "@aws-sdk/nested-clients": 3.958.0 + "@aws-sdk/types": 3.957.0 + "@smithy/property-provider": ^4.2.7 + "@smithy/shared-ini-file-loader": ^4.4.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 5cc16a7d819a4892aec95ce6f7349c7e7091f236304d62000780f8db00b9c1826533f7f5e8b701a4d5b556db06b68e69f6efda25454bc6fa58d1e050cf5cc87d + checksum: 697b90eb348c74594ba5f4383edf958539a54db7187f9754d0a5ae607b513e0196ac765d1e6b161813a18da5da767de15217cf1a0555ba69b85a5d71c4a75347 languageName: node linkType: hard -"@aws-sdk/types@npm:3.936.0": - version: 3.936.0 - resolution: "@aws-sdk/types@npm:3.936.0" +"@aws-sdk/types@npm:3.957.0, @aws-sdk/types@npm:^3.222.0": + version: 3.957.0 + resolution: "@aws-sdk/types@npm:3.957.0" dependencies: - "@smithy/types": ^4.9.0 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 352e767671d3dd5100e0b14dec344ac7f38c4d33fe3953c8b0a17cb5ba6e9bd42701fd68ac068cfab11853f62fc4ffb543f68c2f90db0a2d8ec6ad99d939a2b4 + checksum: 2329c3c0a3b16715dc889c58a652dae8e7b64c23484ee7df633bc50feeb8e6a8c5b597ebd7f194d301b9df70d26d6102f6b65eb871218cc41d676d2193d0be80 languageName: node linkType: hard -"@aws-sdk/types@npm:3.953.0, @aws-sdk/types@npm:^3.222.0": - version: 3.953.0 - resolution: "@aws-sdk/types@npm:3.953.0" +"@aws-sdk/util-arn-parser@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/util-arn-parser@npm:3.957.0" dependencies: - "@smithy/types": ^4.10.0 tslib: ^2.6.2 - checksum: ac2b66fff316401afba46a965d63436a6eda9ce2136d9a54892e7c254225dec92edcae1b6d8d953256042598fe9d20cf2f96df9f539bb05b14379530e8c4033b + checksum: cb12dd2f69128cc520fcc34ecb1e07c5a477632dee1f3842eb09920cdaf04e893ea213aa3f3ec017b4d90c5a676d2a143fb4afadcdfc868feac76af25aae003c languageName: node linkType: hard -"@aws-sdk/util-arn-parser@npm:3.893.0": - version: 3.893.0 - resolution: "@aws-sdk/util-arn-parser@npm:3.893.0" - dependencies: - tslib: ^2.6.2 - checksum: 9c0d256dee5e91f18155452562cd429e795ffe8f76ca4b2d3806391b94ac994b83bfb6d4dde1344c2f0b4b89296b79bb422264286b1a0401a1fc002fa53ba2f0 - languageName: node - linkType: hard - -"@aws-sdk/util-dynamodb@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/util-dynamodb@npm:3.953.0" +"@aws-sdk/util-dynamodb@npm:3.958.0": + version: 3.958.0 + resolution: "@aws-sdk/util-dynamodb@npm:3.958.0" dependencies: tslib: ^2.6.2 peerDependencies: - "@aws-sdk/client-dynamodb": ^3.953.0 - checksum: 9b78c63ada1b5ee2ae7ec63b2e75691e99522665ede05a13e2864e71114ae0714657b2416167aadb4539c04fd9b28069a8262d7f8d5121c2a4d0b37e719b8603 - languageName: node - linkType: hard - -"@aws-sdk/util-endpoints@npm:3.922.0": - version: 3.922.0 - resolution: "@aws-sdk/util-endpoints@npm:3.922.0" - dependencies: - "@aws-sdk/types": 3.922.0 - "@smithy/types": ^4.8.1 - "@smithy/url-parser": ^4.2.4 - "@smithy/util-endpoints": ^3.2.4 - tslib: ^2.6.2 - checksum: e0d364e6dbb7754f94b47c5b5693c90d22fb0ac7de3098ffc1ed31cf8fb4846cd14b346329be6e3f494f592547d61cde74d8c4812be4e7bb5b1f4295f44c84b3 - languageName: node - linkType: hard - -"@aws-sdk/util-endpoints@npm:3.936.0": - version: 3.936.0 - resolution: "@aws-sdk/util-endpoints@npm:3.936.0" - dependencies: - "@aws-sdk/types": 3.936.0 - "@smithy/types": ^4.9.0 - "@smithy/url-parser": ^4.2.5 - "@smithy/util-endpoints": ^3.2.5 - tslib: ^2.6.2 - checksum: 12a9596501f573b037af3b4db68f95dd57d980f2f07e5030749e1460d1f2fe8a3990160aed0cde343e9e7a30acc7ac05efc70b9902f51aee5c47d4192c957414 + "@aws-sdk/client-dynamodb": ^3.958.0 + checksum: 7f70252246e2f9c79be68a46c88f7868459090f0604788f6441b8b8f2d559600165df77a2cce3f7a1d115ca092af532620847081fff8a0761a41356513a58b8e languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/util-endpoints@npm:3.953.0" +"@aws-sdk/util-endpoints@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/util-endpoints@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.953.0 - "@smithy/types": ^4.10.0 - "@smithy/url-parser": ^4.2.6 - "@smithy/util-endpoints": ^3.2.6 + "@aws-sdk/types": 3.957.0 + "@smithy/types": ^4.11.0 + "@smithy/url-parser": ^4.2.7 + "@smithy/util-endpoints": ^3.2.7 tslib: ^2.6.2 - checksum: 073d3798955b89a021086a5995577a10f3a38bd6e893f4d065205dfbf388e9811b9108a42cb2f6c4f97aa5b8c061acf6f619045dad15e023abf4804a3d0e1770 + checksum: 33e0da67fa1f126319b4d3cd219d2bd9ad7b523a82f50049d7118b68a525be2124c1f2d36c444805110c5cc7922657aecd3810ed9a8c27db4c601c110b4becaf languageName: node linkType: hard -"@aws-sdk/util-format-url@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/util-format-url@npm:3.953.0" +"@aws-sdk/util-format-url@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/util-format-url@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.953.0 - "@smithy/querystring-builder": ^4.2.6 - "@smithy/types": ^4.10.0 + "@aws-sdk/types": 3.957.0 + "@smithy/querystring-builder": ^4.2.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 582871f4685183c1ff89703bb2fb1e7dfd5d51147344a0680f943f22b11e41372f0ceffdd33a97603dfdeb81fab418a508633dc75093ceebd79fc0a828ac3307 + checksum: b599c2294fc1c0160dfdaeb09046d3ed7493f475125a3bd27c6bd545442b3afb0636661143365b029851cb0b83f8a72b6232b1f046a414b86a75e6676eb700ef languageName: node linkType: hard "@aws-sdk/util-locate-window@npm:^3.0.0": - version: 3.893.0 - resolution: "@aws-sdk/util-locate-window@npm:3.893.0" - dependencies: - tslib: ^2.6.2 - checksum: 735256013b05ef15b57ca75473066debf1441ec4b975a08387e94f932ad9ed57bcf3ce1465c12d74f89c667cde0021822b4772d5fbf02501abc3c049526db44a - languageName: node - linkType: hard - -"@aws-sdk/util-user-agent-browser@npm:3.922.0": - version: 3.922.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.922.0" - dependencies: - "@aws-sdk/types": 3.922.0 - "@smithy/types": ^4.8.1 - bowser: ^2.11.0 - tslib: ^2.6.2 - checksum: 90b4c5588738a00bc49b47d872a99e7b40d1dc7e52670f7aa3e6d6371ccf574016647d9dc1d0abe4acd386a516d8fff5a00cb21fd905f8f1f2754a7fbae78ac3 - languageName: node - linkType: hard - -"@aws-sdk/util-user-agent-browser@npm:3.936.0": - version: 3.936.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.936.0" + version: 3.957.0 + resolution: "@aws-sdk/util-locate-window@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.936.0 - "@smithy/types": ^4.9.0 - bowser: ^2.11.0 tslib: ^2.6.2 - checksum: 6ce8fe3059f0f3970cb24c227253c012c4633de8b15cb2a7e22b2df7434ef655f9305358fc3872c9f8cb731d42932285f614b499f36a74d9d866736ab5e39207 + checksum: 8b63b96a35dd9770b4e0062cc529836282367020951af59f2be881c38f17bf6691102aa8da739a13f6fb816c6a229c33c4c8bddf96bf0054456031cf1e5af89b languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.953.0" +"@aws-sdk/util-user-agent-browser@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.957.0" dependencies: - "@aws-sdk/types": 3.953.0 - "@smithy/types": ^4.10.0 + "@aws-sdk/types": 3.957.0 + "@smithy/types": ^4.11.0 bowser: ^2.11.0 tslib: ^2.6.2 - checksum: 4ac0510791921ef7545bcaf8feee6e92fb222d19968556c816ea71854f78d58986a711abf27a345fa110bf05268734f9d49e8f0e322d64c59ef7a0e5b3ad50d1 - languageName: node - linkType: hard - -"@aws-sdk/util-user-agent-node@npm:3.926.0": - version: 3.926.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.926.0" - dependencies: - "@aws-sdk/middleware-user-agent": 3.926.0 - "@aws-sdk/types": 3.922.0 - "@smithy/node-config-provider": ^4.3.4 - "@smithy/types": ^4.8.1 - tslib: ^2.6.2 - peerDependencies: - aws-crt: ">=1.0.0" - peerDependenciesMeta: - aws-crt: - optional: true - checksum: f8d38075db2c2f05e90040fe1fc1505b435d577f34cbe28ecf1aa655c99f7583d81208ef68f698717331614ec9513b39a86eef4396bc6fd9726bd8edeb6d1fb8 - languageName: node - linkType: hard - -"@aws-sdk/util-user-agent-node@npm:3.947.0": - version: 3.947.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.947.0" - dependencies: - "@aws-sdk/middleware-user-agent": 3.947.0 - "@aws-sdk/types": 3.936.0 - "@smithy/node-config-provider": ^4.3.5 - "@smithy/types": ^4.9.0 - tslib: ^2.6.2 - peerDependencies: - aws-crt: ">=1.0.0" - peerDependenciesMeta: - aws-crt: - optional: true - checksum: 3c682e9249fda46bfd3ff997e881eb0881148dce3f2f204d2d8004e68f311a74325dfd8d8a4fd66cdfe2fefa6344d62c8cccd06b9ea8c7cc62a1668478b2e455 + checksum: b5cc190bc528302a1ac4f35f2abee7420ba0ba17f326bb4de1e11a91e2f10b477e72c3d3fa18f64b27766614973418af8f4af8d6c55911aada340cb0e25b63c9 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.954.0": - version: 3.954.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.954.0" +"@aws-sdk/util-user-agent-node@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.957.0" dependencies: - "@aws-sdk/middleware-user-agent": 3.954.0 - "@aws-sdk/types": 3.953.0 - "@smithy/node-config-provider": ^4.3.6 - "@smithy/types": ^4.10.0 + "@aws-sdk/middleware-user-agent": 3.957.0 + "@aws-sdk/types": 3.957.0 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: faf24220fa6f1065b6169c352135983ff6dbd0f8e704a8da08a18ad552274076a038d7ce1d05163e7327cac825a261da62031865379527d372d113943f80a1d9 - languageName: node - linkType: hard - -"@aws-sdk/xml-builder@npm:3.921.0": - version: 3.921.0 - resolution: "@aws-sdk/xml-builder@npm:3.921.0" - dependencies: - "@smithy/types": ^4.8.1 - fast-xml-parser: 5.2.5 - tslib: ^2.6.2 - checksum: f99aa4484a7c868bab028c63d8daad0dd359a46f2f08130dcd43b31f5d9899273ee154bb3895348b779e793e4e6b7585eee591c7b3ca3b69b823075fa315d4f9 - languageName: node - linkType: hard - -"@aws-sdk/xml-builder@npm:3.930.0": - version: 3.930.0 - resolution: "@aws-sdk/xml-builder@npm:3.930.0" - dependencies: - "@smithy/types": ^4.9.0 - fast-xml-parser: 5.2.5 - tslib: ^2.6.2 - checksum: 3e57e8e3be4706667d478f7198beaf0c0e49117312211c3e5640d5a1cee729b743fa957560d3814c1bc779698e203b93e5e4fb3c9a2accf58de38e7100fffd58 + checksum: e0150750960a4b59468cdb28368c37e773c1d873c5761290c0ab2bb54324876eb4a93d79cd45dd35382ae4627702385a694485813fb8f5d1a6edfe3c0abfefe6 languageName: node linkType: hard -"@aws-sdk/xml-builder@npm:3.953.0": - version: 3.953.0 - resolution: "@aws-sdk/xml-builder@npm:3.953.0" +"@aws-sdk/xml-builder@npm:3.957.0": + version: 3.957.0 + resolution: "@aws-sdk/xml-builder@npm:3.957.0" dependencies: - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 fast-xml-parser: 5.2.5 tslib: ^2.6.2 - checksum: 90a59fc0c661e68473cc4ca3525221c6397a8808d3c994c32643d7f7385b1ce46cec182549b5b1d3566ad1212181305a3f26f80524f69670651c46650af4db3c - languageName: node - linkType: hard - -"@aws/lambda-invoke-store@npm:^0.1.1": - version: 0.1.1 - resolution: "@aws/lambda-invoke-store@npm:0.1.1" - checksum: 1f277dcfe693dbaf145aa3307b8d772c6fd1120b5b163c8240faa01383b1e735dc6f92a721a4afdace4709049ad33af88c3871de61deb4c9b9ef5e84faa4570e + checksum: 35be20d3127511ab697d86b3cc9f8edfe2578e3c7b68dd96a99b8407bad44feb58e32c9485e7cae10a304b4510064f1b92bac7cb7dba2b4541c0ccb9795ffce5 languageName: node linkType: hard @@ -1908,29 +1302,29 @@ __metadata: linkType: hard "@azure/msal-browser@npm:^4.2.0": - version: 4.26.1 - resolution: "@azure/msal-browser@npm:4.26.1" + version: 4.27.0 + resolution: "@azure/msal-browser@npm:4.27.0" dependencies: - "@azure/msal-common": 15.13.1 - checksum: c7665493c574c703ce2b70ff4889c7f3c5675d49a180e09ff04f8cef67cbd0c8177b820682bcc8f17e4d416a24952c82eda406e0dbd35d927167d8761062d282 + "@azure/msal-common": 15.13.3 + checksum: 55449d00da1e0f768336b7e61e5c4566fb1020d7dc0ef90a398f50d0ea303f41129cb28ad5832f23b73c595467f314303321be77c7dde64292746699677f8555 languageName: node linkType: hard -"@azure/msal-common@npm:15.13.1": - version: 15.13.1 - resolution: "@azure/msal-common@npm:15.13.1" - checksum: 8a4bede949a4210c8349dd4ef6270b646dcc126e92f357c1d5b89e96429131df195f6cb1d7cf980b4c4ed2dadd8c7dd19decb6c31e2aca3a860d21db90ceab67 +"@azure/msal-common@npm:15.13.3": + version: 15.13.3 + resolution: "@azure/msal-common@npm:15.13.3" + checksum: 80a0185a32beccb926b0917a799f721c5ca89c59db503dd0ba6a61349c7250902e01e1385dd8bc2902a83f638dbf973b25e726fb63ec554c1aa0f867d787dae7 languageName: node linkType: hard "@azure/msal-node@npm:^3.5.0": - version: 3.8.1 - resolution: "@azure/msal-node@npm:3.8.1" + version: 3.8.4 + resolution: "@azure/msal-node@npm:3.8.4" dependencies: - "@azure/msal-common": 15.13.1 + "@azure/msal-common": 15.13.3 jsonwebtoken: ^9.0.0 uuid: ^8.3.0 - checksum: 70696b260308b19f8f32d40f8af718e21950e5fe198a0b6f61883bbf65f131cfba51fc2f3871cb1add2c68f1b72ce5095cbed3769b59f8b9d619edfe08a9744a + checksum: b49ccf85944fc5ef7e586d756e1342143c25af915703c5f1d1a80019be6ae7d28d9c0e5210f5786e384865b826efcba6ce730cf38f5bfc763ab41ef274075ae2 languageName: node linkType: hard @@ -2841,8 +2235,8 @@ __metadata: linkType: hard "@mapbox/node-pre-gyp@npm:^2.0.0": - version: 2.0.0 - resolution: "@mapbox/node-pre-gyp@npm:2.0.0" + version: 2.0.3 + resolution: "@mapbox/node-pre-gyp@npm:2.0.3" dependencies: consola: ^3.2.3 detect-libc: ^2.0.0 @@ -2853,7 +2247,7 @@ __metadata: tar: ^7.4.0 bin: node-pre-gyp: bin/node-pre-gyp - checksum: 39aad1251c71cc8ef348a0da6a82000bc4c94b02afe519d6595d779c3002676a05902bd1e438c45cb54b779d04bdbaf422037379a1f72af353daebd54741f4b7 + checksum: 8b1a9833d4b6cb5cda943fa3e5c2cc61395e2623570092c98d585c3ce3c44088d597d88cbe89cdd99c57ae741927bcbeb58880fbfb03e4161640bed250ab7916 languageName: node linkType: hard @@ -2865,11 +2259,11 @@ __metadata: linkType: hard "@mongodb-js/saslprep@npm:^1.3.0": - version: 1.3.2 - resolution: "@mongodb-js/saslprep@npm:1.3.2" + version: 1.4.4 + resolution: "@mongodb-js/saslprep@npm:1.4.4" dependencies: sparse-bitfield: ^3.0.3 - checksum: 13f190f59778b1abeafea2acc219be0540d3aa38e521e853fcca26c2dfcaed12ce1407f807c72a661ad257be51df17e9c8c9c3d8ce46ea479415c3f9b70a4743 + checksum: fb119500f6c105479d0f23df7d1aefdfa21f16671f29c621f13c91d02cf3f1d832dc3f988df0b15586366738273382c6875caa46e5cd55b30f2ed3a5a4c1d099 languageName: node linkType: hard @@ -3088,8 +2482,8 @@ __metadata: linkType: hard "@nestjs/testing@npm:^11.1.9": - version: 11.1.9 - resolution: "@nestjs/testing@npm:11.1.9" + version: 11.1.10 + resolution: "@nestjs/testing@npm:11.1.10" dependencies: tslib: 2.8.1 peerDependencies: @@ -3102,7 +2496,7 @@ __metadata: optional: true "@nestjs/platform-express": optional: true - checksum: 9eaf1f3665fd9354968da17c90ab5f1c8166bde7516ae3007889b7fb5e50a74d8dce628d212368eba07795f1e67449b3561b5b9990fd2be7a0494ea50e7f6b5e + checksum: c25923d21a225946a9d5c2456506228c91af841e520bce1ac9e1d0b46a133f0cc22ee33d39b683ed97f3d5ec21facdea59191795ccadcea70d26d0695663abbd languageName: node linkType: hard @@ -3208,16 +2602,16 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/agent@npm:3.0.0" +"@npmcli/agent@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/agent@npm:4.0.0" dependencies: agent-base: ^7.1.0 http-proxy-agent: ^7.0.0 https-proxy-agent: ^7.0.1 - lru-cache: ^10.0.1 + lru-cache: ^11.2.1 socks-proxy-agent: ^8.0.3 - checksum: e8fc25d536250ed3e669813b36e8c6d805628b472353c57afd8c4fde0fcfcf3dda4ffe22f7af8c9070812ec2e7a03fb41d7151547cef3508efe661a5a3add20f + checksum: 89ae20b44859ff8d4de56ade319d8ceaa267a0742d6f7345fe98aa5cd8614ced7db85ea4dc5bfbd6614dbb200a10b134e087143582534c939e8a02219e8665c8 languageName: node linkType: hard @@ -3230,12 +2624,12 @@ __metadata: languageName: node linkType: hard -"@npmcli/fs@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/fs@npm:4.0.0" +"@npmcli/fs@npm:^5.0.0": + version: 5.0.0 + resolution: "@npmcli/fs@npm:5.0.0" dependencies: semver: ^7.3.5 - checksum: 68951c589e9a4328698a35fd82fe71909a257d6f2ede0434d236fa55634f0fbcad9bb8755553ce5849bd25ee6f019f4d435921ac715c853582c4a7f5983c8d4a + checksum: 897dac32eb37e011800112d406b9ea2ebd96f1dab01bb8fbeb59191b86f6825dffed6a89f3b6c824753d10f8735b76d630927bd7610e9e123b129ef2e5f02cb5 languageName: node linkType: hard @@ -3694,144 +3088,144 @@ __metadata: languageName: node linkType: hard -"@oxc-resolver/binding-android-arm-eabi@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-android-arm-eabi@npm:11.15.0" +"@oxc-resolver/binding-android-arm-eabi@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-android-arm-eabi@npm:11.16.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@oxc-resolver/binding-android-arm64@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-android-arm64@npm:11.15.0" +"@oxc-resolver/binding-android-arm64@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-android-arm64@npm:11.16.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@oxc-resolver/binding-darwin-arm64@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-darwin-arm64@npm:11.15.0" +"@oxc-resolver/binding-darwin-arm64@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-darwin-arm64@npm:11.16.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@oxc-resolver/binding-darwin-x64@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-darwin-x64@npm:11.15.0" +"@oxc-resolver/binding-darwin-x64@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-darwin-x64@npm:11.16.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@oxc-resolver/binding-freebsd-x64@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-freebsd-x64@npm:11.15.0" +"@oxc-resolver/binding-freebsd-x64@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-freebsd-x64@npm:11.16.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.15.0" +"@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.16.0" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@oxc-resolver/binding-linux-arm-musleabihf@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-linux-arm-musleabihf@npm:11.15.0" +"@oxc-resolver/binding-linux-arm-musleabihf@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-linux-arm-musleabihf@npm:11.16.0" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@oxc-resolver/binding-linux-arm64-gnu@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:11.15.0" +"@oxc-resolver/binding-linux-arm64-gnu@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:11.16.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-arm64-musl@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:11.15.0" +"@oxc-resolver/binding-linux-arm64-musl@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:11.16.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@oxc-resolver/binding-linux-ppc64-gnu@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-linux-ppc64-gnu@npm:11.15.0" +"@oxc-resolver/binding-linux-ppc64-gnu@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-linux-ppc64-gnu@npm:11.16.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-riscv64-gnu@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-linux-riscv64-gnu@npm:11.15.0" +"@oxc-resolver/binding-linux-riscv64-gnu@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-linux-riscv64-gnu@npm:11.16.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-riscv64-musl@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-linux-riscv64-musl@npm:11.15.0" +"@oxc-resolver/binding-linux-riscv64-musl@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-linux-riscv64-musl@npm:11.16.0" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@oxc-resolver/binding-linux-s390x-gnu@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-linux-s390x-gnu@npm:11.15.0" +"@oxc-resolver/binding-linux-s390x-gnu@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-linux-s390x-gnu@npm:11.16.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-x64-gnu@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:11.15.0" +"@oxc-resolver/binding-linux-x64-gnu@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:11.16.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@oxc-resolver/binding-linux-x64-musl@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-linux-x64-musl@npm:11.15.0" +"@oxc-resolver/binding-linux-x64-musl@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-linux-x64-musl@npm:11.16.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@oxc-resolver/binding-openharmony-arm64@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-openharmony-arm64@npm:11.15.0" +"@oxc-resolver/binding-openharmony-arm64@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-openharmony-arm64@npm:11.16.0" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@oxc-resolver/binding-wasm32-wasi@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-wasm32-wasi@npm:11.15.0" +"@oxc-resolver/binding-wasm32-wasi@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-wasm32-wasi@npm:11.16.0" dependencies: "@napi-rs/wasm-runtime": ^1.1.0 conditions: cpu=wasm32 languageName: node linkType: hard -"@oxc-resolver/binding-win32-arm64-msvc@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:11.15.0" +"@oxc-resolver/binding-win32-arm64-msvc@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:11.16.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@oxc-resolver/binding-win32-ia32-msvc@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-win32-ia32-msvc@npm:11.15.0" +"@oxc-resolver/binding-win32-ia32-msvc@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-win32-ia32-msvc@npm:11.16.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@oxc-resolver/binding-win32-x64-msvc@npm:11.15.0": - version: 11.15.0 - resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:11.15.0" +"@oxc-resolver/binding-win32-x64-msvc@npm:11.16.0": + version: 11.16.0 + resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:11.16.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4121,148 +3515,190 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/abort-controller@npm:4.2.6" +"@smithy/abort-controller@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/abort-controller@npm:4.2.7" + dependencies: + "@smithy/types": ^4.11.0 + tslib: ^2.6.2 + checksum: 2312577b51ef4a444204ff806b16193b4ba384e6d9f8ac8c5d23d4e6eac12d1234da7faca0680e7c9f65721417277d61f739ecc67d7e87d2da0d675378c25319 + languageName: node + linkType: hard + +"@smithy/chunked-blob-reader-native@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/chunked-blob-reader-native@npm:4.2.1" + dependencies: + "@smithy/util-base64": ^4.3.0 + tslib: ^2.6.2 + checksum: 717d0fa7cdf6db30fe1d75d4e5d8bbbd35c1421c59cd4802ac588bbe213e49f7b8af52bbf6f32b77d8c2cc43639a73fc99d83aed3d55046bec68ec54bc1888f8 + languageName: node + linkType: hard + +"@smithy/chunked-blob-reader@npm:^5.2.0": + version: 5.2.0 + resolution: "@smithy/chunked-blob-reader@npm:5.2.0" dependencies: - "@smithy/types": ^4.10.0 tslib: ^2.6.2 - checksum: 60de03ad749ec64dc096ee0d3a60d4aeeffd431932bb7cd176a34fa5d61009ecc3df98949195910fa0d53fba45e009428c1a8a02505b5a2a7c36eff668848b45 + checksum: ce68e3a455ed78aaf5735844d4bb3ab50770ac1210c40a6da01992be37f234fff49fa488aba1b46214888c004db4f3fb4a0fa6a88796b084fc2eb385a5b0deb3 languageName: node linkType: hard -"@smithy/config-resolver@npm:^4.4.2, @smithy/config-resolver@npm:^4.4.3, @smithy/config-resolver@npm:^4.4.4": - version: 4.4.4 - resolution: "@smithy/config-resolver@npm:4.4.4" +"@smithy/config-resolver@npm:^4.4.5": + version: 4.4.5 + resolution: "@smithy/config-resolver@npm:4.4.5" dependencies: - "@smithy/node-config-provider": ^4.3.6 - "@smithy/types": ^4.10.0 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/types": ^4.11.0 "@smithy/util-config-provider": ^4.2.0 - "@smithy/util-endpoints": ^3.2.6 - "@smithy/util-middleware": ^4.2.6 + "@smithy/util-endpoints": ^3.2.7 + "@smithy/util-middleware": ^4.2.7 tslib: ^2.6.2 - checksum: c901b78ee5c306bc6c4800efaa2879c0fd10c073e65ee324dcbf83adcebc6d94283fdc953821e531ed7c47b6dfea7bd1f9ccda1f2830b89b2732772658939f20 + checksum: 858b37fecca49d1104915de5932c09e1375f3cebfce505f569b408fe6b23078df4afe35366137a9603376d603586e2df68f015e4440b6406c6eee977fd1c1d13 languageName: node linkType: hard -"@smithy/core@npm:^3.17.2, @smithy/core@npm:^3.18.7, @smithy/core@npm:^3.19.0": - version: 3.19.0 - resolution: "@smithy/core@npm:3.19.0" +"@smithy/core@npm:^3.20.0": + version: 3.20.0 + resolution: "@smithy/core@npm:3.20.0" dependencies: - "@smithy/middleware-serde": ^4.2.7 - "@smithy/protocol-http": ^5.3.6 - "@smithy/types": ^4.10.0 + "@smithy/middleware-serde": ^4.2.8 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 "@smithy/util-base64": ^4.3.0 "@smithy/util-body-length-browser": ^4.2.0 - "@smithy/util-middleware": ^4.2.6 - "@smithy/util-stream": ^4.5.7 + "@smithy/util-middleware": ^4.2.7 + "@smithy/util-stream": ^4.5.8 "@smithy/util-utf8": ^4.2.0 "@smithy/uuid": ^1.1.0 tslib: ^2.6.2 - checksum: b93007079ca6fe92258087d40cbd29efba94a40c653707b274f2fa5e0c7a1a890593ecb6b62c190d9219ffff48d8df6c3a8e1afc9841a08640f6d031282c8d97 + checksum: e4f776b96e756dc087b0ca24334fc20efab0e80a9ff38b457e011baca0491ddac6e71ce58da9cf884d05905d859d923614df0cd30ce6fc08565c504b5c27e901 languageName: node linkType: hard -"@smithy/credential-provider-imds@npm:^4.2.4, @smithy/credential-provider-imds@npm:^4.2.5, @smithy/credential-provider-imds@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/credential-provider-imds@npm:4.2.6" +"@smithy/credential-provider-imds@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/credential-provider-imds@npm:4.2.7" dependencies: - "@smithy/node-config-provider": ^4.3.6 - "@smithy/property-provider": ^4.2.6 - "@smithy/types": ^4.10.0 - "@smithy/url-parser": ^4.2.6 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/property-provider": ^4.2.7 + "@smithy/types": ^4.11.0 + "@smithy/url-parser": ^4.2.7 tslib: ^2.6.2 - checksum: 70a1e53f85217e22d2d84d96fe3ad8b29715b255105f3685c6a22d95cfad19ad32e44033ef81aabfcb215e7defec83bf9171180ba0bddbcdef6e5bb301c27eef + checksum: 1d5688706f8cd3aad8f0202363257376f585931e077b910acfbb1fd5d555637a74c522dfdf80a5865c374b9caafed0125186cec53d35d464a80c9cb7f9f233a5 languageName: node linkType: hard -"@smithy/eventstream-codec@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/eventstream-codec@npm:4.2.6" +"@smithy/eventstream-codec@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/eventstream-codec@npm:4.2.7" dependencies: "@aws-crypto/crc32": 5.2.0 - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 "@smithy/util-hex-encoding": ^4.2.0 tslib: ^2.6.2 - checksum: 70431c2a6308bd37531ccdaa4f95412e71b405868a85c7eb26f4d06a409579fa97ebe9ea98a14c5ea8e9c387309e56febc4d7185c17d7c24b71f27e582c13555 + checksum: 9a9c84864f630303ddc2aa1de6901906363f5d703b0212eaa4c7dc5368bd9fffd142fa9d9505700613f07a8149730a9f1f8d59a19702678fb5dae7f21cea6571 languageName: node linkType: hard -"@smithy/eventstream-serde-browser@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/eventstream-serde-browser@npm:4.2.6" +"@smithy/eventstream-serde-browser@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/eventstream-serde-browser@npm:4.2.7" dependencies: - "@smithy/eventstream-serde-universal": ^4.2.6 - "@smithy/types": ^4.10.0 + "@smithy/eventstream-serde-universal": ^4.2.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 4ef06e570d1a9e3099884af7b45a9112a38c84c5d8c78e590bf1cf96d10057084e99fc3fe0b74a84a004b8f1ffed11dd77005a1cc42c46de5975b5337409a3da + checksum: e6393de54e3a4394ac60ba4278910f9179f8b8589bf4d74b2b30d33760567416e789be977250dbc67bb393592765a65face40aa9d7c4cb4a816e82dfc487db05 languageName: node linkType: hard -"@smithy/eventstream-serde-config-resolver@npm:^4.3.6": - version: 4.3.6 - resolution: "@smithy/eventstream-serde-config-resolver@npm:4.3.6" +"@smithy/eventstream-serde-config-resolver@npm:^4.3.7": + version: 4.3.7 + resolution: "@smithy/eventstream-serde-config-resolver@npm:4.3.7" dependencies: - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 94f980427e55c48431e55616b50c3de2a96d489d3e260e357dc3996018e01078c55730f614a477c99f5ba43231f5442610c64d1c2c36a99eedeaf3ef59cc0d17 + checksum: d42ff00eb9453fb1ebf920ab500c2eba3efa5ed1cb10cdd638cfeee164faea5e1c38e1bef8fdcda1ace4eb348bb8b739769c811b218d2547f7e031b742cae019 languageName: node linkType: hard -"@smithy/eventstream-serde-node@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/eventstream-serde-node@npm:4.2.6" +"@smithy/eventstream-serde-node@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/eventstream-serde-node@npm:4.2.7" dependencies: - "@smithy/eventstream-serde-universal": ^4.2.6 - "@smithy/types": ^4.10.0 + "@smithy/eventstream-serde-universal": ^4.2.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 928f9fe5e0caec0fcfc6003f31658ee4eaee3e1e4cfb930489a934a249c2dc32ee5f819dc52c438f996daf7613b0c99152e4c5f3dc6bdf05f236c4310f001a6e + checksum: 12ebbe494ba2446fbfd7b4491dfdc22297656ac7292cbda7985a01f72d1ae28918749e835ded7a723d32075f69e3cc412ac4f4588d1df53b2b583699b3aecb21 languageName: node linkType: hard -"@smithy/eventstream-serde-universal@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/eventstream-serde-universal@npm:4.2.6" +"@smithy/eventstream-serde-universal@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/eventstream-serde-universal@npm:4.2.7" dependencies: - "@smithy/eventstream-codec": ^4.2.6 - "@smithy/types": ^4.10.0 + "@smithy/eventstream-codec": ^4.2.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 3296dbc36c318a456347e422a3f7c3fae87c8f8016e8866811b9f6ab921433223b54051f32d051132ad38521c38dce454ff4f828367dbaca40411ef3e3b6490f + checksum: 13111b46ba00d87c7d8296002d0b19a6b1893c221b2e01855cbc557a16cce1b401797a3903ba9c4a8ab84ac99b013c807427087f3f5419cd242c947b6b9b9716 languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^5.3.5, @smithy/fetch-http-handler@npm:^5.3.6, @smithy/fetch-http-handler@npm:^5.3.7": - version: 5.3.7 - resolution: "@smithy/fetch-http-handler@npm:5.3.7" +"@smithy/fetch-http-handler@npm:^5.3.8": + version: 5.3.8 + resolution: "@smithy/fetch-http-handler@npm:5.3.8" dependencies: - "@smithy/protocol-http": ^5.3.6 - "@smithy/querystring-builder": ^4.2.6 - "@smithy/types": ^4.10.0 + "@smithy/protocol-http": ^5.3.7 + "@smithy/querystring-builder": ^4.2.7 + "@smithy/types": ^4.11.0 "@smithy/util-base64": ^4.3.0 tslib: ^2.6.2 - checksum: da1679199e5ac64f466fd82f13235b99ba41037e5c82d6fddbf51d65cb93d9a83f2613483d33ee69c5e4761733406ee19440d0533aa01bc255abece9c49c0f01 + checksum: 434434093459604ea9a3bdfe9b11ecb5fa85200a1eff42b32317e8a5c580a3757bff41b49a17ed9e7848a2a0a5eb0d8e91c0d0076ad895aaac80e5ea5a015f74 + languageName: node + linkType: hard + +"@smithy/hash-blob-browser@npm:^4.2.8": + version: 4.2.8 + resolution: "@smithy/hash-blob-browser@npm:4.2.8" + dependencies: + "@smithy/chunked-blob-reader": ^5.2.0 + "@smithy/chunked-blob-reader-native": ^4.2.1 + "@smithy/types": ^4.11.0 + tslib: ^2.6.2 + checksum: 5b0f2dcc03d1413767f0031ca7f448e3d1df468028d346a784a37c7e0f5e2c0670cdf4684cfcac8a164f3d43212fc4baa9bb53aae0cb3bdca1a2461e45c42f7a languageName: node linkType: hard -"@smithy/hash-node@npm:^4.2.4, @smithy/hash-node@npm:^4.2.5, @smithy/hash-node@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/hash-node@npm:4.2.6" +"@smithy/hash-node@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/hash-node@npm:4.2.7" dependencies: - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 "@smithy/util-buffer-from": ^4.2.0 "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: 46df49a52c733946a92534ee43cbe969f3aac6e8a14b53334cdd09618258bbd6067ac037727ef5de28aa057ac42590a9d322e038c83c512b3e64e583dc383c63 + checksum: f2d646f8366f6ed98d930c25315d7e9da671ac1ec2fdf8a0b999605e907ad37e01d1b4d2a69b04eda296be09aea8cbe57e88a8f4a3b3aaa125933d3b988e4be8 languageName: node linkType: hard -"@smithy/invalid-dependency@npm:^4.2.4, @smithy/invalid-dependency@npm:^4.2.5, @smithy/invalid-dependency@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/invalid-dependency@npm:4.2.6" +"@smithy/hash-stream-node@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/hash-stream-node@npm:4.2.7" dependencies: - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 + "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: 2a31c607df1a057c3525db26bde37db10413075713ca284ce2586886ee61a1295e7645f6fd033812ce92147c19b893de2e1b75fcd2060ccf620bf3a690196d8b + checksum: abc13f5fb15984bbfa58dfa4f71937ddbb9d9c90e09ee416ab2214bbeab642b070a74d037147f833ca8c4ddf68de0256edf4f5101e2d4b997e613d801fa8b277 + languageName: node + linkType: hard + +"@smithy/invalid-dependency@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/invalid-dependency@npm:4.2.7" + dependencies: + "@smithy/types": ^4.11.0 + tslib: ^2.6.2 + checksum: 1c3d82804779fd1cb7dd56f03c0ada0d21c2656b55338b56e91bdb4b96de57a3a7c8f940c627b46bb126175305112d3a386dfb78dd3b1e10b42d3c672a8ed802 languageName: node linkType: hard @@ -4284,204 +3720,215 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-content-length@npm:^4.2.4, @smithy/middleware-content-length@npm:^4.2.5, @smithy/middleware-content-length@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/middleware-content-length@npm:4.2.6" +"@smithy/md5-js@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/md5-js@npm:4.2.7" dependencies: - "@smithy/protocol-http": ^5.3.6 - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 + "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: a5276d50ff9f16a418d537cc8304c16447c24fa6baaadd810bebad20b380c1b757576a421a483a71b27aa6565251f4d76908ea407d4624782f3c47d3691a06d7 + checksum: c5861fc093c35f1230b208b3c4c44a97ef48b7c9c8e3853f689f8a1d6c0147e4be75bed546e28ecbb6f92bf65844642d973148b93b43e55dc4b258de33bad6ec languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^4.3.14, @smithy/middleware-endpoint@npm:^4.3.6, @smithy/middleware-endpoint@npm:^4.4.0": - version: 4.4.0 - resolution: "@smithy/middleware-endpoint@npm:4.4.0" - dependencies: - "@smithy/core": ^3.19.0 - "@smithy/middleware-serde": ^4.2.7 - "@smithy/node-config-provider": ^4.3.6 - "@smithy/shared-ini-file-loader": ^4.4.1 - "@smithy/types": ^4.10.0 - "@smithy/url-parser": ^4.2.6 - "@smithy/util-middleware": ^4.2.6 +"@smithy/middleware-content-length@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/middleware-content-length@npm:4.2.7" + dependencies: + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 + tslib: ^2.6.2 + checksum: 3a749b56a53774bc0c13e5f48c6c7353948968a4b72df3a75a92d66909bfc72e55f886a611d62a714789559d2d62e0fa455fe8ca9a12526c9e415cf4a65351d3 + languageName: node + linkType: hard + +"@smithy/middleware-endpoint@npm:^4.4.1": + version: 4.4.1 + resolution: "@smithy/middleware-endpoint@npm:4.4.1" + dependencies: + "@smithy/core": ^3.20.0 + "@smithy/middleware-serde": ^4.2.8 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/shared-ini-file-loader": ^4.4.2 + "@smithy/types": ^4.11.0 + "@smithy/url-parser": ^4.2.7 + "@smithy/util-middleware": ^4.2.7 tslib: ^2.6.2 - checksum: 88d4070189d93c6e0f665ecc146324d92cccef6a90e22d427b5a624772f5528e17e0575ffc4fc643c68b256a9f44a7f472a2ed4eb608f525f30929e92fdcb0c3 + checksum: 1f06c07294c4b1fdc4ae145bc0698762dc1db823c66ef936f70e00eeb3194e3c9bcd38d95739ebed17e514a53fb7e30174f1dfae005851153a2068f722216d1a languageName: node linkType: hard -"@smithy/middleware-retry@npm:^4.4.14, @smithy/middleware-retry@npm:^4.4.16, @smithy/middleware-retry@npm:^4.4.6": - version: 4.4.16 - resolution: "@smithy/middleware-retry@npm:4.4.16" +"@smithy/middleware-retry@npm:^4.4.17": + version: 4.4.17 + resolution: "@smithy/middleware-retry@npm:4.4.17" dependencies: - "@smithy/node-config-provider": ^4.3.6 - "@smithy/protocol-http": ^5.3.6 - "@smithy/service-error-classification": ^4.2.6 - "@smithy/smithy-client": ^4.10.1 - "@smithy/types": ^4.10.0 - "@smithy/util-middleware": ^4.2.6 - "@smithy/util-retry": ^4.2.6 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/service-error-classification": ^4.2.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 + "@smithy/util-middleware": ^4.2.7 + "@smithy/util-retry": ^4.2.7 "@smithy/uuid": ^1.1.0 tslib: ^2.6.2 - checksum: 1874b4f6cb8e4cf06e6f13d4e02490ca310d353d46889200db93034271fe7726ac6c37925211e0caf7c7e198a4b874efa1506b38c267d6436a7bc2f369a0a0ad + checksum: 5d249f317ca20d8e781ba360d9572b65ba1620055510d756d78e2e6a572a4ff125f65d722076f4fc140fae3121d97b3685d935d90588d0b92ce4464b8ca75475 languageName: node linkType: hard -"@smithy/middleware-serde@npm:^4.2.4, @smithy/middleware-serde@npm:^4.2.6, @smithy/middleware-serde@npm:^4.2.7": - version: 4.2.7 - resolution: "@smithy/middleware-serde@npm:4.2.7" +"@smithy/middleware-serde@npm:^4.2.8": + version: 4.2.8 + resolution: "@smithy/middleware-serde@npm:4.2.8" dependencies: - "@smithy/protocol-http": ^5.3.6 - "@smithy/types": ^4.10.0 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: afcf20b6d7cae2e2c8c49de4d8875da10fbbde2da54fc73b51a5461dee47b084452f8876621021b613d78520b77c594a0882741d2489c3ebaf232354d5a13dd8 + checksum: 136a6264361888729368587699d1f8c2fe6976530ac9947af77456921c919b95fa739f4658fb51d49b9e2d109c7c793e3e79b9d824066b0b5b0605fbcca85950 languageName: node linkType: hard -"@smithy/middleware-stack@npm:^4.2.4, @smithy/middleware-stack@npm:^4.2.5, @smithy/middleware-stack@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/middleware-stack@npm:4.2.6" +"@smithy/middleware-stack@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/middleware-stack@npm:4.2.7" dependencies: - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 826ab5f9c436fc1298c8efb16db9d0523b2e6d4beb1beae1aea882e5c9c3e1b5ba5f003bb56bc0752fa0d06dcefb83d6434ae313e048e39d28c9495795b61178 + checksum: b4a37250dee7c5163cff0520f6ddfb6d38fd2af0a9c7de70139cb6f4ca009ca18467c2ba41e477997caa36d083ce2429092c8b0a7e1c4133a6377497534a992a languageName: node linkType: hard -"@smithy/node-config-provider@npm:^4.3.4, @smithy/node-config-provider@npm:^4.3.5, @smithy/node-config-provider@npm:^4.3.6": - version: 4.3.6 - resolution: "@smithy/node-config-provider@npm:4.3.6" +"@smithy/node-config-provider@npm:^4.3.7": + version: 4.3.7 + resolution: "@smithy/node-config-provider@npm:4.3.7" dependencies: - "@smithy/property-provider": ^4.2.6 - "@smithy/shared-ini-file-loader": ^4.4.1 - "@smithy/types": ^4.10.0 + "@smithy/property-provider": ^4.2.7 + "@smithy/shared-ini-file-loader": ^4.4.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 1b451d1ca93e13e83b0afee45e6e15fc1bfbad570333a416864ba375df10e4286a68bc448e91d648490cf8e2e1836a2ea938bb00b2ce19daa8be18c74f7d328f + checksum: be6827951670d095a593fdf0721ebc091d31dc67e3343bb122617bbfb65bf3e2d30a5ae5a2806f1b0cd0507d491a0747eefbde20ae1fea95cf420c0801c1d614 languageName: node linkType: hard -"@smithy/node-http-handler@npm:^4.4.4, @smithy/node-http-handler@npm:^4.4.5, @smithy/node-http-handler@npm:^4.4.6": - version: 4.4.6 - resolution: "@smithy/node-http-handler@npm:4.4.6" +"@smithy/node-http-handler@npm:^4.4.7": + version: 4.4.7 + resolution: "@smithy/node-http-handler@npm:4.4.7" dependencies: - "@smithy/abort-controller": ^4.2.6 - "@smithy/protocol-http": ^5.3.6 - "@smithy/querystring-builder": ^4.2.6 - "@smithy/types": ^4.10.0 + "@smithy/abort-controller": ^4.2.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/querystring-builder": ^4.2.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 791d4ec0a694fb920c7358a8cac1d847a3eb409fa1fdfc1ae3fc7bcdbc0f847d2a78bef974891ac95dbb5ef68627bf935c87219eb41a670e5208d95a02337e91 + checksum: a03e8543414e794ca95eeaec19048a7f9354cb57ed0a7ccfd1e5c90bc06a36a9c55db128ce50cf7944a885c412a445cc9868005a6e0ee2aa8b7b0fcc02770c33 languageName: node linkType: hard -"@smithy/property-provider@npm:^4.2.4, @smithy/property-provider@npm:^4.2.5, @smithy/property-provider@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/property-provider@npm:4.2.6" +"@smithy/property-provider@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/property-provider@npm:4.2.7" dependencies: - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: bfb98c31b39f2f7bd8748f35fae10f13e1691b02ef0a77044016877c0b4a093a5270706781587b3d37164108c54fa325d0d112989a7e3da0fe64ddc9f3a95c78 + checksum: 76a33c70caa86fd72d7ae487a91b1abf5384e7c2c562293ebad4279d89102e84a36d071bcabcd3aabf82174e2aa3407f651d1680cea04b23d841bd3bd8c6aa3c languageName: node linkType: hard -"@smithy/protocol-http@npm:^5.3.4, @smithy/protocol-http@npm:^5.3.5, @smithy/protocol-http@npm:^5.3.6": - version: 5.3.6 - resolution: "@smithy/protocol-http@npm:5.3.6" +"@smithy/protocol-http@npm:^5.3.7": + version: 5.3.7 + resolution: "@smithy/protocol-http@npm:5.3.7" dependencies: - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: d5c0b88a61fab132ca7e2098c341ed33e9afc3cca5a164476007141d24e6ccbc9b3ba62898a10b69de869f086c076aef7d88aecf29da466192490a8d600a04b2 + checksum: 6d7f1cf78e44d67c5e8552173cd8e087b1f96d08b869966e593717af97d1373d8bd03c5d3d6346ebe08502ecc8f684889682519deba6e287179353271d006f4b languageName: node linkType: hard -"@smithy/querystring-builder@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/querystring-builder@npm:4.2.6" +"@smithy/querystring-builder@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/querystring-builder@npm:4.2.7" dependencies: - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 "@smithy/util-uri-escape": ^4.2.0 tslib: ^2.6.2 - checksum: 92a20c6b6d2edb65c7b169b7dd4745a4a3ac0fa7b1789875c62e62aa35ba9c689bd40bab62cf7e2ff39a7ab72ba35a6115ab483afdfa1f06cde09c9a079e36a2 + checksum: 479bddfc80ff2c759e173528fd0e18842dcd858da7980eed3c3958fefa63b803f795eb794fa3a07c5cda4cb27bd196536ace61eab3fb7d361e7692fe5db14935 languageName: node linkType: hard -"@smithy/querystring-parser@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/querystring-parser@npm:4.2.6" +"@smithy/querystring-parser@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/querystring-parser@npm:4.2.7" dependencies: - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 9e3d61e8078ff0c9426aa297aa540d4a7ddadad54fac28e0ced4b9ec30bafe79acbd1d900f271f3dd718f72de2e9dcc4c91ab3d6cd6aaa28158a0fb27c0ac6c0 + checksum: e4b89cdcc9ffa90d6db151d63ca2dba8cb92e52edb568eef653f47153877a48597bff228c474ff1b5b98697533ea336b053c8fdea26b8a09f4105689f0879bbd languageName: node linkType: hard -"@smithy/service-error-classification@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/service-error-classification@npm:4.2.6" +"@smithy/service-error-classification@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/service-error-classification@npm:4.2.7" dependencies: - "@smithy/types": ^4.10.0 - checksum: 6e4e9beddf66b2c05f4c11401dd9ae03a7cf35d0f51f2ef414c2e1346f1ae0a1c8429ff23d5a48360844e1142ce8611eb88c7fc2d05895decf53d2a1b461d7ee + "@smithy/types": ^4.11.0 + checksum: b7dfc1cbc20e53ee669fd64ce77e0a6a89c866f9b107cd995c7b40a54a72267d4f0de2ccc53f4de5d8fa028f9b42a4bab847ef353aae06ec35f213b5878a8313 languageName: node linkType: hard -"@smithy/shared-ini-file-loader@npm:^4.3.4, @smithy/shared-ini-file-loader@npm:^4.4.0, @smithy/shared-ini-file-loader@npm:^4.4.1": - version: 4.4.1 - resolution: "@smithy/shared-ini-file-loader@npm:4.4.1" +"@smithy/shared-ini-file-loader@npm:^4.4.2": + version: 4.4.2 + resolution: "@smithy/shared-ini-file-loader@npm:4.4.2" dependencies: - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 354ba80e24ea1c1dea67f6be4b661c97824f7381182be028d135f1315f8b4c40234060f43dd8be6fb9da713c8c6c988ae04565d828e29dad9b68c3dbd79cf5a5 + checksum: 60c2550a430c6b69a0309788adb4c79d852a4ed62f201956f87ebfb6ce22b9457782f42270e5f3dfeeb9ea43e7c1e9e3120bdd91ddffb275bb4aaa9172acb394 languageName: node linkType: hard -"@smithy/signature-v4@npm:^5.3.4, @smithy/signature-v4@npm:^5.3.5, @smithy/signature-v4@npm:^5.3.6": - version: 5.3.6 - resolution: "@smithy/signature-v4@npm:5.3.6" +"@smithy/signature-v4@npm:^5.3.7": + version: 5.3.7 + resolution: "@smithy/signature-v4@npm:5.3.7" dependencies: "@smithy/is-array-buffer": ^4.2.0 - "@smithy/protocol-http": ^5.3.6 - "@smithy/types": ^4.10.0 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 "@smithy/util-hex-encoding": ^4.2.0 - "@smithy/util-middleware": ^4.2.6 + "@smithy/util-middleware": ^4.2.7 "@smithy/util-uri-escape": ^4.2.0 "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: 461e701e2d3fcf4a781a5830b95dbd2556252d5ccd0e6c05ae2b7cfc6cd072844f9e76b5a2e414df16caf1bcc8d349caeb26200cb6b62c77f90c0d03769385d4 + checksum: e4fdb32a4f9e4e886e4f0d1c830a1823e175c31858852a8e24d5d2f8718a50aad4b2ec0bac40f01bfddf63d6c89c08b09df52e83469b3b64c03cde5780b69093 languageName: node linkType: hard -"@smithy/smithy-client@npm:^4.10.0, @smithy/smithy-client@npm:^4.10.1, @smithy/smithy-client@npm:^4.9.10, @smithy/smithy-client@npm:^4.9.2": - version: 4.10.1 - resolution: "@smithy/smithy-client@npm:4.10.1" +"@smithy/smithy-client@npm:^4.10.2": + version: 4.10.2 + resolution: "@smithy/smithy-client@npm:4.10.2" dependencies: - "@smithy/core": ^3.19.0 - "@smithy/middleware-endpoint": ^4.4.0 - "@smithy/middleware-stack": ^4.2.6 - "@smithy/protocol-http": ^5.3.6 - "@smithy/types": ^4.10.0 - "@smithy/util-stream": ^4.5.7 + "@smithy/core": ^3.20.0 + "@smithy/middleware-endpoint": ^4.4.1 + "@smithy/middleware-stack": ^4.2.7 + "@smithy/protocol-http": ^5.3.7 + "@smithy/types": ^4.11.0 + "@smithy/util-stream": ^4.5.8 tslib: ^2.6.2 - checksum: d52b31358e850f522049d890d2d17ccbbdc9c32f8713432a4e55351756e787c438e468951d163978f26221cf2a298e0ac73222ff58e4a2dd1c8fd1339d53ba80 + checksum: 63617a87100635c0c898277a72389e5b593d6799d9d230ca8c1abfe171756fbc7d917d6701618d4e3b7d2d09760d74c38f93845cd0876cf88f6a50221ea93295 languageName: node linkType: hard -"@smithy/types@npm:^4.10.0, @smithy/types@npm:^4.8.1, @smithy/types@npm:^4.9.0": - version: 4.10.0 - resolution: "@smithy/types@npm:4.10.0" +"@smithy/types@npm:^4.11.0": + version: 4.11.0 + resolution: "@smithy/types@npm:4.11.0" dependencies: tslib: ^2.6.2 - checksum: a62bafa2f40e8b4776096079f6477e3afd85e24cbcb5677eb2880cf6e358196642bfd0b9052d2e16d0b664b366d770a2a23213779ba7a7c072eb05061650add5 + checksum: f2e59add0aeb24380ff4e1c7abbbe9dd6f6ceb6e16a33803807709be75205389b26500a0d3e9307419bd6def263654752999a2873f33fce2370a6dd52744f75f languageName: node linkType: hard -"@smithy/url-parser@npm:^4.2.4, @smithy/url-parser@npm:^4.2.5, @smithy/url-parser@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/url-parser@npm:4.2.6" +"@smithy/url-parser@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/url-parser@npm:4.2.7" dependencies: - "@smithy/querystring-parser": ^4.2.6 - "@smithy/types": ^4.10.0 + "@smithy/querystring-parser": ^4.2.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: c51b657024fec87f4be90e8965ba7b2e2143b7aa7c2c5841788b621a6c80ce729be456d4592e2715a3d612257688be872f7edf520f85c544b1123c8558629c91 + checksum: ec867e7b8889dde798c8f7c55caa530877d8fa4f7dade5ecb8d3971c34d938d2289ec1cd8ebec0ab4943602a6046eb7616e709cc857d6c3747ae8f19b9d9f429 languageName: node linkType: hard @@ -4543,41 +3990,41 @@ __metadata: languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^4.3.13, @smithy/util-defaults-mode-browser@npm:^4.3.15, @smithy/util-defaults-mode-browser@npm:^4.3.5": - version: 4.3.15 - resolution: "@smithy/util-defaults-mode-browser@npm:4.3.15" +"@smithy/util-defaults-mode-browser@npm:^4.3.16": + version: 4.3.16 + resolution: "@smithy/util-defaults-mode-browser@npm:4.3.16" dependencies: - "@smithy/property-provider": ^4.2.6 - "@smithy/smithy-client": ^4.10.1 - "@smithy/types": ^4.10.0 + "@smithy/property-provider": ^4.2.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 5156a4e3589312d0f1a1a18cf6be411da33bcf7e2e560926ad0a5b2c1318ad5a8dd4ef392befd6bf42216b11db3729b537aacad25b139827f5c5b2a61e06ff35 + checksum: bd7b548d9f742437aaaaa9d026882aa0ba8435640f88d4343e4d8971ce682e76e394bd278a7a5fdfb4a41d54b261b3850a28e1c19640371d9bff4808755d373b languageName: node linkType: hard -"@smithy/util-defaults-mode-node@npm:^4.2.16, @smithy/util-defaults-mode-node@npm:^4.2.18, @smithy/util-defaults-mode-node@npm:^4.2.8": - version: 4.2.18 - resolution: "@smithy/util-defaults-mode-node@npm:4.2.18" +"@smithy/util-defaults-mode-node@npm:^4.2.19": + version: 4.2.19 + resolution: "@smithy/util-defaults-mode-node@npm:4.2.19" dependencies: - "@smithy/config-resolver": ^4.4.4 - "@smithy/credential-provider-imds": ^4.2.6 - "@smithy/node-config-provider": ^4.3.6 - "@smithy/property-provider": ^4.2.6 - "@smithy/smithy-client": ^4.10.1 - "@smithy/types": ^4.10.0 + "@smithy/config-resolver": ^4.4.5 + "@smithy/credential-provider-imds": ^4.2.7 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/property-provider": ^4.2.7 + "@smithy/smithy-client": ^4.10.2 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: b97e0366676727311b1abea5b97fb60ab33f18aadde8d7d01ae7833d675f961d81ae92a4bf627984069ef7b2a19197da3683f0af45b934ef2cafe5bbb7ba10b2 + checksum: fdb5fdbe2a9cbd8e1212b4b0ddb2ef8a574b4fe3af390c688c5a3951f83f41b09b4893b60efad69f5a727afa9d0c9526232c768ea1c5f8cead3ace7c80803de4 languageName: node linkType: hard -"@smithy/util-endpoints@npm:^3.2.4, @smithy/util-endpoints@npm:^3.2.5, @smithy/util-endpoints@npm:^3.2.6": - version: 3.2.6 - resolution: "@smithy/util-endpoints@npm:3.2.6" +"@smithy/util-endpoints@npm:^3.2.7": + version: 3.2.7 + resolution: "@smithy/util-endpoints@npm:3.2.7" dependencies: - "@smithy/node-config-provider": ^4.3.6 - "@smithy/types": ^4.10.0 + "@smithy/node-config-provider": ^4.3.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 5e6b076788158efb0f6ecae3441000db9ac3bfa1d136525b99eb3cfd737e2cd07b01a8f6fb2fe17fd4081de7e166313d8e6ec579902ea7d1491f200a9b674791 + checksum: 192d07f63daec53ae9c036a2535e429f2f97996c50fbe034fc4f589c810f5a141cf92b91339aa3a8026884a3fbe18924def4a0319d95cfefbc1683fad8b18948 languageName: node linkType: hard @@ -4590,40 +4037,40 @@ __metadata: languageName: node linkType: hard -"@smithy/util-middleware@npm:^4.2.4, @smithy/util-middleware@npm:^4.2.5, @smithy/util-middleware@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/util-middleware@npm:4.2.6" +"@smithy/util-middleware@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/util-middleware@npm:4.2.7" dependencies: - "@smithy/types": ^4.10.0 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: d06d40e6aefa71de06bcc2119631745377f2de3f39a976f3095d4dc80275907fd4ab502d8e5640f5ce416b5d3b4a1456c1ef8d5741afc63448d8999ff40ad0de + checksum: cd78d30f1b7a3d643709c01dc194eeae6e253ea25d3ce10ed957daf6cda272ce817c84a5ffae2a6462c81c71a4623bd9ae98c9db237898a54289d6ad0475c307 languageName: node linkType: hard -"@smithy/util-retry@npm:^4.2.4, @smithy/util-retry@npm:^4.2.5, @smithy/util-retry@npm:^4.2.6": - version: 4.2.6 - resolution: "@smithy/util-retry@npm:4.2.6" +"@smithy/util-retry@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/util-retry@npm:4.2.7" dependencies: - "@smithy/service-error-classification": ^4.2.6 - "@smithy/types": ^4.10.0 + "@smithy/service-error-classification": ^4.2.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 1b3429c54ce1a4e10353a69f78054445c2ed3fca4f0767eb54f7c80ba17623a89c46e687b2556b80acca94c95c9b9f8e8d944cd57079b493cdbc5a8cb9461284 + checksum: c46d1758706568309ff1498371f2441222280bf89930c3f3b31f900f91b581baff0b546b946e7fcf4b041aa0f0521f216f1af5c027753735ba0b122d587edb9c languageName: node linkType: hard -"@smithy/util-stream@npm:^4.5.5, @smithy/util-stream@npm:^4.5.6, @smithy/util-stream@npm:^4.5.7": - version: 4.5.7 - resolution: "@smithy/util-stream@npm:4.5.7" +"@smithy/util-stream@npm:^4.5.8": + version: 4.5.8 + resolution: "@smithy/util-stream@npm:4.5.8" dependencies: - "@smithy/fetch-http-handler": ^5.3.7 - "@smithy/node-http-handler": ^4.4.6 - "@smithy/types": ^4.10.0 + "@smithy/fetch-http-handler": ^5.3.8 + "@smithy/node-http-handler": ^4.4.7 + "@smithy/types": ^4.11.0 "@smithy/util-base64": ^4.3.0 "@smithy/util-buffer-from": ^4.2.0 "@smithy/util-hex-encoding": ^4.2.0 "@smithy/util-utf8": ^4.2.0 tslib: ^2.6.2 - checksum: 976ff1d7f71e19547836cffa2e0846f8fb751fd0694944b284af3e528557aa6c86c954a5049de3a07e21403fdba1e9d07db065cddf811a08816036275473ed50 + checksum: c8cb714e9cab5f1b04b9058be3c962fbfb38d13b2fb6e81625326ba96044e4d0da5530a8c96b170cd5dc4730ba199418ce313282505a687e69121d4f6da23b29 languageName: node linkType: hard @@ -4656,14 +4103,14 @@ __metadata: languageName: node linkType: hard -"@smithy/util-waiter@npm:^4.2.5": - version: 4.2.6 - resolution: "@smithy/util-waiter@npm:4.2.6" +"@smithy/util-waiter@npm:^4.2.7": + version: 4.2.7 + resolution: "@smithy/util-waiter@npm:4.2.7" dependencies: - "@smithy/abort-controller": ^4.2.6 - "@smithy/types": ^4.10.0 + "@smithy/abort-controller": ^4.2.7 + "@smithy/types": ^4.11.0 tslib: ^2.6.2 - checksum: 22a5304f3f338a98514898278448f651c91f46f245c8b68190af1c64e0a5aa5dda6b005d3a1cbcd20b1279b47b1d0e40ddac7e16acc17d3d8fc5c88e0e658643 + checksum: 97fd4cc65a28b3adfbdf9347a1fd661d5be0bc9df10fc664360da04c73b6e1b16e154da7d148c9f80893d09315af344d7e41512f3ecca187381e0564b71adb25 languageName: node linkType: hard @@ -4694,9 +4141,9 @@ __metadata: linkType: hard "@standard-schema/spec@npm:^1.0.0": - version: 1.0.0 - resolution: "@standard-schema/spec@npm:1.0.0" - checksum: 2d7d73a1c9706622750ab06fc40ef7c1d320b52d5e795f8a1c7a77d0d6a9f978705092bc4149327b3cff4c9a14e5b3800d3b00dc945489175a2d3031ded8332a + version: 1.1.0 + resolution: "@standard-schema/spec@npm:1.1.0" + checksum: 6245ebef5e698bb04752a22e996a7cc40406a404d9f68a9d4e1a7a10f2422da287247508e7b495a2f32bb38f3d57b4daf2c9ab4bf22d9bca13e20a3dc5ec575e languageName: node linkType: hard @@ -4728,9 +4175,9 @@ __metadata: linkType: hard "@tsconfig/node10@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node10@npm:1.0.11" - checksum: 51fe47d55fe1b80ec35e6e5ed30a13665fd3a531945350aa74a14a1e82875fb60b350c2f2a5e72a64831b1b6bc02acb6760c30b3738b54954ec2dea82db7a267 + version: 1.0.12 + resolution: "@tsconfig/node10@npm:1.0.12" + checksum: 27e2f989dbb20f773aa121b609a5361a473b7047ff286fce7c851e61f5eec0c74f0bdb38d5bd69c8a06f17e60e9530188f2219b1cbeabeac91f0a5fd348eac2a languageName: node linkType: hard @@ -4977,12 +4424,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=18, @types/node@npm:^24.10.1, @types/node@npm:^24.9.1": - version: 24.10.4 - resolution: "@types/node@npm:24.10.4" +"@types/node@npm:*, @types/node@npm:>=18": + version: 25.0.3 + resolution: "@types/node@npm:25.0.3" dependencies: undici-types: ~7.16.0 - checksum: 27db63085116aec2b92a36405ab4e8838eafd361ab05ba043e16b70e58b41572145b8078244aa5fd51b1f80076b2e7422c848c31c5a0df0dc5e20053e24720d3 + checksum: b5e0146eafe208e2f1c1167fd6078a460ace823ad1da61967ec70b8d7521bd6dd26f3cd945796effac48ef4b3df4d8d57d03e9eefd5f2903f6c1d6daf84a9a79 languageName: node linkType: hard @@ -5004,6 +4451,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^24.10.1, @types/node@npm:^24.9.1": + version: 24.10.4 + resolution: "@types/node@npm:24.10.4" + dependencies: + undici-types: ~7.16.0 + checksum: 27db63085116aec2b92a36405ab4e8838eafd361ab05ba043e16b70e58b41572145b8078244aa5fd51b1f80076b2e7422c848c31c5a0df0dc5e20053e24720d3 + languageName: node + linkType: hard + "@types/nodemailer@npm:^7.0.4": version: 7.0.4 resolution: "@types/nodemailer@npm:7.0.4" @@ -5095,11 +4551,11 @@ __metadata: linkType: hard "@types/readable-stream@npm:^4.0.0": - version: 4.0.22 - resolution: "@types/readable-stream@npm:4.0.22" + version: 4.0.23 + resolution: "@types/readable-stream@npm:4.0.23" dependencies: "@types/node": "*" - checksum: 9fed1e1a4926e74bdc057d530c99906c2dc88eef215d0b9b1058d2beb7e5b6edf5d11eca8d69d9029d780524a4c80024c21e671fc113994af4eaf156e9e3f8ec + checksum: 4c93ec36c5bcc705de35aff8dd527e6fe4e92f616b4ecea48bfe2de803834f769b972b852360cd60841a4cf60c33b485839c3c98868820538d33d57103959bbe languageName: node linkType: hard @@ -5423,12 +4879,12 @@ __metadata: linkType: hard "@zapier/secret-scrubber@npm:^1.1.2": - version: 1.1.2 - resolution: "@zapier/secret-scrubber@npm:1.1.2" + version: 1.1.6 + resolution: "@zapier/secret-scrubber@npm:1.1.6" dependencies: - create-hash: ^1.2.0 - lodash.isplainobject: ^4.0.6 - checksum: 18aae74cb2756cb1046b93aa8ecd93155644b31d742471f535e95e12a7722f405d243fce13bf991c83aee9d3e6a3ff7c9bb260a8c97b86fbcfd92b2d45005060 + create-hash: 1.2.0 + lodash.isplainobject: 4.0.6 + checksum: 2b6c175e560cecdb6488996dbc3fc597f31ca7052fea31e31b54b52b4522dc08ef2534840cee1134f866874084932f6325bb6fac34e4aa12c246e286fa0bac04 languageName: node linkType: hard @@ -5453,6 +4909,13 @@ __metadata: languageName: node linkType: hard +"abbrev@npm:^4.0.0": + version: 4.0.0 + resolution: "abbrev@npm:4.0.0" + checksum: d0344b63d28e763f259b4898c41bdc92c08e9d06d0da5617d0bbe4d78244e46daea88c510a2f9472af59b031d9060ec1a999653144e793fd029a59dae2f56dc8 + languageName: node + linkType: hard + "abort-controller@npm:^3.0.0": version: 3.0.0 resolution: "abort-controller@npm:3.0.0" @@ -5611,6 +5074,15 @@ __metadata: languageName: node linkType: hard +"ansi-escapes@npm:^7.0.0": + version: 7.2.0 + resolution: "ansi-escapes@npm:7.2.0" + dependencies: + environment: ^1.0.0 + checksum: d490871d4107dc6d4b0f2d0eaddbe3e4681d584c58495f06fe2908f2707bbaaf54825f485c5a6ce14c2d2a731fa382b18d7235a102db69aeff5dd9461397cb44 + languageName: node + linkType: hard + "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" @@ -5817,7 +5289,9 @@ __metadata: "@amplitude/node": 1.10.2 "@ava/typescript": 6.0.0 "@aws-sdk/client-bedrock-runtime": ^3.954.0 + "@aws-sdk/client-s3": ^3.958.0 "@aws-sdk/lib-dynamodb": ^3.953.0 + "@aws-sdk/s3-request-presigner": ^3.958.0 "@electric-sql/pglite": ^0.3.14 "@faker-js/faker": ^10.1.0 "@nestjs/cli": ^11.0.14 @@ -6014,11 +5488,11 @@ __metadata: linkType: hard "baseline-browser-mapping@npm:^2.9.0": - version: 2.9.8 - resolution: "baseline-browser-mapping@npm:2.9.8" + version: 2.9.11 + resolution: "baseline-browser-mapping@npm:2.9.11" bin: baseline-browser-mapping: dist/cli.js - checksum: 2550b4921372743ee152b5b2d0310c9bd151e93bb04c273fcb8aa3e0af7d4743674a5d46592641d3ba25baaf986e4c2639289001cf2ff364f8b2610dcce03286 + checksum: 2c4687cdcb9f74cdc9f584248fda4e3435ec31de192316dfd75ce4cae70cc64e5cc763b8e632ee6a452aa71bd1b9519e478bc190653fd0c30482ab24e49f4eea languageName: node linkType: hard @@ -6125,9 +5599,9 @@ __metadata: linkType: hard "bowser@npm:^2.11.0": - version: 2.12.1 - resolution: "bowser@npm:2.12.1" - checksum: 994a3da9e9b628892e0fbc4fd5afeec672003a9a72300ec8ac832f6707ba6ce68d137d50316f08e6197f9e0cca5c486aa4b9ce9db50013061225cab4e432f8a0 + version: 2.13.1 + resolution: "bowser@npm:2.13.1" + checksum: 83ba90bebe4b73ce761b35e13f846e90094919a351fbfe5ddb0b6be869d166648a70b9c97a8bfe1e0c21eee220ff9832ecef5302487efe53b2027d79189926c1 languageName: node linkType: hard @@ -6240,9 +5714,9 @@ __metadata: linkType: hard "buildcheck@npm:~0.0.6": - version: 0.0.6 - resolution: "buildcheck@npm:0.0.6" - checksum: ad61759dc98d62e931df2c9f54ccac7b522e600c6e13bdcfdc2c9a872a818648c87765ee209c850f022174da4dd7c6a450c00357c5391705d26b9c5807c2a076 + version: 0.0.7 + resolution: "buildcheck@npm:0.0.7" + checksum: 18bc4581525776dc7486906241723a0b2bc6d9d55bdbf8aa3ac225ed02c9dfc01be06020a5cce58b1630edd8a1ba1ce3fc51959bbbafaabcef05f9e7707210de languageName: node linkType: hard @@ -6291,23 +5765,22 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^19.0.1": - version: 19.0.1 - resolution: "cacache@npm:19.0.1" +"cacache@npm:^20.0.1": + version: 20.0.3 + resolution: "cacache@npm:20.0.3" dependencies: - "@npmcli/fs": ^4.0.0 + "@npmcli/fs": ^5.0.0 fs-minipass: ^3.0.0 - glob: ^10.2.2 - lru-cache: ^10.0.1 + glob: ^13.0.0 + lru-cache: ^11.1.0 minipass: ^7.0.3 minipass-collect: ^2.0.1 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 p-map: ^7.0.2 - ssri: ^12.0.0 - tar: ^7.4.3 - unique-filename: ^4.0.0 - checksum: e95684717de6881b4cdaa949fa7574e3171946421cd8291769dd3d2417dbf7abf4aa557d1f968cca83dcbc95bed2a281072b09abfc977c942413146ef7ed4525 + ssri: ^13.0.0 + unique-filename: ^5.0.0 + checksum: 595e6b91d72972d596e1e9ccab8ddbf08b773f27240220b1b5b1b7b3f52173cfbcf095212e5d7acd86c3bd453c28e69b116469889c511615ef3589523d542639 languageName: node linkType: hard @@ -6365,9 +5838,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001759": - version: 1.0.30001760 - resolution: "caniuse-lite@npm:1.0.30001760" - checksum: 67f04822ab411541f04bcb81257c17b29414c6ba0755f3d4f74f54a79a1aaca844c2bac42b5b863855df8e1df73c5ac8fb133553a951863127a73d40727f7ae4 + version: 1.0.30001761 + resolution: "caniuse-lite@npm:1.0.30001761" + checksum: e1b6ed282fef24cbfccb944a4f1154804148ba59aa83bae2b5b652f375f4c6205579fadf530a23e93c2c901a736bbff6d8eebeabdf14c09c28125cda31d9a548 languageName: node linkType: hard @@ -6580,6 +6053,16 @@ __metadata: languageName: node linkType: hard +"cli-truncate@npm:^5.0.0": + version: 5.1.1 + resolution: "cli-truncate@npm:5.1.1" + dependencies: + slice-ansi: ^7.1.0 + string-width: ^8.0.0 + checksum: 994262b5fc8691657a06aeb352d4669354252989e5333b5fc74beb5cec75ceaad9de779864e68e6a1fe83b7cca04fa35eb505de67b20668896880728876631ba + languageName: node + linkType: hard + "cli-width@npm:^4.1.0": version: 4.1.0 resolution: "cli-width@npm:4.1.0" @@ -6641,19 +6124,19 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^3.0.1": - version: 3.1.2 - resolution: "color-convert@npm:3.1.2" +"color-convert@npm:^3.1.3": + version: 3.1.3 + resolution: "color-convert@npm:3.1.3" dependencies: color-name: ^2.0.0 - checksum: 6817f4de27dd847129d84aa3695978c93a8eac8b67c496b9be1de78b33e1c96318edb4b814da25d7fe15fcedc62ede48a940ce24e258cde71e56eb3bb6e077de + checksum: 5133952b53c76dfb0f1d9d19b21efa1394cc9a9e0ae8556c6ac366bfe8dd806ddd88448eb23a2dc6f671c85b29290ab547052c6e1c9cb165e14c38a933d327f3 languageName: node linkType: hard "color-name@npm:^2.0.0": - version: 2.0.2 - resolution: "color-name@npm:2.0.2" - checksum: 58e5fa3853a0dac813179e75a1fe07ff362abacb9fd456fcaae702b74d4ed5f6de2cbaee07ff2660f3495c7a6ceabc4ef0420165db0018e7150a6d4045f6539e + version: 2.1.0 + resolution: "color-name@npm:2.1.0" + checksum: eb014f71d87408e318e95d3f554f188370d354ba8e0ffa4341d0fd19de391bfe2bc96e563d4f6614644d676bc24f475560dffee3fe310c2d6865d007410a9a2b languageName: node linkType: hard @@ -6664,22 +6147,22 @@ __metadata: languageName: node linkType: hard -"color-string@npm:^2.0.0": - version: 2.1.2 - resolution: "color-string@npm:2.1.2" +"color-string@npm:^2.1.3": + version: 2.1.4 + resolution: "color-string@npm:2.1.4" dependencies: color-name: ^2.0.0 - checksum: 8468bf79a56da7b4d75628d7fd36b6c214f2013bcafd618c1d92194960f202e656add3395eb82e208ac6038707b882c01dea9bbe182e325ca090f5ea1695d48e + checksum: f9caa29d529c549febeec813fcc0ecb184ff3dee92cec78f1fd3dfe2c4168fc1b74442efc40e34d2d677470967f570234d11086c3b137d6f9958a8fe12587fde languageName: node linkType: hard "color@npm:^5.0.2": - version: 5.0.2 - resolution: "color@npm:5.0.2" + version: 5.0.3 + resolution: "color@npm:5.0.3" dependencies: - color-convert: ^3.0.1 - color-string: ^2.0.0 - checksum: 59f343e54652c4589e3f6517cda56fb53637cbb2e468d85024ea2634ce530f6b9cf772e069beae680d716bbbee4c980bfd013a47baa2a75d75552176fc5a3529 + color-convert: ^3.1.3 + color-string: ^2.1.3 + checksum: 2ad337a520f8d702febc45912d7a27417268ea4c56bdbf8121cdb8dad7309e418a7c78f164d7cb59b68bd9e703b5a3bc046cff80051c30e7561f7e726ca207ac languageName: node linkType: hard @@ -6690,6 +6173,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:^2.0.20": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d + languageName: node + linkType: hard + "combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -6833,11 +6323,9 @@ __metadata: linkType: hard "content-disposition@npm:^1.0.0": - version: 1.0.0 - resolution: "content-disposition@npm:1.0.0" - dependencies: - safe-buffer: 5.2.1 - checksum: b27e2579fefe0ecf78238bb652fbc750671efce8344f0c6f05235b12433e6a965adb40906df1ac1fdde23e8f9f0e58385e44640e633165420f3f47d830ae0398 + version: 1.0.1 + resolution: "content-disposition@npm:1.0.1" + checksum: f1ee5363968e7e4c491fcd9796d3c489ab29c4ea0bfa5dcc3379a9833d6044838367cf8a11c90b179cb2a8d471279ab259119c52e0d3e4ed30934ccd56b6d694 languageName: node linkType: hard @@ -6950,7 +6438,7 @@ __metadata: languageName: node linkType: hard -"create-hash@npm:^1.2.0": +"create-hash@npm:1.2.0": version: 1.2.0 resolution: "create-hash@npm:1.2.0" dependencies: @@ -6970,7 +6458,17 @@ __metadata: languageName: node linkType: hard -"cron@npm:*, cron@npm:4.3.5": +"cron@npm:*": + version: 4.4.0 + resolution: "cron@npm:4.4.0" + dependencies: + "@types/luxon": ~3.7.0 + luxon: ~3.7.0 + checksum: b49f93029b8de922ab6b0c316ab8831171d368d4ffaf44892fd2d1e9a47945a36288897b48ae7a4b7c2fee40a8180ae0e9581609c75ad23e89f63af679f7dea6 + languageName: node + linkType: hard + +"cron@npm:4.3.5": version: 4.3.5 resolution: "cron@npm:4.3.5" dependencies: @@ -7134,19 +6632,19 @@ __metadata: linkType: hard "default-browser-id@npm:^5.0.0": - version: 5.0.0 - resolution: "default-browser-id@npm:5.0.0" - checksum: 185bfaecec2c75fa423544af722a3469b20704c8d1942794a86e4364fe7d9e8e9f63241a5b769d61c8151993bc65833a5b959026fa1ccea343b3db0a33aa6deb + version: 5.0.1 + resolution: "default-browser-id@npm:5.0.1" + checksum: 52c637637bcd76bfe974462a2f1dd75cb04784c2852935575760f82e1fd338e5e80d3c45a9b01fdbb1e450553a830bb163b004d2eca223c5573989f82232a072 languageName: node linkType: hard "default-browser@npm:^5.2.1": - version: 5.2.1 - resolution: "default-browser@npm:5.2.1" + version: 5.4.0 + resolution: "default-browser@npm:5.4.0" dependencies: bundle-name: ^4.1.0 default-browser-id: ^5.0.0 - checksum: afab7eff7b7f5f7a94d9114d1ec67273d3fbc539edf8c0f80019879d53aa71e867303c6f6d7cffeb10a6f3cfb59d4f963dba3f9c96830b4540cc7339a1bf9840 + checksum: cac0222ca5c9a3387d25337228689652ab33679a6566995c7194a75af7e554e91ec9ac92a70bfaa8e8089eae9f466ae99267bb38601282aade89b200f50a765c languageName: node linkType: hard @@ -7384,6 +6882,13 @@ __metadata: languageName: node linkType: hard +"environment@npm:^1.0.0": + version: 1.1.0 + resolution: "environment@npm:1.1.0" + checksum: dd3c1b9825e7f71f1e72b03c2344799ac73f2e9ef81b78ea8b373e55db021786c6b9f3858ea43a436a2c4611052670ec0afe85bc029c384cc71165feee2f4ba6 + languageName: node + linkType: hard + "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -7563,8 +7068,8 @@ __metadata: linkType: hard "execa@npm:^9.6.0": - version: 9.6.0 - resolution: "execa@npm:9.6.0" + version: 9.6.1 + resolution: "execa@npm:9.6.1" dependencies: "@sindresorhus/merge-streams": ^4.0.0 cross-spawn: ^7.0.6 @@ -7578,7 +7083,7 @@ __metadata: signal-exit: ^4.1.0 strip-final-newline: ^4.0.0 yoctocolors: ^2.1.1 - checksum: 4b63d7c4317a41ad16201f7c74d963c4060b2affaac32ea69498e26c758df0d8447891a2bc4a185e9ee7aad82cff8684a8b0420ed3addaa25a1c65663a97335d + checksum: 22beaa34ffed9176e8b206f0fac69c87d69505ef40eee6dbfaca83bf29d773a5dfeebfc72bb7b2717bd75b85bb29266f24d718afca1dc5ac90167242e9802707 languageName: node linkType: hard @@ -7720,11 +7225,11 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.19.1 - resolution: "fastq@npm:1.19.1" + version: 1.20.1 + resolution: "fastq@npm:1.20.1" dependencies: reusify: ^1.0.4 - checksum: 7691d1794fb84ad0ec2a185f10e00f0e1713b894e2c9c4d42f0bc0ba5f8c00e6e655a202074ca0b91b9c3d977aab7c30c41a8dc069fb5368576ac0054870a0e6 + checksum: 49128edbf05e682bee3c1db3d2dfc7da195469065ef014d8368c555d829932313ae2ddf584bb03146409b0d5d9fdb387c471075483a7319b52f777ad91128ed8 languageName: node linkType: hard @@ -7817,8 +7322,8 @@ __metadata: linkType: hard "finalhandler@npm:^2.1.0": - version: 2.1.0 - resolution: "finalhandler@npm:2.1.0" + version: 2.1.1 + resolution: "finalhandler@npm:2.1.1" dependencies: debug: ^4.4.0 encodeurl: ^2.0.0 @@ -7826,7 +7331,7 @@ __metadata: on-finished: ^2.4.1 parseurl: ^1.3.3 statuses: ^2.0.1 - checksum: 27ca9cc83b1384ba37959eb95bc7e62bc0bf4d6f6af63f6d38821cf7499b113e34b23f96a2a031616817f73986f94deea67c2f558de9daf406790c181a2501df + checksum: e5303c4cccce46019cf0f59b07a36cc6d37549f1efe2111c16cd78e6e500d3bfd68d3b45044c9a67a0c75ad3128ee1106fae9a0152ca3c0a8ee3bf3a4a1464bb languageName: node linkType: hard @@ -7923,15 +7428,15 @@ __metadata: linkType: hard "form-data@npm:^4.0.0, form-data@npm:^4.0.4": - version: 4.0.4 - resolution: "form-data@npm:4.0.4" + version: 4.0.5 + resolution: "form-data@npm:4.0.5" dependencies: asynckit: ^0.4.0 combined-stream: ^1.0.8 es-set-tostringtag: ^2.1.0 hasown: ^2.0.2 mime-types: ^2.1.12 - checksum: 9b7788836df9fa5a6999e0c02515b001946b2a868cfe53f026c69e2c537a2ff9fbfb8e9d2b678744628f3dc7a2d6e14e4e45dfaf68aa6239727f0bdb8ce0abf2 + checksum: af8328413c16d0cded5fccc975a44d227c5120fd46a9e81de8acf619d43ed838414cc6d7792195b30b248f76a65246949a129a4dadd148721948f90cd6d4fb69 languageName: node linkType: hard @@ -7997,13 +7502,13 @@ __metadata: linkType: hard "fs-extra@npm:^11.1.1": - version: 11.3.2 - resolution: "fs-extra@npm:11.3.2" + version: 11.3.3 + resolution: "fs-extra@npm:11.3.3" dependencies: graceful-fs: ^4.2.0 jsonfile: ^6.0.1 universalify: ^2.0.0 - checksum: 24a7a6e09668add7f74bf6884086b860ce39c7883d94f564623d4ca5c904ff9e5e33fa6333bd3efbf3528333cdedf974e49fa0723e9debf952f0882e6553d81e + checksum: fb2acabbd1e04bcaca90eadfe98e6ffba1523b8009afbb9f4c0aae5efbca0bd0bf6c9a6831df5af5aaacb98d3e499898be848fb0c03d31ae7b9d1b053e81c151 languageName: node linkType: hard @@ -8062,7 +7567,7 @@ __metadata: languageName: node linkType: hard -"get-east-asian-width@npm:^1.0.0, get-east-asian-width@npm:^1.3.0": +"get-east-asian-width@npm:^1.0.0, get-east-asian-width@npm:^1.3.0, get-east-asian-width@npm:^1.3.1": version: 1.4.0 resolution: "get-east-asian-width@npm:1.4.0" checksum: 1d9a81a8004f4217ebef5d461875047d269e4b57e039558fd65130877cd4da8e3f61e1c4eada0c8b10e2816c7baf7d5fddb7006f561da13bc6f6dd19c1e964a4 @@ -8276,7 +7781,7 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:^2.0.0, http-errors@npm:~2.0.1": +"http-errors@npm:^2.0.0, http-errors@npm:^2.0.1, http-errors@npm:~2.0.1": version: 2.0.1 resolution: "http-errors@npm:2.0.1" dependencies: @@ -8316,6 +7821,15 @@ __metadata: languageName: node linkType: hard +"husky@npm:^9.1.7": + version: 9.1.7 + resolution: "husky@npm:9.1.7" + bin: + husky: bin.js + checksum: c2412753f15695db369634ba70f50f5c0b7e5cb13b673d0826c411ec1bd9ddef08c1dad89ea154f57da2521d2605bd64308af748749b27d08c5f563bcd89975f + languageName: node + linkType: hard + "i18n-iso-countries@npm:^7.14.0": version: 7.14.0 resolution: "i18n-iso-countries@npm:7.14.0" @@ -8392,14 +7906,14 @@ __metadata: linkType: hard "import-in-the-middle@npm:^2, import-in-the-middle@npm:^2.0.0": - version: 2.0.0 - resolution: "import-in-the-middle@npm:2.0.0" + version: 2.0.1 + resolution: "import-in-the-middle@npm:2.0.1" dependencies: acorn: ^8.14.0 acorn-import-attributes: ^1.9.5 cjs-module-lexer: ^1.2.2 module-details-from-path: ^1.0.3 - checksum: 4886b0a58692e03c3a187e1f15cb811025f8637c6eed51b26afa43eb90027f972c018f88ae175f76c45387db9fe2a131410898524d8359831e69670737bfb960 + checksum: 2c67b83b64b9710bbda00f153cfe768fdae8a5de6972c931f19337f7f11b0b18e65c580c0f83262204c6e94e25e3ed33402bf1cc4a5381fe5e3ba997e9cb519b languageName: node linkType: hard @@ -8459,9 +7973,9 @@ __metadata: linkType: hard "ip-address@npm:^10.0.1": - version: 10.0.1 - resolution: "ip-address@npm:10.0.1" - checksum: 525d5391cfd31a91f80f5857e98487aeaa8474e860a6725a0b6461ac8e436c7f8c869774dece391c8f8e7486306a34a4d1c094778c4c583a3f1f2cd905e5ed50 + version: 10.1.0 + resolution: "ip-address@npm:10.1.0" + checksum: 76b1abcdf52a32e2e05ca1f202f3a8ab8547e5651a9233781b330271bd7f1a741067748d71c4cbb9d9906d9f1fa69e7ddc8b4a11130db4534fdab0e908c84e0d languageName: node linkType: hard @@ -8541,6 +8055,15 @@ __metadata: languageName: node linkType: hard +"is-fullwidth-code-point@npm:^5.0.0": + version: 5.1.0 + resolution: "is-fullwidth-code-point@npm:5.1.0" + dependencies: + get-east-asian-width: ^1.3.1 + checksum: 4700d8a82cb71bd2a2955587b2823c36dc4660eadd4047bfbd070821ddbce8504fc5f9b28725567ecddf405b1e06c6692c9b719f65df6af9ec5262bc11393a6a + languageName: node + linkType: hard + "is-glob@npm:^4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" @@ -8739,8 +8262,8 @@ __metadata: linkType: hard "joi@npm:^18.0.1": - version: 18.0.1 - resolution: "joi@npm:18.0.1" + version: 18.0.2 + resolution: "joi@npm:18.0.2" dependencies: "@hapi/address": ^5.1.1 "@hapi/formula": ^3.0.2 @@ -8749,7 +8272,7 @@ __metadata: "@hapi/tlds": ^1.1.1 "@hapi/topo": ^6.0.2 "@standard-schema/spec": ^1.0.0 - checksum: dbf511036b4ad89e962e51e2fb393ec20a863b023b5a4fe32d0c7a8c28456f4ad05ea4a3b30f8ea37560cb4444a0d3e20ede8ee170e2edf7841ac247d3faf91e + checksum: 39d9e3584505817d7c80ab11c0b6eccf353715d0e83c33f039caa5d917fa9ef700966b0b87dfebaaec8693f9850cb0745812afb620ba9633ba9e895ada3210f7 languageName: node linkType: hard @@ -8786,14 +8309,14 @@ __metadata: linkType: hard "js-yaml@npm:^3.14.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" + version: 3.14.2 + resolution: "js-yaml@npm:3.14.2" dependencies: argparse: ^1.0.7 esprima: ^4.0.0 bin: js-yaml: bin/js-yaml.js - checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + checksum: 626fc207734a3452d6ba84e1c8c226240e6d431426ed94d0ab043c50926d97c509629c08b1d636f5d27815833b7cfd225865631da9fb33cb957374490bf3e90b languageName: node linkType: hard @@ -8960,8 +8483,8 @@ __metadata: linkType: hard "knip@npm:^5.75.0": - version: 5.75.0 - resolution: "knip@npm:5.75.0" + version: 5.77.1 + resolution: "knip@npm:5.77.1" dependencies: "@nodelib/fs.walk": ^1.2.3 fast-glob: ^3.3.3 @@ -8981,7 +8504,7 @@ __metadata: bin: knip: bin/knip.js knip-bun: bin/knip-bun.js - checksum: f6c43f4cafffe58574125ed97486e6afaf3105af7fa22f1027626f5b436941fc8792b1d0470c27741d6a87b2fb1ed80546dd380f4cef1e6731a75bc766c8341b + checksum: 1e3e6cbce8cb905b2e4a5bb1842c75ef2fd3ae0ee0b28e45717da42235baac024a81a53bb2b0ce9eb9892f9a71af054bda2e5450906757b12b3acd4db0ec31c8 languageName: node linkType: hard @@ -8993,9 +8516,9 @@ __metadata: linkType: hard "libphonenumber-js@npm:^1.11.1": - version: 1.12.26 - resolution: "libphonenumber-js@npm:1.12.26" - checksum: 6d6450a32334bf204c7e6b4477a19dbc8b93433814d5dd152364bf19b3a27870a4884db0c6b7d5299a6e879bdda20e01d6acdb6fbecd722e12ef3885252a078a + version: 1.12.33 + resolution: "libphonenumber-js@npm:1.12.33" + checksum: b06c1899362ce5f3810aa16e7145e8d75287a0942a8c5c39a59d99721666ffb283a0bff63e967c5aa0f0934d47eff98166602dc360e35c063e1e35950abb0858 languageName: node linkType: hard @@ -9006,6 +8529,37 @@ __metadata: languageName: node linkType: hard +"lint-staged@npm:^16.2.7": + version: 16.2.7 + resolution: "lint-staged@npm:16.2.7" + dependencies: + commander: ^14.0.2 + listr2: ^9.0.5 + micromatch: ^4.0.8 + nano-spawn: ^2.0.0 + pidtree: ^0.6.0 + string-argv: ^0.3.2 + yaml: ^2.8.1 + bin: + lint-staged: bin/lint-staged.js + checksum: fbf234787ed1f6fe9e754c03ef64571ef09d68e4ebce21141a85972e5b7c00fee9d00a4c892db3c00ddc22e8b0c337d757734a4df4848661469b7591f14cbc24 + languageName: node + linkType: hard + +"listr2@npm:^9.0.5": + version: 9.0.5 + resolution: "listr2@npm:9.0.5" + dependencies: + cli-truncate: ^5.0.0 + colorette: ^2.0.20 + eventemitter3: ^5.0.1 + log-update: ^6.1.0 + rfdc: ^1.4.1 + wrap-ansi: ^9.0.0 + checksum: 64ef0dcd6f69e131f5699f584c13096d828a747472d4a18e68a9418848a54aef86bf953bf4a8a03a3dff24dacf771fab919dad59dce115244308a06d147acbfa + languageName: node + linkType: hard + "load-esm@npm:1.0.3": version: 1.0.3 resolution: "load-esm@npm:1.0.3" @@ -9078,7 +8632,7 @@ __metadata: languageName: node linkType: hard -"lodash.isplainobject@npm:^4.0.6": +"lodash.isplainobject@npm:4.0.6, lodash.isplainobject@npm:^4.0.6": version: 4.0.6 resolution: "lodash.isplainobject@npm:4.0.6" checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 @@ -9126,6 +8680,19 @@ __metadata: languageName: node linkType: hard +"log-update@npm:^6.1.0": + version: 6.1.0 + resolution: "log-update@npm:6.1.0" + dependencies: + ansi-escapes: ^7.0.0 + cli-cursor: ^5.0.0 + slice-ansi: ^7.1.0 + strip-ansi: ^7.1.0 + wrap-ansi: ^9.0.0 + checksum: 817a9ba6c5cbc19e94d6359418df8cfe8b3244a2903f6d53354e175e243a85b782dc6a98db8b5e457ee2f09542ca8916c39641b9cd3b0e6ef45e9481d50c918a + languageName: node + linkType: hard + "logform@npm:^2.7.0": version: 2.7.0 resolution: "logform@npm:2.7.0" @@ -9161,24 +8728,17 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^11.0.0, lru-cache@npm:^11.2.4": +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1, lru-cache@npm:^11.2.4": version: 11.2.4 resolution: "lru-cache@npm:11.2.4" checksum: cb8cf72b80a506593f51880bd5a765380d6d8eb82e99b2fbb2f22fe39e5f2f641d47a2509e74cc294617f32a4e90ae8f6214740fe00bc79a6178854f00419b24 languageName: node linkType: hard -"lru-cache@npm:^7.14.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - -"lru.min@npm:^1.0.0": - version: 1.1.2 - resolution: "lru.min@npm:1.1.2" - checksum: d7b0c2309072b066e13e1178130f48cfef317149389e556255844ba79ee8c0fe79e0b2f2ada78cfd975803afc30a443ac3e2f87f4ce1488d8a1782ff42a16f30 +"lru.min@npm:^1.0.0, lru.min@npm:^1.1.0": + version: 1.1.3 + resolution: "lru.min@npm:1.1.3" + checksum: 11451baf8606d29f77cc1e22fc917a4287dcf8d8c188f098c56c0b52489c4c6299ee8f910af53065d7bdd0073d3c5263c6003c5958877d7a03d305b977150e13 languageName: node linkType: hard @@ -9225,22 +8785,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^14.0.3": - version: 14.0.3 - resolution: "make-fetch-happen@npm:14.0.3" +"make-fetch-happen@npm:^15.0.0": + version: 15.0.3 + resolution: "make-fetch-happen@npm:15.0.3" dependencies: - "@npmcli/agent": ^3.0.0 - cacache: ^19.0.1 + "@npmcli/agent": ^4.0.0 + cacache: ^20.0.1 http-cache-semantics: ^4.1.1 minipass: ^7.0.2 - minipass-fetch: ^4.0.0 + minipass-fetch: ^5.0.0 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 negotiator: ^1.0.0 - proc-log: ^5.0.0 + proc-log: ^6.0.0 promise-retry: ^2.0.1 - ssri: ^12.0.0 - checksum: 6fb2fee6da3d98f1953b03d315826b5c5a4ea1f908481afc113782d8027e19f080c85ae998454de4e5f27a681d3ec58d57278f0868d4e0b736f51d396b661691 + ssri: ^13.0.0 + checksum: 4fb9dbb739b33565c85dacdcff7eb9388d8f36f326a59dc13375f01af809c42c48aa5d1f4840ee36623b2461a15476e1e79e4548ca1af30b42e1e324705ac8b3 languageName: node linkType: hard @@ -9380,12 +8940,12 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1": - version: 3.0.1 - resolution: "mime-types@npm:3.0.1" +"mime-types@npm:^3.0.0, mime-types@npm:^3.0.2": + version: 3.0.2 + resolution: "mime-types@npm:3.0.2" dependencies: mime-db: ^1.54.0 - checksum: 8d497ad5cb2dd1210ac7d049b5de94af0b24b45a314961e145b44389344604d54752f03bc00bf880c0da60a214be6fb6d423d318104f02c28d95dd8ebeea4fb4 + checksum: 70b74794f408419e4b6a8e3c93ccbed79b6a6053973a3957c5cc04ff4ad8d259f0267da179e3ecae34c3edfb4bfd7528db23a101e32d21ad8e196178c8b7b75a languageName: node linkType: hard @@ -9470,9 +9030,9 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^4.0.0": - version: 4.0.1 - resolution: "minipass-fetch@npm:4.0.1" +"minipass-fetch@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass-fetch@npm:5.0.0" dependencies: encoding: ^0.1.13 minipass: ^7.0.3 @@ -9481,7 +9041,7 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: 3dfca705ce887ca9ff14d73e8d8593996dea1a1ecd8101fdbb9c10549d1f9670bc8fb66ad0192769ead4c2dc01b4f9ca1cf567ded365adff17827a303b948140 + checksum: 416645d1e54c09fdfe64ec1676541ac2f6f2af3abc7ad25f2f22c4518535997c1ecd2c0c586ea8a5c6499ad7d8f97671f50ff38488ada54bf61fde309f731379 languageName: node linkType: hard @@ -9704,20 +9264,27 @@ __metadata: linkType: hard "named-placeholders@npm:^1.1.3": - version: 1.1.3 - resolution: "named-placeholders@npm:1.1.3" + version: 1.1.6 + resolution: "named-placeholders@npm:1.1.6" dependencies: - lru-cache: ^7.14.1 - checksum: 7834adc91e92ae1b9c4413384e3ccd297de5168bb44017ff0536705ddc4db421723bd964607849265feb3f6ded390f84cf138e5925f22f7c13324f87a803dc73 + lru.min: ^1.1.0 + checksum: 959d44f2a00e87baa2c2b2d43c2be76c6e841a0ed67af4bf4a8d91c54082e2b2db9ac8461b16db413dcb133c6f34669516d755f9a1a7956851ce81196a717f65 languageName: node linkType: hard "nan@npm:^2.19.0, nan@npm:^2.22.0, nan@npm:^2.23.0": - version: 2.23.1 - resolution: "nan@npm:2.23.1" + version: 2.24.0 + resolution: "nan@npm:2.24.0" dependencies: node-gyp: latest - checksum: 93b39c8ef832bd4794c8ee4ae06c1017f9e0d313025f075922d549d31326e6b3e53eeea1edccae7a307eb61107aa7cd4238f7612f3ffc1d043c2da9724bb3a67 + checksum: ab4080188a2fe2bef0a1f3ce5c65a6c3d71fa23be08f4e0696dc256c5030c809d11569d5bcf28810148a7b0029c195c592b98b7b22c5e9e7e9aa0e71905a63b8 + languageName: node + linkType: hard + +"nano-spawn@npm:^2.0.0": + version: 2.0.0 + resolution: "nano-spawn@npm:2.0.0" + checksum: 48223f6f5b2ab3f7562d0e6e85abb9b9c4ee52f5c096bd50012c0776664ddc63cd2602c9e4dc3d6cd47ae5189e9c71b51afb2d44b2746d8ca80cb52fc8013904 languageName: node linkType: hard @@ -9847,22 +9414,22 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 11.5.0 - resolution: "node-gyp@npm:11.5.0" + version: 12.1.0 + resolution: "node-gyp@npm:12.1.0" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 graceful-fs: ^4.2.6 - make-fetch-happen: ^14.0.3 - nopt: ^8.0.0 - proc-log: ^5.0.0 + make-fetch-happen: ^15.0.0 + nopt: ^9.0.0 + proc-log: ^6.0.0 semver: ^7.3.5 - tar: ^7.4.3 + tar: ^7.5.2 tinyglobby: ^0.2.12 - which: ^5.0.0 + which: ^6.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 6cc29b9d454d9a684c8fe299668db618875bb4282e37717ca5b79689cc5ce99cd553c70944bb367979f2eba40ad6a50afaf7b12a6b214172edc7377384efa051 + checksum: 198d91c535fe9940bcdc0db4e578f94cf9872e0d068e88ef2f4656924248bb67245b270b48eded6634c7513841c0cd42f3da3ac9d77c8e16437fcd90703b9ef3 languageName: node linkType: hard @@ -9874,9 +9441,9 @@ __metadata: linkType: hard "nodemailer@npm:^7.0.11": - version: 7.0.11 - resolution: "nodemailer@npm:7.0.11" - checksum: 02940a5a620e219522c049f54f69af7abdc99c2ec168f592d3c67e26980a9857d7c45c65989cbd835af2c0ffabc66c20198aff484197566385594b2653069cb8 + version: 7.0.12 + resolution: "nodemailer@npm:7.0.12" + checksum: 8e4f6d67c334c31c644ef9557a7f65cd1397340b84bc5cb2d3373032772a68577c5a11dbd4f227d42f7b4df40daad06a1b1c32e76c57c15b880b0ca468cc9713 languageName: node linkType: hard @@ -9909,6 +9476,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^9.0.0": + version: 9.0.0 + resolution: "nopt@npm:9.0.0" + dependencies: + abbrev: ^4.0.0 + bin: + nopt: bin/nopt.js + checksum: 7a5d9ab0629eaec1944a95438cc4efa6418ed2834aa8eb21a1bea579a7d8ac3e30120131855376a96ef59ab0e23ad8e0bc94d3349770a95e5cb7119339f7c7fb + languageName: node + linkType: hard + "npm-run-path@npm:^6.0.0": version: 6.0.0 resolution: "npm-run-path@npm:6.0.0" @@ -10016,8 +9594,8 @@ __metadata: linkType: hard "openai@npm:^6.14.0": - version: 6.14.0 - resolution: "openai@npm:6.14.0" + version: 6.15.0 + resolution: "openai@npm:6.15.0" peerDependencies: ws: ^8.18.0 zod: ^3.25 || ^4.0 @@ -10028,7 +9606,7 @@ __metadata: optional: true bin: openai: bin/cli - checksum: 10452593ebc077af3ac5b4d1da46a49062bb0fd92490d523ec56b3730bb7343a238e366ff787ade9400301b369852af2940057145b64bce3de955951fcfe0fd0 + checksum: bd7486028ddd775bc786c2f2c68c4617635192b66f2bcf33741b8371f2362fa561b175cffe7a039074a018909168ae4107d6dc49503f723fbc4c037753d1d4f6 languageName: node linkType: hard @@ -10092,29 +9670,29 @@ __metadata: linkType: hard "oxc-resolver@npm:^11.15.0": - version: 11.15.0 - resolution: "oxc-resolver@npm:11.15.0" - dependencies: - "@oxc-resolver/binding-android-arm-eabi": 11.15.0 - "@oxc-resolver/binding-android-arm64": 11.15.0 - "@oxc-resolver/binding-darwin-arm64": 11.15.0 - "@oxc-resolver/binding-darwin-x64": 11.15.0 - "@oxc-resolver/binding-freebsd-x64": 11.15.0 - "@oxc-resolver/binding-linux-arm-gnueabihf": 11.15.0 - "@oxc-resolver/binding-linux-arm-musleabihf": 11.15.0 - "@oxc-resolver/binding-linux-arm64-gnu": 11.15.0 - "@oxc-resolver/binding-linux-arm64-musl": 11.15.0 - "@oxc-resolver/binding-linux-ppc64-gnu": 11.15.0 - "@oxc-resolver/binding-linux-riscv64-gnu": 11.15.0 - "@oxc-resolver/binding-linux-riscv64-musl": 11.15.0 - "@oxc-resolver/binding-linux-s390x-gnu": 11.15.0 - "@oxc-resolver/binding-linux-x64-gnu": 11.15.0 - "@oxc-resolver/binding-linux-x64-musl": 11.15.0 - "@oxc-resolver/binding-openharmony-arm64": 11.15.0 - "@oxc-resolver/binding-wasm32-wasi": 11.15.0 - "@oxc-resolver/binding-win32-arm64-msvc": 11.15.0 - "@oxc-resolver/binding-win32-ia32-msvc": 11.15.0 - "@oxc-resolver/binding-win32-x64-msvc": 11.15.0 + version: 11.16.0 + resolution: "oxc-resolver@npm:11.16.0" + dependencies: + "@oxc-resolver/binding-android-arm-eabi": 11.16.0 + "@oxc-resolver/binding-android-arm64": 11.16.0 + "@oxc-resolver/binding-darwin-arm64": 11.16.0 + "@oxc-resolver/binding-darwin-x64": 11.16.0 + "@oxc-resolver/binding-freebsd-x64": 11.16.0 + "@oxc-resolver/binding-linux-arm-gnueabihf": 11.16.0 + "@oxc-resolver/binding-linux-arm-musleabihf": 11.16.0 + "@oxc-resolver/binding-linux-arm64-gnu": 11.16.0 + "@oxc-resolver/binding-linux-arm64-musl": 11.16.0 + "@oxc-resolver/binding-linux-ppc64-gnu": 11.16.0 + "@oxc-resolver/binding-linux-riscv64-gnu": 11.16.0 + "@oxc-resolver/binding-linux-riscv64-musl": 11.16.0 + "@oxc-resolver/binding-linux-s390x-gnu": 11.16.0 + "@oxc-resolver/binding-linux-x64-gnu": 11.16.0 + "@oxc-resolver/binding-linux-x64-musl": 11.16.0 + "@oxc-resolver/binding-openharmony-arm64": 11.16.0 + "@oxc-resolver/binding-wasm32-wasi": 11.16.0 + "@oxc-resolver/binding-win32-arm64-msvc": 11.16.0 + "@oxc-resolver/binding-win32-ia32-msvc": 11.16.0 + "@oxc-resolver/binding-win32-x64-msvc": 11.16.0 dependenciesMeta: "@oxc-resolver/binding-android-arm-eabi": optional: true @@ -10156,7 +9734,7 @@ __metadata: optional: true "@oxc-resolver/binding-win32-x64-msvc": optional: true - checksum: 726d6aa6703c57fa02ba382d5308f6a132b91fc96ad636d2aa7464d3d954b84f168373dd94a4cb75f886b9edef3c0341165c24b86be9d28b92a911a84adc582a + checksum: ec1962374a930cd072ead096b596a719e031eef87712502ce33578ff29661ad9dcc6c4a105eda2a5424c9bc530bfa7ff268e97acb720ab9647b2845911d974cf languageName: node linkType: hard @@ -10188,9 +9766,9 @@ __metadata: linkType: hard "p-map@npm:^7.0.2, p-map@npm:^7.0.3": - version: 7.0.3 - resolution: "p-map@npm:7.0.3" - checksum: 8c92d533acf82f0d12f7e196edccff773f384098bbb048acdd55a08778ce4fc8889d8f1bde72969487bd96f9c63212698d79744c20bedfce36c5b00b46d369f8 + version: 7.0.4 + resolution: "p-map@npm:7.0.4" + checksum: 4be2097e942f2fd3a4f4b0c6585c721f23851de8ad6484d20c472b3ea4937d5cd9a59914c832b1bceac7bf9d149001938036b82a52de0bc381f61ff2d35d26a5 languageName: node linkType: hard @@ -10309,12 +9887,12 @@ __metadata: linkType: hard "path-scurry@npm:^2.0.0": - version: 2.0.0 - resolution: "path-scurry@npm:2.0.0" + version: 2.0.1 + resolution: "path-scurry@npm:2.0.1" dependencies: lru-cache: ^11.0.0 minipass: ^7.1.2 - checksum: 9953ce3857f7e0796b187a7066eede63864b7e1dfc14bf0484249801a5ab9afb90d9a58fc533ebb1b552d23767df8aa6a2c6c62caf3f8a65f6ce336a97bbb484 + checksum: a022c6c38fed836079d03f96540eafd4cd989acf287b99613c82300107f366e889513ad8b671a2039a9d251122621f9c6fa649f0bd4d50acf95a6943a6692dbf languageName: node linkType: hard @@ -10482,6 +10060,15 @@ __metadata: languageName: node linkType: hard +"pidtree@npm:^0.6.0": + version: 0.6.0 + resolution: "pidtree@npm:0.6.0" + bin: + pidtree: bin/pidtree.js + checksum: 8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a + languageName: node + linkType: hard + "plur@npm:^5.1.0": version: 5.1.0 resolution: "plur@npm:5.1.0" @@ -10520,9 +10107,9 @@ __metadata: linkType: hard "postgres-bytea@npm:~1.0.0": - version: 1.0.0 - resolution: "postgres-bytea@npm:1.0.0" - checksum: d844ae4ca7a941b70e45cac1261a73ee8ed39d72d3d74ab1d645248185a1b7f0ac91a3c63d6159441020f4e1f7fe64689ac56536a307b31cef361e5187335090 + version: 1.0.1 + resolution: "postgres-bytea@npm:1.0.1" + checksum: fc5fa49f59ac1f0eba841db55bd6b6c2232d1575d1734311e2097a2d5fd8b58e1239cbd64eeaf0b6752268fe7d2819e002bf90b0afd333be9f2b9d157d2cd7e7 languageName: node linkType: hard @@ -10558,10 +10145,10 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^5.0.0": - version: 5.0.0 - resolution: "proc-log@npm:5.0.0" - checksum: c78b26ecef6d5cce4a7489a1e9923d7b4b1679028c8654aef0463b27f4a90b0946cd598f55799da602895c52feb085ec76381d007ab8dcceebd40b89c2f9dfe0 +"proc-log@npm:^6.0.0": + version: 6.1.0 + resolution: "proc-log@npm:6.1.0" + checksum: ac450ff8244e95b0c9935b52d629fef92ae69b7e39aea19972a8234259614d644402dd62ce9cb094f4a637d8a4514cba90c1456ad785a40ad5b64d502875a817 languageName: node linkType: hard @@ -10901,6 +10488,13 @@ __metadata: languageName: node linkType: hard +"rfdc@npm:^1.4.1": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 3b05bd55062c1d78aaabfcea43840cdf7e12099968f368e9a4c3936beb744adb41cbdb315eac6d4d8c6623005d6f87fdf16d8a10e1ff3722e84afea7281c8d13 + languageName: node + linkType: hard + "rimraf@npm:6.1.2, rimraf@npm:^6.1.2": version: 6.1.2 resolution: "rimraf@npm:6.1.2" @@ -10958,6 +10552,8 @@ __metadata: resolution: "root@workspace:." dependencies: "@biomejs/biome": 2.3.8 + husky: ^9.1.7 + lint-staged: ^16.2.7 monaco-editor: ^0.53.0 languageName: unknown linkType: soft @@ -11023,7 +10619,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 @@ -11100,21 +10696,21 @@ __metadata: linkType: hard "send@npm:^1.1.0, send@npm:^1.2.0": - version: 1.2.0 - resolution: "send@npm:1.2.0" + version: 1.2.1 + resolution: "send@npm:1.2.1" dependencies: - debug: ^4.3.5 + debug: ^4.4.3 encodeurl: ^2.0.0 escape-html: ^1.0.3 etag: ^1.8.1 fresh: ^2.0.0 - http-errors: ^2.0.0 - mime-types: ^3.0.1 + http-errors: ^2.0.1 + mime-types: ^3.0.2 ms: ^2.1.3 on-finished: ^2.4.1 range-parser: ^1.2.1 - statuses: ^2.0.1 - checksum: 7557ee6c1c257a1c53b402b4fba8ed88c95800b08abe085fc79e0824869274f213491be2efb2df3de228c70e4d40ce2019e5f77b58c42adb97149135420c3f34 + statuses: ^2.0.2 + checksum: 5361e3556fbc874c080a4cfbb4541e02c16221ca3c68c4f692320d38ef7e147381f805ce3ac50dfaa2129f07daa81098e2bc567e9a4d13993a92893d59a64d68 languageName: node linkType: hard @@ -11144,14 +10740,14 @@ __metadata: linkType: hard "serve-static@npm:^2.2.0": - version: 2.2.0 - resolution: "serve-static@npm:2.2.0" + version: 2.2.1 + resolution: "serve-static@npm:2.2.1" dependencies: encodeurl: ^2.0.0 escape-html: ^1.0.3 parseurl: ^1.3.3 send: ^1.2.0 - checksum: 74f39e88f0444aa6732aae3b9597739c47552adecdc83fa32aa42555e76f1daad480d791af73894655c27a2d378275a461e691cead33fb35d8b976f1e2d24665 + checksum: dd71e9a316a7d7f726503973c531168cfa6a6a56a98d5c6b279c4d0d41a83a1bc6900495dc0633712b95d88ccbf9ed4f4a780a4c4c00bf84b496e9e710d68825 languageName: node linkType: hard @@ -11291,6 +10887,16 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^7.1.0": + version: 7.1.2 + resolution: "slice-ansi@npm:7.1.2" + dependencies: + ansi-styles: ^6.2.1 + is-fullwidth-code-point: ^5.0.0 + checksum: 75f61e1285c294b18c88521a0cdb22cdcbe9b0fd5e8e26f649be804cc43122aa7751bd960a968e3ed7f5aa7f3c67ac605c939019eae916870ec288e878b6fafb + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -11299,9 +10905,9 @@ __metadata: linkType: hard "smol-toml@npm:^1.5.2": - version: 1.5.2 - resolution: "smol-toml@npm:1.5.2" - checksum: 75b7e8482151cbe48be094de205631502d5694c2a7d968446799e8b988b4105bd6efd3b6a986baa40d9e9b47cbb2daada21a302901a618793aabd35a670f195e + version: 1.6.0 + resolution: "smol-toml@npm:1.6.0" + checksum: e731aff4c52ff6f5401bc35f78643c30804c6957087a530d0d841b95266e6650a588cc8e59662872312d021aafcea8026372fa230cf6ba8b32a9c8f4c1a51cdf languageName: node linkType: hard @@ -11434,12 +11040,12 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^12.0.0": - version: 12.0.0 - resolution: "ssri@npm:12.0.0" +"ssri@npm:^13.0.0": + version: 13.0.0 + resolution: "ssri@npm:13.0.0" dependencies: minipass: ^7.0.3 - checksum: ef4b6b0ae47b4a69896f5f1c4375f953b9435388c053c36d27998bc3d73e046969ccde61ab659e679142971a0b08e50478a1228f62edb994105b280f17900c98 + checksum: 9705dff9e686b11f3035fb4c3d44ce690359a15a54adcd6a18951f2763f670877321178dc72c37a2b804dba3287ecaa48726dbd0cff79b2715b1cc24521b3af3 languageName: node linkType: hard @@ -11459,7 +11065,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:^2.0.1, statuses@npm:~2.0.2": +"statuses@npm:^2.0.1, statuses@npm:^2.0.2, statuses@npm:~2.0.2": version: 2.0.2 resolution: "statuses@npm:2.0.2" checksum: 6927feb50c2a75b2a4caab2c565491f7a93ad3d8dbad7b1398d52359e9243a20e2ebe35e33726dee945125ef7a515e9097d8a1b910ba2bbd818265a2f6c39879 @@ -11494,6 +11100,13 @@ __metadata: languageName: node linkType: hard +"string-argv@npm:^0.3.2": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 8703ad3f3db0b2641ed2adbb15cf24d3945070d9a751f9e74a924966db9f325ac755169007233e8985a39a6a292f14d4fee20482989b89b96e473c4221508a0f + languageName: node + linkType: hard + "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -11527,7 +11140,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^8.1.0": +"string-width@npm:^8.0.0, string-width@npm:^8.1.0": version: 8.1.0 resolution: "string-width@npm:8.1.0" dependencies: @@ -11595,9 +11208,9 @@ __metadata: linkType: hard "strnum@npm:^2.1.0": - version: 2.1.1 - resolution: "strnum@npm:2.1.1" - checksum: 566139b218ef13bdde2a69c744852ac41ea167588f624d46c3b3bebb5d1d1775c55bca4702a0ad2a6a66eb4b3b7de4cbbc83e8d40c5835feabebf6f9cc468993 + version: 2.1.2 + resolution: "strnum@npm:2.1.2" + checksum: 755e8327ee68201d700169ceee097ea52da7b675f4521442a8dbd1517021f89a91399213c446d1bf3d1123ca1896a76f0ff076d04c88ffe6056e78828ce6f60a languageName: node linkType: hard @@ -11748,7 +11361,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^7.4.0, tar@npm:^7.4.3": +"tar@npm:^7.4.0, tar@npm:^7.5.2": version: 7.5.2 resolution: "tar@npm:7.5.2" dependencies: @@ -11778,8 +11391,8 @@ __metadata: linkType: hard "tedious@npm:^19.1.3": - version: 19.1.3 - resolution: "tedious@npm:19.1.3" + version: 19.2.0 + resolution: "tedious@npm:19.2.0" dependencies: "@azure/core-auth": ^1.7.2 "@azure/identity": ^4.2.1 @@ -11791,7 +11404,7 @@ __metadata: js-md4: ^0.3.2 native-duplexpair: ^1.0.0 sprintf-js: ^1.1.3 - checksum: bc84a823e8646e538ad3b482772b80366f0264d00b5a84d3880f1dfd8d8123af8d960b97c7b655aac66236a30c8608687fad2aebc6a3b6e0410566912f60256b + checksum: 5ec78a8b08385310a2961dacee56ff947cdd1c968aa3db27bedf7a7b743ff719613f52111dac84ce0f22928d2af00c29a30ef6a1a827cd369566610a58987c90 languageName: node linkType: hard @@ -11803,8 +11416,8 @@ __metadata: linkType: hard "terser-webpack-plugin@npm:^5.3.11": - version: 5.3.14 - resolution: "terser-webpack-plugin@npm:5.3.14" + version: 5.3.16 + resolution: "terser-webpack-plugin@npm:5.3.16" dependencies: "@jridgewell/trace-mapping": ^0.3.25 jest-worker: ^27.4.5 @@ -11820,7 +11433,7 @@ __metadata: optional: true uglify-js: optional: true - checksum: 13a1e67f1675a473b18d25cb0ce65c3f0a19b5e9a93213a99ea61dc4ca996ea93aa17a221965b526f5788d242836a8249ad00538fbb322e25cb69076eb55feab + checksum: 4a9ba15a0917fa0de565f6d722cac1c5291fbb517a9afe3a2cce7edf851f0e02ee44ea45e2547aeb4fb7d599df3f1ccb04ba405879839d5425481c7180655679 languageName: node linkType: hard @@ -12277,12 +11890,12 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-filename@npm:4.0.0" +"unique-filename@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-filename@npm:5.0.0" dependencies: - unique-slug: ^5.0.0 - checksum: 6a62094fcac286b9ec39edbd1f8f64ff92383baa430af303dfed1ffda5e47a08a6b316408554abfddd9730c78b6106bef4ca4d02c1231a735ddd56ced77573df + unique-slug: ^6.0.0 + checksum: a5f67085caef74bdd2a6869a200ed5d68d171f5cc38435a836b5fd12cce4e4eb55e6a190298035c325053a5687ed7a3c96f0a91e82215fd14729769d9ac57d9b languageName: node linkType: hard @@ -12295,12 +11908,12 @@ __metadata: languageName: node linkType: hard -"unique-slug@npm:^5.0.0": - version: 5.0.0 - resolution: "unique-slug@npm:5.0.0" +"unique-slug@npm:^6.0.0": + version: 6.0.0 + resolution: "unique-slug@npm:6.0.0" dependencies: imurmurhash: ^0.1.4 - checksum: 222d0322bc7bbf6e45c08967863212398313ef73423f4125e075f893a02405a5ffdbaaf150f7dd1e99f8861348a486dd079186d27c5f2c60e465b7dcbb1d3e5b + checksum: ad6cf238b10292d944521714d31bc9f3ca79fa80cb7a154aad183056493f98e85de669412c6bbfe527ffa9bdeff36d3dd4d5bccaf562c794f2580ab11932b691 languageName: node linkType: hard @@ -12383,9 +11996,9 @@ __metadata: linkType: hard "validator@npm:^13.15.20, validator@npm:^13.15.23": - version: 13.15.23 - resolution: "validator@npm:13.15.23" - checksum: 7ac57d4c56de04cd831c997f2e06ded4862a4cf8541ac982c7d2a6a6aa10b833af20b64f1b0c6a92bae21698db44b1044f32eb2f2ce50823138ab95d4c4886e9 + version: 13.15.26 + resolution: "validator@npm:13.15.26" + checksum: 2f9151d5b37b1ccf370fb547559ca197e40517e9c08bbea55997d3607b573edce0b1082640912dcea1656648d51271d70df37b95a15d039a0bc0033a66f77e22 languageName: node linkType: hard @@ -12419,12 +12032,12 @@ __metadata: linkType: hard "watchpack@npm:^2.4.4": - version: 2.4.4 - resolution: "watchpack@npm:2.4.4" + version: 2.5.0 + resolution: "watchpack@npm:2.5.0" dependencies: glob-to-regexp: ^0.4.1 graceful-fs: ^4.1.2 - checksum: 469514a04bcdd7ea77d4b3c62d1f087eafbce64cbc728c89355d5710ee01311533456122da7c585d3654d5bfcf09e6085db1a6eb274c4762a18e370526d17561 + checksum: eadf369edc781d69acf47713dd889ac2e8e7b25827f121a3514a531d73f50ff40ff2d8f050184fbb00007e9f931e9a07291433a430e739cd5c4fea6a324c7aca languageName: node linkType: hard @@ -12574,14 +12187,14 @@ __metadata: languageName: node linkType: hard -"which@npm:^5.0.0": - version: 5.0.0 - resolution: "which@npm:5.0.0" +"which@npm:^6.0.0": + version: 6.0.0 + resolution: "which@npm:6.0.0" dependencies: isexe: ^3.1.1 bin: node-which: bin/which.js - checksum: 6ec99e89ba32c7e748b8a3144e64bfc74aa63e2b2eacbb61a0060ad0b961eb1a632b08fb1de067ed59b002cec3e21de18299216ebf2325ef0f78e0f121e14e90 + checksum: df19b2cd8aac94b333fa29b42e8e371a21e634a742a3b156716f7752a5afe1d73fb5d8bce9b89326f453d96879e8fe626eb421e0117eb1a3ce9fd8c97f6b7db9 languageName: node linkType: hard @@ -12655,7 +12268,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^9.0.2": +"wrap-ansi@npm:^9.0.0, wrap-ansi@npm:^9.0.2": version: 9.0.2 resolution: "wrap-ansi@npm:9.0.2" dependencies: @@ -12742,6 +12355,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.8.1": + version: 2.8.2 + resolution: "yaml@npm:2.8.2" + bin: + yaml: bin.mjs + checksum: 5ffd9f23bc7a450129cbd49dcf91418988f154ede10c83fd28ab293661ac2783c05da19a28d76a22cbd77828eae25d4bd7453f9a9fe2d287d085d72db46fd105 + languageName: node + linkType: hard + "yargs-parser@npm:21.1.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" @@ -12825,8 +12447,8 @@ __metadata: linkType: hard "zod@npm:^4.1.11": - version: 4.1.13 - resolution: "zod@npm:4.1.13" - checksum: e5459280d46567df0adc188b0c687d425e616a206d4a73ee3bacf62d246f5546e24ef45790c7c4762d3ce7659c5e41052a29445d32d0d272410be9fe23162d03 + version: 4.2.1 + resolution: "zod@npm:4.2.1" + checksum: 7ef4a6507713fb62e7659513f18e75819a602269a9f252296054224ef121c7b94cbe9806e0d5a76ef070949e771eee5b8d9710c9954ee0743621c4f0cbc9d673 languageName: node linkType: hard